写mybatis代码的方法有两种:
- 注解
- xml方式
本篇就介绍注解的方式
mybatis的操作主要有增删改查,下面进行一一讲解。
目录
一、参数传递
需求:查找id=4的用户,对应的sql就是: select * from user_info where id=4
java
@Select("select username, `password`, age, gender, phone from user_info where
id= 4 ")
UserInfo queryById();
结果集返回一条记录该记录与与UserInfo构成映射返回UserInfo类型的一个对象。
只能查找id=4的数据,这样代码写死了,需要变为动态的数值。
这时可以通过在queryById方法中添加一个参数{id},将方法中的参数,传给sql语句,使用#{}的方式获取方法中的参数。
java
@Select("select username, `password`, age, gender, phone from user_info where
id= #{id} ")
UserInfo queryById(Integer id);
注意:如果mapper接口方法形参++只有一个++普通类型的参数,#{...}里面的属性名可以随便写,如:#{id}、#{value},形参会与#{}里面的参数进行绑定,但是建议和参数名一致。
添加测试用例:
java
@Test
void queryById() {
UserInfo userInfo = userInfoMapper.queryById(4);
System.out.println(userInfo);
}
运行测试用例:

当然也可以通过@Param 设置参数别名,如果使用@Param设置别名 ,#{}里面参数的名字要和@Param设置的参数名一致。
java
@Select("select username, `password`, age, gender, phone from user_info where
id= #{userid} ")
UserInfo queryById(@Param("userid") Integer id);
二、增(Insert)
SQL语句:
sql
insert into user_info (username, `password`, age, gender, phone) values
("zhaoliu","zhaoliu",19,1,"18700001234");
- 把sql中的常量替换成动态的参数
Mapper接口:
sql
@Insert("insert into user_info (username, `password`, age, gender, phone)
values (#{username},#{password},#{age},#{gender},#{phone})")
Integer insert(UserInfo userInfo);
- 这里可以用UserInfo对象来获取参数
测试代码:
java
@Test
void insert() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("zhaoliu");
userInfo.setPassword("zhaoliu");
userInfo.setGender(2);
userInfo.setAge(21);
userInfo.setPhone("18612340005");
userInfoMapper.insert(userInfo);
}
运行之后,观察数据库执行结果

- 如果设置了@Param 属性 ,#{}需要使用 参数.属性 来获取。
java
@Insert("insert into user_info (username,password,age,gender,phone)"+
"values (#{UI.username},#{UI.password},#{UI.age},#{UI.gender},#{UI.phone})")
Integer insert(@Param("UI") UserInfo userInfo);
运行后观察结果:

- 返回主键
Insert语句默认返回的是 受影响的行数。
但有些情况下,数据插入之后,还需要有后续的关联操作,需要获取到新插入数据的id。
比如订单系统。
当我们下完订单之后,需要通知物流系统,库存系统,结算系统,这时候就需要拿到订单的id。
如果想要拿到自增id,需要在Mapper接口的方法上添加一个Options的注解,。
java
//获取自动生成的id,并设置返回的id
@Options(useGeneratedKeys = true,keyProperty = "id")
@Insert("insert into user_info (username,password,age,gender,phone)"+
"values (#{UI.username},#{UI.password},#{UI.age},#{UI.gender},#{UI.phone})")
Integer insert(@Param("UI") UserInfo userInfo);
useGeneratedKeys:这会令Mybatis使用JDBC的getGenerateKeys方法来取出由数据库内部生成的主键(自增主键),默认值:false
keyProperty:指定能够唯一识别的对象的属性,Mybatis会使用getGenerateKeys的返回值或insert语句的selectKey 子元素设置 keyProperty的值,默认值:未设置。

测试代码:
java
@Test
void insert() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("zhao77");
userInfo.setPassword("zhao");
userInfo.setGender(1);
userInfo.setAge(100);
userInfo.setPhone("18612344705");
Integer result = userInfoMapper.insert(userInfo);
log.info("测试结果"+result+"自增ID"+userInfo.getId());
}
运行结果:

注意:如果没有Options注解,即使测试方法创建完对象之后,使用getId方法也是不能够获取到自增id的。

三、删(Delete)
sql语句:
sql
delete from user_info where id=6
- 把sql中的常量替换为动态的参数。
Mapper接口
java
@Delete("delete from user_info where id = #{id}")
void delete(Integer id);
四、改(Update)
sql语句:
sql
update user_info set username="zhaoliu" where id=5
- 把sql中的常量替换为动态的参数
Mapper接口
sql
@Update("update user_info set username=#{username} where id=#{id}")
void update(UserInfo userInfo);
五、查(Select)
上面的参数传递中讲述了查询的例子,但是如果实体类的属性名和数据库字段名不一致时,可以采取下面的措施:
1.起别名
2.结果映射
3.利用驼峰命名,配置驼峰命名配置
1.起别名
在sql语句中,给列名起别名,保持别名和 实体类属性名一样。
java
@Select("select id, username, `password`, age, gender, phone, delete_flag as
deleteFlag, " +
"create_time as createTime, update_time as updateTime from user_info")
public List<UserInfo> queryAllUser();
sql语句太长时,可以使用加号 +进行字符串拼接。
2.结果映射
使用@Result注解'
java
//这里的映射要与对象的属性一致,不然会报错,找不到
@Results(id = "BaseMap",value = {
@Result(column = "delete_flag",property = "deleteFlag"),
@Result(column = "create_time",property = "createTime"),
@Result(column = "update_time",property = "updateTime")
})
@Select("select * from user_info")
List<UserInfo> selectAll2();
如果有其他sql复用这种映射关系,我们可以给Result定义一个id,然后再搭配@ResultMap注解使用。
java
@Results(id = "BaseMap",value = {
@Result(column = "delete_flag",property = "deleteFlag"),
@Result(column = "create_time",property = "createTime"),
@Result(column = "update_time",property = "updateTime")
})
@Select("select * from user_info")
List<UserInfo> selectAll2();
//复用映射关系
@ResultMap(value = "BaseMap")
@Select("select *from user_info where id=4")
UserInfo selectById();
3.开启驼峰命名(推荐)
这种方式要满足下面的条件:
- 配置驼峰命名规则
.properties
java
#配置驼峰转换
mybatis.configuration.map-underscore-to-camel-case=true
.yml
java
mybatis:
configuration:
map-underscore-to-camel-case: true #配置驼峰自动转换
- 类中属性名为驼峰格式(createTime);表中字段名为蛇形格式(create_time)
其中Java代码中不做任何处理:
java
@Select("select id, username, `password`, age, gender, phone, delete_flag, " +
"create_time, update_time from user_info")
public List<UserInfo> queryAllUser();