Java MyBatis(一)--- 注解和XML的使用
文章目录
- MyBatis
- MyBatis的使用
- MyBatis的写法(注解)
- 企业建表的规范
- 单元测试
- 使用MyBatis可能遇到的问题
- 配置MyBatis相关日志
- 传递参数
- 总结
- MyBatis的增删改查
- 增
- 删
- 改
- 查
- MyBatis的写法(XML)
- 常见问题
- xml写法的使用
- 增
- 删
- 改
- 查
MyBatis
MyBatis 是一个持久层框架,和Spring没有任何关系,只是SpringBoot把MyBatis集成过来了
- SQL语句
- 数据库对象和Java对象映射
- MyBatis是⼀款优秀的 持久层 框架,用于简化JDBC的开发
MyBatis的使用
最朴素的用法:
类:包含属性
UserInfo.java
@Data
public class UserInfo {// 添加用户信息private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phono;private String deleteFlag;private Date createTime;private Date updateTime;
}
接口:具体实现
UserInfoMapper.java
@Mapper
public interface UserInfoMapper {@Select("select * from user_info")List<UserInfo> selectAll();
}
检测接口是否正确
UserInfoController.java
// 检测接口是否正确
@RestController
public class UserInfoController {@Autowiredprivate UserInfoMapper userInfoMapper;@RequestMapping("/selectAll")List<UserInfo> selectAll(){return userInfoMapper.selectAll();}
}
配置文件:
application.yml
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
MyBatis的写法(注解)
- xml
- 注解
企业建表的规范
- 需要具备三个字段
(1) id
(2) 创建时间
(3) 更新时间
哪怕表里只有一个字段,比如userid,也需要加上这三个字段
1.字段名/表名 全部小写
比如这张表:
2. delete flag,逻辑删除和物理删除的概念
逻辑删除:指从逻辑上进行数据删除(比如设置为0是删除,设置为1是不删除)
物理删除:从硬盘上进行数据删除(delete,真就删除了)
单元测试
- 在需要写测试单元的类中,右键点击generate,选择Test
这个就是需要测试的类:
@Mapper
public interface UserInfoMapper {// 拿到全部的信息@Select("select * from user_info")List<UserInfo> selectAll();// 拿到一条信息@Select("select * from user_info where id = 4")UserInfo selectOne();
}
会自动帮我们生成测试代码(点击红色框框中的内容):
2. 对方法的详细解释:
@SpringBootTest(在测试文件中)不和SpringBoot在一个文件下,所以引入这个用于启动Spring容器
@Slf4j
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@BeforeEachvoid setUp() {log.info("setUp");}@AfterEachvoid tearDown() {log.info("After");}@Testvoid selectAll() {List<UserInfo> list = userInfoMapper.selectAll();log.info(list.toString());}
}
使用MyBatis可能遇到的问题
- 没有配置数据库相关信息:
- 账号密码错误:
- 数据库错误:
- 表不存在:
- 字段错误:
配置MyBatis相关日志
- 在Mybatis当中我们可以借助日志, 查看到sql语句的执行、执行传递的参数以及执行结果,在配置文件中进行配置即可
mybatis:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
使用配置的效果(打印sql语句的详细信息):
传递参数
- 如果只有一个参数,SQL的名称可以为任意的,它都能找到对应的,建议命名为同一个名字的参数(更有利于读)
- 也可以对参数进行重命名(将id命名为了userId)
// 真正写代码的地方
@Mapper
public interface UserInfoMapper {// 拿到全部的信息@Select("select * from user_info")List<UserInfo> selectAll();// 拿到一条信息@Select("select * from user_info where id = #{id11123}")UserInfo selectOne(Integer id);@Select("select * from user_info where id = #{userId}")UserInfo selectOne2(@Param("userId") Integer id);
}// 测试代码(单元测试)
@Slf4j
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@BeforeEachvoid setUp() {log.info("setUp");}@AfterEachvoid tearDown() {log.info("After");}@Testvoid selectAll() {List<UserInfo> list = userInfoMapper.selectAll();log.info(list.toString());}@Testvoid selectOne() {log.info(userInfoMapper.selectOne(1).toString());}@Testvoid selectOne2() {log.info(userInfoMapper.selectOne(2).toString());}
}
总结
- 对上面内容的总结:
(1) 引入依赖
(2) 配置数据库
(3) 写MyBatis代码
1.注解
2.xml方式
- 打印Mybatis的日志的配置(日志都在调试的时候打印)
上面的配置建议只出现在开发环境中,不要出现在线上环境中
灰度发布:
MyBatis的增删改查
增
- 插入数据
// 增,返回的是受影响的行数
// 如果注解中字符串太长,使用 + 号进行拼接
@Insert("insert into user_info (username,password,age,gender,phone)" +"values(#{username},#{password},#{age},#{gender},#{phone})")
Integer insert(UserInfo userInfo);// 测试代码
@Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("aaa");userInfo.setPassword("aaa");userInfo.setAge(10);userInfo.setGender(1);userInfo.setPhone("128472495839");Integer result = userInfoMapper.insert(userInfo);log.info("insert方法 {}: ",result);}
2. 如何获取自增id
比如:
使用@Options进行返回自增id
// 返回自增id// 主键:useGeneratedKeys,keyProperty表示把主键赋值给 “id”@Options(useGeneratedKeys = true,keyProperty = "id")Integer result = userInfoMapper.insert(userInfo);log.info("insert方法 {}: 自增id{}", result, userInfo.getId());
3. 对insert的参数进行重命名
参数如果为对象时,对参数进行重命名
如果对对对象进行重命名,应该写成下面这种写法,都加上重命名的对象的名字点属性
删
// 删@Delete("delete from user_info where id=#{id}")Integer delete(Integer id);// 测试
@Testvoid delete() {Integer result = userInfoMapper.delete(5);log.info("result: ",result);}
改
// 改@Update("update user_info set age =#{age} where id = #{id}")Integer update(UserInfo userInfo);// 测试
@Testvoid update() {UserInfo userInfo = new UserInfo();userInfo.setAge(8);userInfo.setId(6);Integer result = userInfoMapper.update(userInfo);// 通过影响的行数,判定程序执行成功,还是失败if(result > 0){System.out.println("执行成功!");}}
查
- 结果映射
MyBatis 会自动的根据数据库的字段名和Java对象的属性名,进行映射,如果名称一样,就进行赋值
比如:
字段的映射:
字段不一样出现的错误:
解决方法:
(1) 对mysql查询的结果进行重命名
企业开发中,尽量不要使用 * ,需要查询哪些字段,就写哪些字段,如果需要全量的字段,就全部写完
如果出现sql的错误,把sql的代码复制到你写mysql的地方,更容易观察到错误
(2) 使用@Result注解
如果别的方法,也要使用这上面的定义呢?
该如果实现?如何复用Results的定义?
(3) 如何再一次简化上面的方法,不用再写这些字段和属性的映射
使用配置的方式,自动转驼峰,只需要添加配置就行,其它都不需要修改
在yml配置文件中配置:
mybatis:configuration:map-underscore-to-camel-case: true #配置驼峰⾃动转换
MyBatis的写法(XML)
- 需要配置数据库(和注解的配置是一样的)
- 指明xml的路径
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
mapper-locations: classpath:mapper/**Mapper.xml
// ** 表示可以找到所有以Mapper.xml结束的文件
注解和xml的方式是可以共存的
- 写xml的实现
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.example.demo.mapper.UserInfoMapper">
</mapper>
使用xml:
UserInfoXMLMapper.xml
接口的命名:
UserInfoXMLMapper
测试selectAll()方法:
要实现的方法名称:
返回的类型:
常见问题
出现的错误:
可能的三种原因:
- xml和接口定义的方法名称不一致
2. mapper的路径配置和xml的路径不一致
3. xml namespace写错了
xml写法出现dataSource这个错误,基本上是配置文件的格式有问题
xml写法的使用
增
-
使用:
-
获取插入数据的自增id
-
对参数进行重命名
方法名和修改的对象名保持一样
删
可以比对配置代码之间的差异
在线比对工具
- 删除
改
- 修改
查
结果映射的三种解决方式:
- sql字段别名(as)
- 定义Result
- 配置自动转驼峰
方式1和方式3,xml也是适用的
定义 Result