30分钟带你了解Springboot与Mybatis整合最佳实践
前言:Springboot怎么使用想必也无需我多言,Mybitas作为实用性极强的ORM框架也深受广大开发人员喜爱,有关如何整合它们的文章在网络上随处可见。但是今天我会从实战的角度出发,谈谈我对二者结合与使用的最佳实践。
一、依赖与pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
目前SpringBoot官方的最新版本是2.0.4.RELEASE我们就以这个版本为基础,2.0以下版本可能会有些区别这里不多解释。
二、创建配置文件和启动类
Spring官方推荐使用yml文件,既然是最佳实践我们就按照官方的要求来做。
application.yml
server:
port: 8090
spring:
datasource:
mimas:
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.56.101:3306/mimas
username: root
password: 12345678
logging:
level:
com.learnhow.springboot.mybatis.dao: debug
解释一下三个部分的含义:
(1)server:代表当前服务通过8090端口访问。
(2)spring:配置了一个名为mimas的数据源,如果项目需要多个数据源可以按照这样的方式将数据源配置成不同的名称。
(3)logging:定义dao包下的日志记录级别为debug,标准输出会显示sql语句(这一点对开发还是很重要的)
Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
三、xml文件与接口
Springboot与Mybatis整合以后可以使用annotation(注解)和xml(配置文件)两种方式编写sql语句,我推荐的做法是后者。就目前我接触到的项目来说,项目部署环境都比较严格,往往修改一个BUG到重新部署完成少则2个小时,多则数天。而很多BUG有时候仅仅需要修改几条SQL语句。如果采用配置文件的方式,这类问题只需要在服务器上修改一下文件然后再重启一下服务就能完成。其次,我个人也很不喜欢Java代码和SQL代码混再一起开发方式,既不美观也不便于维护。所以通常在项目初期我都会尽量避免这类为以后埋坑的行为。
以下是一个典型的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.learnhow.springboot.mybatis.dao.mimas.UserDao">
<resultMap type="User" id="UserMap">
<id column="id" property="id" jdbcType="BIGINT" />
<result column="user_name" property="username" jdbcType="VARCHAR" />
<result column="user_age" property="age" jdbcType="INTEGER" />
<result column="user_gender" property="gender" jdbcType="INTEGER" />
<result column="ep_id" property="enterpriseId" jdbcType="BIGINT" />
</resultMap>
<select id="getAll" resultType="User">
select * from user_t
</select> <select id="getOne" resultType="User" parameterType="Long">
select * from user_t t where t.id = #{id}
</select> <insert id="saveUsers">
insert into user_t(user_name, user_age, user_gender, ep_id) values
<foreach collection="users" item="user" separator=",">
(#{user.username}, #{user.age}, #{user.gender}
<trim prefix="," suffix=")">
<choose>
<when test="user.enterpriseId != null and user.enterpriseId != 0">
#{user.enterpriseId}
</when>
<otherwise>
null
</otherwise>
</choose>
</trim>
</foreach>
</insert> <update id="modifyEnterpriseId">
update user_t set ep_id = #{eid} where id = #{uid}
</update>
</mapper>
具体语句和表原型大家不用过分关心,一个mybatis的sql配置文件主要有几个细节需要注意:
(1)配置文件中的sql语句与dao接口是如何结合的?
实际上mybatis先扫描配置文件然后将sql语句通过namespace和id反向注册到dao接口中,所以namespace属性表示接口类的全限定名,每一个方法的id则对应接口类中的每一个接口方法。
(2)查询中遇到多个参数的情况怎么办?
如果多个参数都属于一个单一实体,我们可以直接使用实体对象最为参数。例如配置文件中的两条select语句。如果实体的属性名与表的字段明称不一致可以通过resultMap做关联。
如果多个参数不属于单一实体,我们可以在接口方法中通过@Param指定参数的名字然后在语句中使用(参考update方法)。我们应尽量避免在配置文件中使用parameterMap方法和在接口中使用Map对象,因为这样都不利于大型代码的维护。
(3)根据情况的不同动态生成SQL语句也是Mybatis的一大亮点,我很喜欢这个特征(参考insert方法)。不过在实际开发中我不并要求开发人员大量使用(任何一种增加编写难度和提高维护成本的行为都应该被谨慎选择)。
import java.util.List;
import java.util.Set; import org.apache.ibatis.annotations.Param; import com.learnhow.springboot.mybatis.entity.User; public interface UserDao {
List<User> getAll(); User getOne(long id); int saveUsers(@Param("users") Set<User> users); int modifyEnterpriseId(@Param("uid") long userId, @Param("eid") long enterpriseId);
}
四、Mybatis配置文件
DataSourceConfig.java
import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; @Configuration
@MapperScan(basePackages = "com.learnhow.springboot.mybatis.dao.mimas", // 为指定包中的DAO注入SqlSessionTemplate
sqlSessionTemplateRef = "mimasSqlSessionTemplate") // 指定SqlSessionTemplate
public class DataSourceConfig {
@Bean(name = "mimasDataSource")
@ConfigurationProperties(prefix = "spring.datasource.mimas")
@Primary
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
} @Bean(name = "mimasSqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("mimasDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/mimas/*.xml"));
bean.setTypeAliasesPackage("com.learnhow.springboot.mybatis.entity"); // 指定entity的别名
return bean.getObject();
} @Bean(name = "mimasSqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("mimasSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
Springboot的项目都需要配置主数据源,MapperScan表示扫描dao.mimas.*下的所有接口并注入指定的SessionTemplate。下面的三个方法就是产生这个SessionTemplate的过程。
五、事务控制
传统的方法是在service中做事务控制,我们还是沿用这样的开发逻辑。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import com.learnhow.springboot.mybatis.dao.mimas.UserDao;
import com.learnhow.springboot.mybatis.entity.User; @Component
public class UserService {
@Autowired
private UserDao userDao; @Transactional
public int saveUsers(Set<User> users) {
return userDao.saveUsers(users);
} @Transactional
public void modifyEnterpriseIdByUserId(Set<User> users) {
for(User u : users) {
userDao.modifyEnterpriseId(u.getId(), u.getEnterpriseId());
}
}
}
至此,有关Springboot和mybatis的整合我们已经完成。完整代码由于十分简单我就不提供链接了,有需要帮助的小伙伴可以私信@我。
30分钟带你了解Springboot与Mybatis整合最佳实践的更多相关文章
- SpringBoot+Shiro+mybatis整合实战
SpringBoot+Shiro+mybatis整合 1. 使用Springboot版本2.0.4 与shiro的版本 引入springboot和shiro依赖 <?xml version=&q ...
- SpringBoot与Mybatis整合方式01(源码分析)
前言:入职新公司,SpringBoot和Mybatis都被封装了一次,光用而不知道原理实在受不了,于是开始恶补源码,由于刚开始比较浅,存属娱乐,大神勿喷. 就如网上的流传的SpringBoot与Myb ...
- 30分钟带你了解Docker
最近一直在忙项目,不知不觉2个多月没有更新博客了.正好自学了几天docker就干脆总结一下,也顺带增加一篇<30分钟入门系列>.网上能够查到的对于docker的定义我就不再重复了,说说我自 ...
- Springboot与Mybatis整合
最近自己用springboot和mybatis做了整合,记录一下: 1.先导入用到的jar包 <dependency> <groupId>org.springframework ...
- SpringBoot系列——MyBatis整合
前言 MyBatis官网:http://www.mybatis.org/mybatis-3/zh/index.html 本文记录springboot与mybatis的整合实例:1.以注解方式:2.手写 ...
- SpringBoot与Mybatis整合实例详解
介绍 从Spring Boot项目名称中的Boot可以看出来,SpringBoot的作用在于创建和启动新的基于Spring框架的项目,它的目的是帮助开发人员很容易的创建出独立运行的产品和产品级别的基于 ...
- spring-boot、mybatis整合
一.MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 X ...
- springBoot和MyBatis整合中出现SpringBoot无法启动时处理方式
在springBoot和Myatis 整合中出现springBoot无法启动 并且报以下错误 Description: Field userMapper in cn.lijun.control ...
- 30分钟带你快速入门MySQL教程
这是一篇真正适合初学者的MySQL数据库入门文章,哪怕你从来没有接触过数据库,或者说你从来没有听说过有数据库这东西,请一定要相信我,我当时就是这么过来的. 如果你刚开始接触MySQL数据库,或者你需要 ...
随机推荐
- git克隆代码
1.vs--team explorer-clone,或者team-connect to tfs-clone 2.1输入git的url,2输入本地放代码的文件夹,3点clone,克隆出4.双击4 3.点 ...
- 集合框架—常见的Set集合
list ArrayList 动态数组结构存储,遍历速度快,索引随机访问快,允许多空值 LinkedList 底层数据结构是链表,插入和删除速度快. Vector 数组结构存储,线程安全的,查找速度快 ...
- YUV编码格式
YUV是被欧洲电视系统采用的一种颜色编码方法.在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄像机取像,然后把取 得的彩色图像信号经过分色,分别放大校正后得到RGB,在经过矩阵变换电路,得到 ...
- PAT乙级 1024. 科学计数法 (20)(未通过全部测试,得分18)
1024. 科学计数法 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HOU, Qiming 科学计数法是科学家用来表示很 ...
- CE寻找游戏基址
什么是游戏基址? 游戏基址是保持恒定的两部分内存地址的一部分并提供一个基准点,从这里可以计算一个字节数据的位置.基址伴随着一个加到基上的偏移值来确定信息准确的位置(绝对地址). 全局基址 一级基址 二 ...
- loadrunner:HTTP接口脚本实例
Action() { lr_rendezvous("getAppHomeModulesList"); lr_start_transaction("getAppHomeMo ...
- ios 透过上层视图点击相应下方视图的点击事件
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ UIView *hitView = [super hitTest:point ...
- mysql count group by统计条数方法
mysql count group by统计条数方法 mysql 分组之后如何统计记录条数? gourp by 之后的 count,把group by查询结果当成一个表再count一次select c ...
- 轻型池不支持执行公共语言运行时(CLR)。禁用以下两个选项中的一个: “clr enabled”或“lightweight pooling”解决方法
执行2变一下代码 : 注意:1表示启用,0表示禁用. sp_configure ; GO sp_configure ; GO sp_configure ; go RECONFIGURE; GO E ...
- MySQL Crash Course #12# Chapter 18. Full-Text Searching
INDEX 由于性能.智能结果等多方面原因,在搜索文本时,全文搜索一般要优于通配符和正则表达式,前者为指定列建立索引,以便快速找到对应行,并且将结果集智能排序.启用查询扩展可以让我们得到未必包含关键字 ...