学习完了整个MyBatis系列以及Spring的大多数内容后,我们要开始走向Spring+Spring MVC+MyBatis框架集合的第一次整合吧:Spring+MyBatis,也就是通过Spring来整合MyBatis框架。本篇Blog先回顾下MyBatis的实现方式以及Spring的一些实现方式,然后再来看下Spring整合MyBatis的几种方式,如何简化MyBatis的配置,
创建一个新项目
为了更加清晰,我们新创建一个整合项目:
首先我们需要把MyBatis以及Spring相关的坐标引入,这里引入的是我们接下来全文需要用到的坐标,为了项目整体连贯,我给出的配置和坐标都是全量的,使用的那部分在介绍到的时候拆解介绍。
<dependencies> <!-- Spring相关 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <!-- Mybatis相关 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.1</version> </dependency> <!-- Mybatis-Spring相关 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.9</version> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> <!-- 日志相关 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.32</version> <scope>test</scope> </dependency> <!-- 单元测试相关 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> </dependencies>
MyBatis实现回顾
我们从头来配置一个MyBatis,然后将其整合进Spring实现中:
1 数据库关系表创建
然后我们使用之前创建的person表并提前预置几条数据:
2 domain实体类创建
依据对应的person表我们创建一个对应的实体类,并通过lombook插件注解set和get方法以及构造有参和构造无参的实现:
package com.example.spring_mybatis.model; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; /* * person表对应对象 * */ @Data @AllArgsConstructor @NoArgsConstructor public class Person { private int id; private String username; private String password; private int age; private int phone; private String email; private String hobby; }
3 PersonDao接口编写
然后我们来创建一个PersonDao接口用来进行相关数据操作,并且我们只实现一个最简单的获取人员列表接口:
package com.example.spring_mybatis.dao; import com.example.spring_mybatis.model.Person; import java.util.List; public interface PersonDao { List<Person> getPersonList(); }
4 db.properties及日志配置编写
要读取数据库,我们先提前编写一份数据库连接的配置db.properties
:
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/test?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC username=root password=root
要打印出每一个执行步骤日志也是必不可少的log4j.properties
:
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 # 设置日志输出级别以及输出目的地,可以设置多个输出目的地,开发环境下,日志级别要设置成DEBUG或者ERROR # 前面写日志级别,逗号后面写输出目的地 # log4j.rootLogger = [level],appenderName1,appenderName2,… log4j.rootLogger=Debug,console,file #控制台输出的相关设置 log4j.appender.console = org.apache.log4j.ConsoleAppender # 输出到控制台 log4j.appender.console.Target = System.out # 指定控制台输出日志级别 log4j.appender.console.Threshold=DEBUG # 默认值是 true, 表示是否立即输出 log4j.appender.console.ImmediateFlush = true # 设置编码方式 log4j.appender.console.Encoding = UTF-8 # 日志输出布局 log4j.appender.console.layout = org.apache.log4j.PatternLayout # 如果日志输出布局为PatternLayout 自定义级别,需要使用ConversionPattern指定输出格式 log4j.appender.console.layout.ConversionPattern=[%c]-%m%n #文件输出的相关设置 log4j.appender.file = org.apache.log4j.RollingFileAppender # 指定输出文件路径 log4j.appender.file.File=./log/tml.log # 指定单个日志文件最大值 log4j.appender.file.MaxFileSize=10mb # 指定输出日志级别 log4j.appender.file.Threshold=DEBUG # 默认值是 true, 表示是否立即输出 log4j.appender.file.ImmediateFlush = true # 设置编码方式 log4j.appender.file.Encoding = UTF-8 # 日志输出布局 log4j.appender.file.layout=org.apache.log4j.PatternLayout # 如果日志输出布局为PatternLayout 自定义级别,需要使用ConversionPattern指定输出格式 log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n #日志输出级别 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sq1.PreparedStatement=DEBUG
5 mybatis核心配置编写
当然,接下来我们要编写核心的配置文件:mybatis-config.xml
,并且该配置已经引入了数据库的db配置文件、日志配置文件以及接下来的mapper文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--configuration核心配置文件--> <configuration> <!--导入properties文件--> <properties resource="properties/db.properties"/> <settings> <setting name="logImpl" value="log4j"/> <setting name="cacheEnabled" value="true"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mappers/personMapper.xml"/> </mappers> </configuration>
6 MybatisUtils辅助类实现
既然有了核心配置,我们当然需要获取SqlSession,这需要编写一个辅助类来实现:
package com.example.spring_mybatis.util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MybatisUtils { static SqlSessionFactory sqlSessionFactory = null; static { try { //使用Mybatis第一步 :获取sqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例. // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
7 personMapper映射文件编写
接下来我们编写personMapper.xml
配置来完成Dao接口的接口实现:
<?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"> <!--namespace=绑定一个指定的Dao/Mapper接口--> <mapper namespace="com.example.spring_mybatis.dao.PersonDao"> <select id="getPersonList" resultType="com.example.spring_mybatis.model.Person"> select * from person </select> </mapper>
8 编写测试类进行测试
然后我们测试下数据获取的实现,通过一个测试类实现:
import com.example.spring_mybatis.dao.PersonDao; import com.example.spring_mybatis.model.Person; import com.example.spring_mybatis.util.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.jupiter.api.Test; import java.util.List; public class PersonTest { @Test public void getPersonListTest(){ //1.获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //2.执行SQL PersonDao personDao = sqlSession.getMapper(PersonDao.class); List<Person> personList = personDao.getPersonList(); for (Person person : personList) { System.out.println(person); } //关闭sqlSession sqlSession.close(); } }
打印结果如下: