MyBatis XML配置从零开始:高效处理数据库映射与查询!!!
目录
- 一、前言
- 二、MyBatis XML 方式实现增删改查
- 2.1 配置连接字符串和MyBatis
- 2.2 持久层代码
- 2.3 单元测试
- 2.4 增(insert)
- 2.5 删(delete)
- 2.6改(update)
- 2.7 查(select)
- 2.8 总结
一、前言
在上一篇博客中,我们详细探讨了 MyBatis 注解方式 的使用,并通过实际案例展示了如何快速实现数据库的增删改查操作。MyBatis 作为一款功能强大的 ORM 框架,不仅支持通过注解配置数据库操作,还支持通过 XML 文件进行配置。两种配置方式各有优劣,适用于不同的场景。
对于小型项目或快速开发,注解方式的确非常简洁高效。但在实际开发中,尤其是需要处理复杂 SQL 逻辑或希望代码与数据库操作分离的场景中,XML 方式 的优势会更加明显。XML 方式通过将 SQL 语句独立到 XML 文件中,不仅提高了代码的可维护性,还为动态 SQL、复杂查询等场景提供了更大的灵活性。
本文将围绕 MyBatis XML 方式 展开,详细讲解如何通过 XML 文件实现增删改查操作,并探讨其与注解方式的区别和优劣。通过本文,你将能够掌握 MyBatis 的两种核心配置方式,并根据实际需求灵活选择适合的实现方案。
上一篇博客文章:
MyBatis注解方式:从CRUD到数据映射的全面解析
二、MyBatis XML 方式实现增删改查
2.1 配置连接字符串和MyBatis
此步骤需要进行两项设置,数据库连接字符串设置和 MyBatis 的 XML 文件配置。这篇文章以.yml文件来进行配置
# 数据库连接配置
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
# 配置mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
mapper-locations: classpath:mapper/**Mapper.xml
configuration:
# 配置打印 MyBatis日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true #配置驼峰⾃动转换
2.2 持久层代码
添加mapper接口
数据持久层接口定义(UserInfoMapperXML)
import com.sliqvers.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserInfoMapperXML {
List<UserInfo> selectAll();
}
定义一个实体类(UserInfo)
@Data
public class UserInfo {
private Integer id;
private String username;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}
创建数据库和表
-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使用数据数据
USE mybatis_test;
-- 创建表[用户表]
DROP TABLE IF EXISTS user_info;
CREATE TABLE `user_info` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`username` VARCHAR ( 127 ) NOT NULL,
`password` VARCHAR ( 127 ) NOT NULL,
`age` TINYINT ( 4 ) NOT NULL,
`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-女 0-默认',
`phone` VARCHAR ( 15 ) DEFAULT NULL,
`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
-- 添加用户信息
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );
创建UserInfoXMLMapper.xml, 路径参考yml中的配置
添加UserIndoXMLMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sliqvers.mapper.UserInfoMapperXML">
<select id="selectAll" resultType="com.sliqvers.model.UserInfo">
</select>
</mapper>
安装一个插件:
安装一个插件MyBatisX,这个插件的作用可以减少代码的繁琐,可以直接在配置了文件之间进行跳转。
2.3 单元测试
这里使用快捷键生成测试代码。具体怎么操作的上一篇文章有写,这里就不再重复写了。
@SpringBootTest
class UserInfoMapperXMLTest {
@Autowired
private UserInfoMapperXML userInfoMapperXML;
@Test
void selectAll() {
userInfoMapperXML.selectAll().stream().forEach(x-> System.out.println(x));
}
}
2.4 增(insert)
增加之前:
UserInfoMapper.xml 代码:
<insert id="insertUser">
insert into user_info(username,'password',age) values(#{username},#{password},#{age})
</insert>
UserInfoMapperXML.java 代码
@Mapper
public interface UserInfoMapperXML {
List<UserInfo> selectAll();
Integer insertUser(UserInfo userInfo);
}
测试代码
@Test
void insertUser() {
UserInfo userInfo=new UserInfo();
userInfo.setUsername("Alice");
userInfo.setPassword("123456");
userInfo.setAge(45);
Integer result = userInfoMapperXML.insertUser(userInfo);
System.out.println("插入成功");
System.out.println("影响行数:"+ result + ", id:"+ userInfo.getId());
}
运行结果:
查看数据库是否插入数据成功:
可以看到成功了。
然后可以看到在控制台没有获取数据的id,那么我们怎么获取呢?
我们把UserInfoMapper.xml
代码改一下稍微:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into user_info (username, `password`, age) VALUES (#{username}, #{password}, #{age})
</insert>
再运行一下测试类:
可以看到id获取成功了。
再观察数据库是否数据插入成功:
2.5 删(delete)
UserInfoMapper 接口:
Integer deleteUser(Integer id);
UserInfoMapper.xml 实现:
<delete id="deleteUser">
delete from user_info where id=#{id}
</delete>
测试类:
@Test
void deleteUser() {
userInfoMapperXML.deleteUser(9);
System.out.println("删除成功");
}
运行结果:
删除之前:
删除之后:
2.6改(update)
UserInfoMapper 接口:
Integer updateByConfition(UserInfo userInfo);
UserInfoMapper.xml 实现:
<update id="updateByConfition">
update user_info set username=#{username} where id=#{id}
</update>
测试类:
@Test
void updateByConfition() {
UserInfo userInfo=new UserInfo();
userInfo.setUsername("Bob");
userInfo.setId(3);
userInfoMapperXML.updateByConfition(userInfo);
}
运行结果:
更新之前:
更新之后:
2.7 查(select)
UserInfoMapper 接口:
List<UserInfo> selectAll();
UserInfoMapper.xml 实现:
<select id="selectAll" resultType="com.sliqvers.model.UserInfo">
select * from user_info
</select>
测试类:
@Test
void selectAll() {
userInfoMapperXML.selectAll().stream().forEach(x-> System.out.println(x));
}
运行结果:
但是这里会有一个问题:我们先把Mybatis的日志配置取消掉为了便于观察:
启动项目:
我们可以看到这个这里这个没有获取到数据库表的数据。
这个原因是什么呢?
这是数据库表里的字段名字:
再看java代码当中的字段名字:
可以看到他们是有区别的。当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性那么怎么解决这个问题呢?
有三种方法:
1.起别名:
@Select("select id, username,`password`, age, gender, phone, " +
"delete_flag as deleteFlag, create_time as createTime, update_time as updateTime" +
" from user_info")
2.结果映射:
@Results(id = "BaseMap", value = {
@Result(column = "delete_flag", property = "deleteFlag"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime")
})
3.驼峰命名(推荐):
mybatis:
configuration: # 配置打印 MyBatis日志
map-underscore-to-camel-case: true #配置驼峰⾃动转换
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.8 总结
篇博客详细介绍了如何通过MyBatis的XML配置实现增删改查操作,特别是在查询功能的实现上,着重讲解了三种高效的数据映射方法:驼峰转换、结果映射和起别名。文章从基础知识入手,逐步展开,帮助读者深入理解MyBatis的核心配置技巧,提升数据库操作的效率和代码的可维护性。