MyBatis的基础操作

目录

一、打印日志

二、参数传递

三、基础CRUD操作

3.1 增(insert)

3.1.1 添加操作

3.1.2 返回主键

3.2 删(delete)

3.3 改(update)

3.4 查(select)


本篇博客衔接上篇内容:SpringBoot项目如何引入MyBatis?如何使用及操作数据库icon-default.png?t=N7T8https://blog.csdn.net/m0_60462557/article/details/140698434?spm=1001.2014.3001.5501

使用代码及示例皆是上篇内容的代码案例。

一、打印日志

在MyBatis当中我们可以借助日志,查看到sql语句的执行、执行传递的参数以及执行结果。在配置文件中配置即可:

yml文件:

mybatis:
 configuration: # 配置打印 MyBatis日志
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

properties文件:

#指定mybatis输出日志的位置, 输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

经过上述配置之后重新运行测试类,发现:

①. 查询语句
②. 传递参数及类型
③. SQL执行结果

二、参数传递

@Select("select username, `password`, age, gender, phone from userinfo where id= 4 ")
UserInfo queryById();

如果SQL语句中的id值设置为固定的数值,那么就只能查找id=固定数值的数据,那么如何解决这个问题呢?就需要在在queryById方法中添加一个参数(id),将方法中的参数,传给SQL语句。

1. 使用 #{} 的方式获取方法中的参数

@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);
}

运行结果:

2. 可以通过 @Param , 设置参数的别名, 如果使用 @Param 设置别名,#{...}里面的属性名必须和@Param 设置的一样。

@Select("select username, `password`, age, gender, phone from userinfo where id= #{userid} ")
UserInfo queryById(@Param("userid") Integer id);

三、基础CRUD操作

3.1 增(insert)

3.1.1 添加操作

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 insert() {
 UserInfo userInfo = new UserInfo();
 userInfo.setUsername("zhaoliu");
 userInfo.setPassword("zhaoliu");
 userInfo.setGender(2);
 userInfo.setAge(21);
 userInfo.setPhone("18612340005");
 userInfoMapper.insert(userInfo);
}

运行后,返回数据库查看,数据插入成功:

  如果设置了 @Param 属性, #{...} 需要使用参数属性来获取 
@Insert("insert into userinfo (username, `password`, age, gender, phone) values (#{userinfo.username},#{userinfo.password},#{userinfo.age},#{userinfo.gender},{userinfo.phone})")
Integer insert(@Param("userinfo") UserInfo userInfo);

3.1.2 返回主键

Insert 语句默认返回的是受影响的行数,但有些情况下, 数据插入之后, 还需要有后续的关联操作, 需要获取到新插入数据的id。如果想要拿到自增id, 需要在Mapper接口的方法上添加一个Options的注解。
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into userinfo (username, password, age, gender, phone) values (#{userinfo.username},#{userinfo.password},#{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)
测试代码:
@Test
void insert() {
 UserInfo userInfo = new UserInfo();
 userInfo.setUsername("zhaoliu");
 userInfo.setPassword("zhaoliu");
 userInfo.setGender(2);
 userInfo.setAge(21);
 userInfo.setPhone("18612340005");
 Integer count = userInfoMapper.insert(userInfo);
 System.out.println("添加数据条数:" +count +", 数据ID:" + userInfo.getId());
}

运行结果:(可以看到id被获取)

注意: 设置 useGeneratedKeys=true 之后, 方法返回值依然是受影响的行数, 自增  id 会设置在上述 keyProperty 指定的属性中。

3.2 删(delete)

SQL语句:

delete from userinfo where id=5;
把SQL中的常量替换为动态的参数:
Mapper接口:
@Delete("delete from userinfo where id = #{id}")
void delete(Integer id);

测试代码:

@Test
void delete() {
   System.out.println(userInfoMapper.delete(5));
 }

3.3 改(update)

SQL语句:

 update userinfo set username="zhaoliu" where id=5
把SQL中的常量替换为动态的参数:
Mapper接口:
@Update("update userinfo set username=#{username} where id=#{id}")
void update(UserInfo userInfo);

测试代码:

@Test
void update() {
   UserInfo userInfo = new UserInfo();
   userInfo.setId(10);
   userInfo.setPassword("123456");
   System.out.println(userInfoMapper.update(userInfo));
 }

3.4 查(select)

我们在上面查询时发现, 有几个字段是没有赋值的,只有Java对象属性和数据库字段一模一样时, 才会进行赋值。
如果将上述没有查询的数据进行查询:
@Select("select id, username, `password`, age, gender, phone, delete_flag, create_time, update_time from userinfo")
List<UserInfo> queryAllUser();

测试代码:

 @Test
    void queryAllUser() {
        userInfoMapper.queryAllUser().forEach(System.out::println);
    }

结果:

从运行结果上可以看到,SQL语句中, 查询了delete_flag, create_time, update_time,但是这几个属性却没有赋值.
MyBatis 会根据方法的返回结果进行赋值。
方法用对象 UserInfo接收返回结果, MySQL 查询出来数据为一条, 就会自动赋值给对象。
方法用List<UserInfo>接收返回结果, MySQL 查询出来数据为一条或多条时, 也会自动赋值给List。
但如果MySQL 查询返回多条, 但是方法使用UserInfo接收, MyBatis执行就会报错。
原因分析:
当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性。
解决办法:
  1. 起别名
  2. 结果映射
  3. 开启驼峰命名

1.  起别名

在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样。

@Select("select id, username, `password`, age, gender, phone, delete_flag as deleteFlag, " + "create_time as createTime, update_time as updateTime from userinfo")
  public List<UserInfo> queryAllUser();

SQL语句太长,就用“+”进行字符串拼接。

2. 结果映射

@Select("select id, username, `password`, age, gender, phone, delete_flag, create_time, update_time from userinfo")
@Results({
 @Result(column = "delete_flag",property = "deleteFlag"),
 @Result(column = "create_time",property = "createTime"),
 @Result(column = "update_time",property = "updateTime")
})
 List<UserInfo> queryAllUser();
如果其他SQL, 也希望可以复用这个映射关系, 可以给这个Results定义一个名称。
@Select("select id, username, `password`, age, gender, phone, delete_flag, 
create_time, update_time from userinfo")
@Results(id = "resultMap",value = {
 @Result(column = "delete_flag",property = "deleteFlag"),
 @Result(column = "create_time",property = "createTime"),
 @Result(column = "update_time",property = "updateTime")
})
List<UserInfo> queryAllUser();
@Select("select id, username, `password`, age, gender, phone, delete_flag, 
create_time, update_time " +
 "from userinfo where id= #{userid} ")
@ResultMap(value = "resultMap")
UserInfo queryById(@Param("userid") Integer id);
使用  id 属性给该 Results 定义别名, 使用  @ResultMap 注解来复用其他定义的 ResultMap。

3. 开启驼峰命名(推荐使用)

通常数据库列使用蛇形命名法进行命名(下划线分割各个单词),而 Java 属性一般遵循驼峰命名法约定。为了在这两种命名方式之间启用自动映射,需要将 mapUnderscoreToCamelCase 设置为 true。
添加配置:(yml文件)
mybatis:
 configuration:
  map-underscore-to-camel-case: true #配置驼峰自动转换
驼峰命名规则: abc_xyz => abcXyz
  • 表中字段名:abc_xyz
  • 类中属性名:abcXyz
java代码不做改变:
@Select("select id, username, `password`, age, gender, phone, delete_flag as deleteFlag, " + "create_time as createTime, update_time as updateTime from userinfo")
  public List<UserInfo> queryAllUser();
运行项目:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值