欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Boot集成MyBatis访问数据库的方法

程序员文章站 2024-02-29 11:21:46
基于spring boot开发的微服务应用,与mybatis如何集成? 集成方法 可行的方法有: 1.基于xml或者java config,构建必需的对象,配置myb...

基于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访问数据库的方法,希望对大家有所帮助