Spring Boot集成MyBatis访问数据库的方法
基于springboot开发的微服务应用,与MyBatis如何集成?
集成方法
可行的方法有:
1.基于XML或者JavaConfig,构建必需的对象,配置MyBatis。
2.使用MyBatis官方提供的组件,实现MyBatis的集成。
方法一
建议参考如下文章,完成集成的验证。
MyBatis学习之一、MyBatis简介与配置MyBatis+Spring+MySql
基于Spring+SpringMVC+Mybatis高性能web构建
spring与mybatis三种整合方法
MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
由于不是本文的重点,因此不附上样例。
方法二
有如下步骤:
- 修改pom.xml,增加软件依赖
org.mybatis.spring.boot mybatis-spring-boot-starter 1.2.0 mysql mysql-connector-java 5.1.21
- 修改application.yml,增加数据源的定义
spring:
datasource:
url:jdbc:mysql://localhost:3306/test
username:root
password:123456
driver-class-name:com.mysql.jdbc.Driver
- 修改application.yml,增加MyBatis的配置
mybatis:
type-aliases-package:com.example.domain.model
type-handlers-package:com.example.typehandler
configuration:
map-underscore-to-camel-case:true
default-fetch-size:100
default-statement-timeout:30
日志的配置
通过观察日志,可有效的分析MyBatis生成的SQL,检查SQL配置的正确性。
修改application.yml,增加如下配置
logging:
level:
net:
jackieathome:
db:
mapper:DEBUG
其中net.jackieathome.db.mapper下定义了访问数据库的mapper接口。
输出的日志样例如下
2017-04-1611:32:23.266DEBUG27801---[io-11002-exec-1]n.j.db.mapper.UserMapper.createUser :==> Preparing:insertinto`user`(id,name,password)values(?,?,?)
2017-04-1611:32:23.293DEBUG27801---[io-11002-exec-1]n.j.db.mapper.UserMapper.createUser :==>Parameters:id1492313542(String),null,null
2017-04-1611:32:23.366DEBUG27801---[io-11002-exec-1]n.j.db.mapper.UserMapper.createUser :<== Updates:1
2017-04-1611:32:23.372DEBUG27801---[io-11002-exec-1]n.j.db.mapper.UserMapper.findUserById :==> Preparing:select*from`user`whereid=?
2017-04-1611:32:23.373DEBUG27801---[io-11002-exec-1]n.j.db.mapper.UserMapper.findUserById :==>Parameters:id1492313542(String)
2017-04-1611:32:23.417DEBUG27801---[io-11002-exec-1]n.j.db.mapper.UserMapper.findUserById :<== Total:1
事务的使用
依据MyBatis的官方文档,允许用户将事务交给Spring来管理,使用编程和注解来控制事务。这里以注解方式来举例说明使用方法,样例代码如下:
1.mapper的定义,如下
packagenet.jackieathome.db.mapper;
importjava.util.List;
importorg.apache.ibatis.annotations.Mapper;
importorg.apache.ibatis.annotations.Param;
importnet.jackieathome.bean.User;
@Mapper
publicinterfaceUserMapper{
//创建用户
voidcreateUser(Useruser);
//查找用户
UserfindUserById(@Param("id")Stringid);
}
2.数据库访问的中间层代码,对上述mapper进行了封装。
使用@Transactional标记该类,表明该类的公有方法全部都启用了事务的支持。关于@Transactional的使用,可以参考相关的官方文档。
packagenet.jackieathome.dao;
importjava.util.ArrayList;
importjava.util.List;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importorg.springframework.transaction.annotation.Transactional;
importnet.jackieathome.bean.User;
importnet.jackieathome.db.mapper.UserMapper;
@Component
@Transactional
publicclassUserDao{
@Autowired
privateUserMapperuserMapper;
/**
*重复插入相同的用户数据,确认事务是否生效
*/
publicListcreateBatch(){
longtime=System.currentTimeMillis()/1000;
Useruser=null;
Listids=newArrayList<>();
Stringid="id"+time;
Stringname="name"+time;
Stringpassword="password"+time;
user=newUser();
user.setId(id);
user.setName(name);
user.setPassword(password);
userMapper.createUser(user);
ids.add(id);
user=newUser();
user.setId(id);
user.setName(name);
user.setPassword(password);
userMapper.createUser(user);
ids.add(id);
returnids;
}
}
3.业务层实现
packagenet.jackieathome.controller;
importjava.util.List;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.PathVariable;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.springframework.web.bind.annotation.RestController;
importnet.jackieathome.bean.User;
importnet.jackieathome.dao.UserDao;
importnet.jackieathome.db.mapper.UserMapper;
@RestController
publicclassUserController{
@Autowired
privateUserMapperuserMapper;
@Autowired
privateUserDaouserDao;
@RequestMapping(method=RequestMethod.GET,value="/user/create/batch")
publicListcreateBatch(){
try
{
userDao.createBatch();
}
catch(Exceptione)
{
}
returnuserMapper.loadAllUsers();
}
}
从实际测试看,上述事务的实现有效,可保证当数据出现主键冲突时,事务中的插入操作可全部撤销,不会出现部分数据插入成功、部分失败的现象。
注意事项:
由于注解事务的实现依赖SpringAOP,因此只有当注入行为存在时,注解事务的控制才会生效。
1.假如在上述UserController类中定义createBatch方法,并且使用注解@Transactional标记,经验证可确认此时注解事务是无效的。
2.假如在上述UserDao中定义了多个公有方法,存在相互调用的行为,基于相同的原因,这些方法相互调用时注解事务并不会生效。如果确实需要保证事务可用,可以考虑调整类的设计或者使用编程的方式来控制事务。
以上所述是小编给大家介绍的SpringBoot集成MyBatis访问数据库的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!