使用 MyBatis 需要导入依赖(MyBatis 和 MySQL(数据库都行)),和配置 yml 文件。导入对应的依赖比较简单,所以下面只给出 yml 文件的配置。
yml 文件配置如下。
下面用中文填写(除了注释)的都是要根据自己的情况来填写的。
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/对应数据库名称?characterEncoding=utf8&useSSL=false
username: root
password: 对应数据库的密码(如果是纯数字记得加上单引号)
driver-class-name: com.mysql.cj.jdbc.Driver
mvc:
favicon:
enable: false
profiles:
active: dev
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
MyBatis 有两种实现方式。(1)注解(2)xml 文件实现。
一、普通 SQL
1.1 注解实现:
注解实现,其实就是在对应的注解里面写上 SQL 语句即可。
1.1.1 参数传递:
需求:查找 id=4 的用户,对应的 SQL 就是:select * from userinfo where id=4。
@Select("select username, `password`, age, gender, phone from userinfo where id = 4")
UserInfo queryById();
但是这样的话,只能查找 id=4 的数据,所以 SQL 语句中的 id 值不能写成固定数值,需要变为动态的数值。
解决方法:在 queryById 方法中添加一个参数(id),将方法中的参数,传给 SQL 语句。
使用#{}的方式获取方法中的参数。注意:#{}里面的名称需要和方法参数名称一致(如果方法参数是一个对象,那么#{}里面的值,要和对象的属性名称一样。)
@Select("select username, `password`, age, gender, phone from userinfo where id= #{id} ")
UserInfo queryById(Integer id);
如果 mapper 接口方法形参只有一个普通类型的参数,#{…}里面的属性名可以随便写,如:#{id}、# {value}。建议和参数名保持一致。
添加测试用例:
@Test
void queryById() {
UserInfo userInfo = userInfoMapper.queryById(4);
System.out.println(userInfo);
}
运行结果:
也可以通过 @Param ,设置参数的别名,如果使用 @Param 设置别名,#{…}里面的属性名必须和 @Param 设置的一样。
@Select("select username, `password`, age, gender, phone from userinfo where id = #{userid} ")
UserInfo queryById(@Param("userid") Integer id);
如果参数是对象,设置了 @Param 属性,#{…} 需要使用 别名.属性 来获取。
@Insert("insert into userinfo(username,`password`,age,gender,phone) " +
"values(#{gobeyye.username},#{gobeyye.password}" +
",#{gobeyye.age},#{gobeyye.gender},#{gobeyye.phone})")
Integer insertUserInfo1(@Param("gobeyye") UserInfo userInfo);
1.1.2 增(@Insert):
SQL 语句:
insert into userinfo (username, `password`, age, gender, phone) values
("zhaoliu","zhaoliu",19,1,"18700001234")
把 SQL 中的常量替换为动态的参数:
Mapper 接口的方法:
@Insert("insert into userinfo (username, `password`, age, gender, phone) values (#{username},#{password},#{age},#{gender},#{phone})")
Integer insert(UserInfo userInfo);
直接使用 UserInfo 对象的属性名来获取参数。
测试代码:
@Test
void insertUesrInfo1() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("zhaoliu");
userInfo.setPassword("zhaoliu");
userInfo.setAge(19);
userInfo.setGender(1);
userInfo.setPhone("18700001234");
userInfoMapper.insertUesrInfo1(userInfo);
}
运行结果:下面这个运行结果,需要导入日志配置。
返回主键:
如果想要拿到自增 id(主键一般默认是 id),需要在 Mapper 接口的方法上添加一个 Options 的注解。
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into userinfo (username, age, gender, phone) values (#{userinfo.username},#{userinfo.age},#{userinfo.gender},#{userinfo.phone})")
Integer insert(@Param("userinfo") UserInfo userInfo);
-
useGeneratedKeys:这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
-
keyProperty:指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素,设置它的值,默认值:未设置(unset)。
注意:设置 useGeneratedKeys = true 之后,方法返回值依然是受影响的行数,自增 id 会设置在上述 keyProperty 指定的属性中。
1.1.3 删(@Delete):
SQL 语句:
问号是占位符的意思,方便下面写代码,不是 SQL 语法支持的。
delete from userinfo where id = ?
Mapper 接口的方法:
@Delete("delete from userinfo where id = #{id}")
void delete(Integer id);
1.1.4 改(@Update):
SQL 语句:
update userinfo set username="zhaoliu" where id=5
Mapper 接口的方法:
@Update("update userinfo set username=#{username} where id=#{id}")
void update(UserInfo userInfo);
1.1.5 查(@Select):
SQL 语句:
@Select("select id, username, `password`, age, gender, phone, delete_flag,
create_time, update_time from userinfo")
Mapper 接口的方法:
@Select("select id, username, `password`, age, gender, phone, delete_flag, create_time, update_time from userinfo")
List<UserInfo> queryAllUser();
查询结果:
从运行结果上可以看到,我们 SQL 语句中,查询了 delete_flag,create_time,update_time 但是这几个属性却没有赋值。
原因分析:
当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性。
观察下图: