MyBatis 本是 apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis 。
这篇文章主要介绍了 spring boot mybatis 全注解化的相关资料, 需要的朋友可以参考下
本文重点给大家介绍 spring boot mybatis 注解化的实例代码,具体内容大家参考下本文:
pom.xml
- <!-- 引入mybatis -->
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>1.3.0</version>
- </dependency>
- <!-- mybatis分页插件 -->
- <dependency>
- <groupId>com.github.pagehelper</groupId>
- <artifactId>pagehelper-spring-boot-starter</artifactId>
- <version>1.1.1</version>
- </dependency>
基本 SQL 操作
spring boot 已经自动实现了 mybatis 所有配置,直接写 dao 接口即可
- @Mapper
- public interface MybatisDao {
- @Select("select * from user where id = #{id}")
- public List<User> findById(User param);
@Mapper:声明一个 mybatis 的 dao 接口,会被 spring boot 扫描到
@Select:声明一个查询方法,相应的增删改使用 @Insert @Delete@Update
List<User>:返回集合。如果只返回一个结果,返回值是 User。如果是增删改方法返回值是 int
User param:传参,#{id} 就是 param 对象的 id 值
扫描 Mapper
- @MapperScan("hello.dao")
在配置类上添加以上注解,可以扫描 dao 包中的所有接口,替代在每个 dao 中写 @Mapper 注解,不过这样会提高耦合度。而 @Mapper 可以与 dao 自成一体,与 @Controller、@Service 遥相呼应,整体结构更优雅
驼峰命名
在 properties 中添加以下配置,在执行查询后,可以将数据库的 NN_NN 格式字段,在 java 结果集对象中自动转换成驼峰命名参数
- mybatis.configuration.mapUnderscoreToCamelCase = true
结果映射 @Results
如果结果集不是 JAVA 对象而是 Map,map 中的列名会和数据库中的 NN_NN 一样,是不会自动驼峰转换的。可以使用 @Result 来指明结果映射,同样也适用 JAVA 对象
- @Results({
- @Result(property="nnNn",column="NN_NN")
- })
- @Select("select * from user")
- public List<Map> findAll();
使用 List<Map> 不用去维护 pojo,适于用数据库字段不确定或经常变化的场景。但是程序的可读性、可维护性不如 List<User>
可复用的 @Results
声明时给 id 赋值为 user
- @Results(id="user",value={
- @Result(property="nnNn",column="NN_NN")
- })
在其他 方法中,重复使用 id 为 user 的结果映射
@ResultMap("user")
打印 SQL 日志到控制台
在 application.properties 中添加以下配置
logging.level. 你的包名. mybatis 接口包 = debug
执行 SQL 时,会在控制台打印 SQL 日志
第一行:==> 左边是执行 SQL 的接口及其方法,右边是执行语句
第二行:传参数 1,String 类型
第三行:查到一行数据
分页
首先要在 pom.xml 中引入文章开头的分页插件,分页逻辑写在 service 层。
- @Service
- @Transactional
- public class HelloServiceImpl {
- @Autowired
- MybatisDao mybatisDao;
- public void find(){
- //分页插件: 查询第1页,每页10行
- Page<User> page =PageHelper.startPage(1, 10);
- mybatisDao.findAll();
- //数据表的总行数
- page.getTotal();
- //分页查询结果的总行数
- page.size();
- //第一个User对象,参考list,序号0是第一个元素,依此类推
- page.get(0);
- }
执行原理:PageHelper.startPage 会拦截下一个 sql,也就是 mybatisDao.findAll() 的 SQL。并且根据当前数据库的语法,把这个 SQL 改造成一个高性能的分页 SQL,同时还会查询该表的总行数,具体可以看 SQL 日志。
PageHelper.startPage 和 mybatisDao.findAll() 最好紧跟在一起,中间不要有别的逻辑,否则可能出 BUG。
Page<User> page:相当于一个 list 集合,findAll() 方法查询完成后,会给 page 对象的相关参数赋值
回传 ID
假设数据库表的 ID 主键是自动增长的,现在添加一条数据,想要得到这条数据自动增长的 ID,方法如下
dao 层
useGeneratedKeys=true:获取数据库生成的主键
keyProperty="id":把主键值存入 User param 对象的 id 属性
- @Insert("insert into user(name) values(#{name})")
- @Options(useGeneratedKeys=true,keyProperty="id")
- public int add(User param);
service 层
- User user = new User();
- user.setName("tom");
- mybatisDao.add(user);
- System.out.println("回传ID值:" + user.getId());
控制台
存储过程
这是一个 mysql 存储过程,传入一个 id 值,根据这个 id 查询出 name 值并且做为传出参数
- DELIMITER $$
- CREATE PROCEDURE `hello`(IN id_in VARCHAR(10),OUT name_out VARCHAR(10))
- BEGIN
- SELECT NAME INTO name_out FROM USER WHERE id=id_in;
- END$$
- DELIMITER ;
dao 层
mode=IN:传入参数,就是 user.id
mode=OUT:传出参数,就是 user.name
StatementType.CALLABLE:说明这是一个存储过程
- @Select("call hello(#{id,mode=IN,jdbcType=VARCHAR},#{name,mode=OUT,jdbcType=VARCHAR})")
- @Options(statementType= StatementType.CALLABLE )
- public void call(User user);
service 层
- public void call() {
- User user = new User();
- user.setId("14");
- mybatisDao.call(user);
- System.out.println(user.getName());
执行结果
总结
以上所述是小编给大家介绍的 spring boot mybatis 全注解化,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 PHPERZ 网站的支持!
来源: http://www.phperz.com/article/17/1210/353306.html