持续学习&持续更新中…
守破离
【Java从零到架构师第③季】【14】Spring-整合MyBatis
一、整合MyBatis—dependencies
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>programmer.lp</groupId>
<artifactId>Spring_05_integrate_MyBatis</artifactId>
<version>1.0.0</version>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!-- Spring整合MyBatis -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
二、整合MyBatis—dataSource
db.properties:
dev.driverClassName=com.mysql.jdbc.Driver
dev.url=jdbc:mysql://localhost:3306/test_mybatis?useSSL=false
dev.username=root
dev.password=root
pdr.driverClassName=com.mysql.jdbc.Driver
pdr.url=jdbc:mysql://localhost:3306/lp_resume
pdr.username=root
pdr.password=root
pdr.initialSize=5
pdr.maxActive=10
pdr.maxWait=5000
提示:直接在applicationContext.xml中敲:<context:property-placeholder
就可以自动生成需要的XML命名空间:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="db.properties"/>
<!-- ... -->
</beans>
使用Druid连接池:
<!-- 数据源:使用Druid连接池 -->
<context:property-placeholder location="db.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${dev.driverClassName}"/>
<property name="url" value="${dev.url}"/>
<property name="username" value="${dev.username}"/>
<property name="password" value="${dev.password}"/>
</bean>
使用MyBatis自带的连接池:
<!-- 数据源:使用MyBatis自带的连接池 -->
<bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
<property name="driver" value="${dev.driverClassName}"/>
<property name="url" value="${dev.url}"/>
<property name="username" value="${dev.username}"/>
<property name="password" value="${dev.password}"/>
</bean>
使用Spring提供的连接池:
<!-- 数据源:使用Spring提供的连接池 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${dev.driverClassName}"/>
<property name="url" value="${dev.url}"/>
<property name="username" value="${dev.username}"/>
<property name="password" value="${dev.password}"/>
</bean>
三、整合MyBatis—SqlSessionFactoryBean
-
SqlSession
需要使用SqlSessionFactory
对象的openSession(boolean autoCommit)
方法来创建,因此不能让Spring直接使用bean标签
来管理SqlSession
-
而是要让Spring来管理
SqlSessionFactory
这个bean,然后通过SqlSessionFactory
去取SqlSession
-
又因为
SqlSessionFactory
对象不能简单的直接new出来,创建过程比较复杂,因此需要使用FactoryBean
这种方式来创建 -
所以:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 需要设置别名的model(一般是domain领域模型)所在的包 -->
<property name="typeAliasesPackage" value="programmer.lp.domain"/>
<!-- MyBatis映射文件的路径 -->
<property name="mapperLocations">
<array>
<!-- <value>mappers/skill.xml</value> -->
<!-- <value>mappers/person.xml</value> -->
<!-- <value>mappers/id_card.xml</value> -->
<!-- <value>mappers/bank_card.xml</value> -->
<value>mappers/*.xml</value>
</array>
</property>
</bean>
四、整合MyBatis—MapperScannerConfigurer
注意:在扫描applicationContext.xml时,Spring就可以获取到MapperScannerConfigurer对象,然后通过MapperScannerConfigurer对象的属性就能获取到SqlSessionFactory对象和所有的DAO接口,然后就会去将这些DAO作为bean来管理到IoC容器中(使用DAO的小驼峰类名作为id),这些操作只需一次就够了,也就是说,这个MapperScannerConfigurer对象以后就使用不到了,那么当然也就不需要使用id来获取这个MapperScannerConfigurer对象了,因此这个bean不需要有id属性。
<!-- 扫描DAO接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- SqlSessionFactoryBean的id -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- dao接口所在的包路径 -->
<property name="basePackage" value="programmer.lp.dao"/>
</bean>
五、applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="db.properties"/>
<!-- 数据源:使用Spring提供的连接池 -->
<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">-->
<!-- <property name="driverClassName" value="${dev.driverClassName}"/>-->
<!-- <property name="url" value="${dev.url}"/>-->
<!-- <property name="username" value="${dev.username}"/>-->
<!-- <property name="password" value="${dev.password}"/>-->
<!-- </bean>-->
<!-- 数据源:使用MyBatis自带的连接池 -->
<!-- <bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">-->
<!-- <property name="driver" value="${dev.driverClassName}"/>-->
<!-- <property name="url" value="${dev.url}"/>-->
<!-- <property name="username" value="${dev.username}"/>-->
<!-- <property name="password" value="${dev.password}"/>-->
<!-- </bean>-->
<!-- 数据源:使用Druid连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${dev.driverClassName}"/>
<property name="url" value="${dev.url}"/>
<property name="username" value="${dev.username}"/>
<property name="password" value="${dev.password}"/>
</bean>
<!-- 用于创建SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 需要设置别名的model(一般是domain领域模型)所在的包 -->
<property name="typeAliasesPackage" value="programmer.lp.domain"/>
<!-- MyBatis映射文件的路径 -->
<property name="mapperLocations">
<array>
<!-- <value>mappers/skill.xml</value> -->
<!-- <value>mappers/person.xml</value> -->
<!-- <value>mappers/id_card.xml</value> -->
<!-- <value>mappers/bank_card.xml</value> -->
<value>mappers/*.xml</value>
</array>
</property>
</bean>
<!-- 扫描DAO接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- SqlSessionFactoryBean的id -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- dao接口所在的包路径 -->
<property name="basePackage" value="programmer.lp.dao"/>
</bean>
</beans>
六、其他代码
domain model
package programmer.lp.domain;
import java.util.Date;
public class Skill {
private Integer id;
private Date createdTime;
private String name;
private Integer level;
public Skill() {
}
// getter、setter
}
dao接口
package programmer.lp.dao;
import programmer.lp.domain.Skill;
import java.util.List;
public interface SkillDao {
Skill get(Integer id);
List<Skill> list();
}
mapper映射文件
<?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="programmer.lp.dao.SkillDao">
<sql id="sqlListAll">
SELECT id, created_time `createdTime`, name, level FROM skill
</sql>
<select id="list" resultType="Skill">
<include refid="sqlListAll"/>
</select>
<select id="get" parameterType="Int" resultType="Skill">
<include refid="sqlListAll"/> WHERE id = #{id}
</select>
</mapper>
测试运行
public class MainTest {
@Test
public void get() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
SkillDao skillDao = ctx.getBean("skillDao", SkillDao.class);
Skill skill = skillDao.get(1);
System.out.println(skill);
}
@Test
public void list() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
SkillDao skillDao = ctx.getBean("skillDao", SkillDao.class);
List<Skill> skills = skillDao.list();
System.out.println(skills);
}
}
注意
- 配置Spring的applicationContext.xml文件时,其中的每一个
<bean>
的每一个<property>
都可以点进去看一下源码,看一看究竟。
- 只需要敲
<context:property-placeholder
就可以自动生成xmlns:context
、xsi:schemaLocation
这些XML命名空间了
参考
小码哥-李明杰: Java从0到架构师③进阶互联网架构师.
本文完,感谢您的关注支持!