Spring Boot集成MyBatis访问数据库的方法
基于spring boot开发的微服务应用,与mybatis如何集成?
集成方法
可行的方法有:
1.基于xml或者java config,构建必需的对象,配置mybatis。
2.使用mybatis官方提供的组件,实现mybatis的集成。
方法一
建议参考如下文章,完成集成的验证。
mybatis学习 之 一、mybatis简介与配置mybatis+spring+mysql
基于spring + spring mvc + mybatis 高性能web构建
mybatis学习总结(八)——mybatis3.x与spring4.x整合
由于不是本文的重点,因此不附上样例。
方法二
有如下步骤:
- 修改pom.xml,增加软件依赖
<dependency> <groupid>org.mybatis.spring.boot</groupid> <artifactid>mybatis-spring-boot-starter</artifactid> <version>1.2.0</version> </dependency> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>5.1.21</version> </dependency>
- 修改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-16 11:32:23.266 debug 27801 --- [io-11002-exec-1] n.j.db.mapper.usermapper.createuser : ==> preparing: insert into `user`(id, name, password) values(?, ?, ?)
2017-04-16 11:32:23.293 debug 27801 --- [io-11002-exec-1] n.j.db.mapper.usermapper.createuser : ==> parameters: id1492313542(string), null, null
2017-04-16 11:32:23.366 debug 27801 --- [io-11002-exec-1] n.j.db.mapper.usermapper.createuser : <== updates: 1
2017-04-16 11:32:23.372 debug 27801 --- [io-11002-exec-1] n.j.db.mapper.usermapper.finduserbyid : ==> preparing: select * from `user` where id = ?
2017-04-16 11:32:23.373 debug 27801 --- [io-11002-exec-1] n.j.db.mapper.usermapper.finduserbyid : ==> parameters: id1492313542(string)
2017-04-16 11:32:23.417 debug 27801 --- [io-11002-exec-1] n.j.db.mapper.usermapper.finduserbyid : <== total: 1
事务的使用
依据mybatis的官方文档,允许用户将事务交给spring来管理,使用编程和注解来控制事务。这里以注解方式来举例说明使用方法,样例代码如下:
1.mapper的定义,如下
package net.jackieathome.db.mapper; import java.util.list; import org.apache.ibatis.annotations.mapper; import org.apache.ibatis.annotations.param; import net.jackieathome.bean.user; @mapper public interface usermapper { // 创建用户 void createuser(user user); // 查找用户 user finduserbyid(@param("id") string id); }
2.数据库访问的中间层代码,对上述mapper进行了封装。
使用@transactional标记该类,表明该类的公有方法全部都启用了事务的支持。关于@transactional的使用,可以参考相关的官方文档。
package net.jackieathome.dao; import java.util.arraylist; import java.util.list; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.component; import org.springframework.transaction.annotation.transactional; import net.jackieathome.bean.user; import net.jackieathome.db.mapper.usermapper; @component @transactional public class userdao { @autowired private usermapper usermapper; /** * 重复插入相同的用户数据,确认事务是否生效 */ public list<string> createbatch() { long time = system.currenttimemillis() / 1000; user user = null; list<string> ids = new arraylist<>(); string id = "id" + time; string name = "name" + time; string password = "password" + time; user = new user(); user.setid(id); user.setname(name); user.setpassword(password); usermapper.createuser(user); ids.add(id); user = new user(); user.setid(id); user.setname(name); user.setpassword(password); usermapper.createuser(user); ids.add(id); return ids; } }
3.业务层实现
package net.jackieathome.controller; import java.util.list; import org.springframework.beans.factory.annotation.autowired; import org.springframework.web.bind.annotation.pathvariable; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.restcontroller; import net.jackieathome.bean.user; import net.jackieathome.dao.userdao; import net.jackieathome.db.mapper.usermapper; @restcontroller public class usercontroller { @autowired private usermapper usermapper; @autowired private userdao userdao; @requestmapping(method = requestmethod.get, value = "/user/create/batch") public list<user> createbatch() { try { userdao.createbatch(); } catch (exception e) { } return usermapper.loadallusers(); } }
从实际测试看,上述事务的实现有效,可保证当数据出现主键冲突时,事务中的插入操作可全部撤销,不会出现部分数据插入成功、部分失败的现象。
注意事项:
由于注解事务的实现依赖spring aop,因此只有当注入行为存在时,注解事务的控制才会生效。
1.假如在上述usercontroller类中定义createbatch方法,并且使用注解@transactional标记,经验证可确认此时注解事务是无效的。
2.假如在上述userdao中定义了多个公有方法,存在相互调用的行为,基于相同的原因,这些方法相互调用时注解事务并不会生效。如果确实需要保证事务可用,可以考虑调整类的设计或者使用编程的方式来控制事务。
以上所述是小编给大家介绍的spring boot集成mybatis访问数据库的方法,希望对大家有所帮助
推荐阅读
-
Spring Boot集成MyBatis访问数据库的方法
-
Spring boot集成Mybatis的方法教程
-
Spring Boot集成MyBatis的方法
-
Spring boot项目集成Camel FTP的方法示例
-
SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本)
-
Spring Boot集成MyBatis实现通用Mapper的配置及使用
-
Spring boot 默认静态资源路径与手动配置访问路径的方法
-
Spring boot集成Mybatis的方法教程
-
Spring Boot整合MyBatis连接Oracle数据库的步骤全纪录
-
SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本)