无情的你无情的雨 2020-06-25
db.properties:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/db_mybatis jdbc.username=root jdbc.password=root jdbc.maxTotal=30 jdbc.maxIdle=10 jdbc.initialSize=5
连接数据库的基本4项外,还配置了数据库连接池的最大连接数(maxTotal)、最大空闲连接数(maxIdle)以及初始化连接数(initialSize)
applicationContext. xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!--读取db.properties--> <context:property-placeholder location="classpath:db.properties"/> <!--配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <!--数据库驱动 --> <property name="driverClassName" value="${jdbc.driver}" /> <!--连接数据库的ur1 --> <property name="url" value="${jdbc.url}" /> <!--连接数据库的用户名 --> <property name="username" value="${jdbc.username}" /> <!--连接数据库的密码--> <property name="password" value="${jdbc.password}" /> <!--最大连接数--> <property name="maxTotal" value="${jdbc.maxTotal}" /> <!--最大空闲连接--> <property name="maxIdle" value="${jdbc.maxIdle}" /> <!--初始化连接数--> <property name="initialSize" value="${jdbc.initialSize}" /> </bean> <!--事务管理器,依赖于数据源 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--注册事务管理器驱动,开启事务注解 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!--配置MyBatis工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--注入数据源 --> <property name="dataSource" ref="dataSource" /> <!--指定核心配置文件位置 --> <property name="configLocation" value="classpath:mybatis-config.xml" /> </bean> <bean id="userDao" class="com.ssm.dao.impl.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> <!-- Mapper代理开发(基于MapperFactoryBean) --> <!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.ssm.mapper.UserMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> --> <!-- Mapper代理开发(基于MapperScannerConfigurer) --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.ssm.mapper" /> </bean> </beans>
??首先定义了读取properties文件的配置,然后配置了数据源,接下来配置了事务管理器并开启了事务注解,最后配置了MyBatis工厂来与 Spring整合。其中,MyBatis工厂的作用就是构建SqlSessionFactory,它是通过 MyBatis-spring包中提供的org. mybatis.
Spring.SqlSessionFactoryBean类来配置的。通常,在配置时需要提供两个参数:一个是数据源,另一个是MyBatis的配置文件路径。这样Spring的loC容器就会在初始化id为 sqlSessionFactory的Bean时解析MyBatis的配置文件,并与数据源一同保存到 Spring的Bean中。
mybatis-config. xml
<?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> <!--配置别名 --> <typeAliases> <package name="com.ssm.po"/> </typeAliases> <!--配置Mapper的位置 --> <mappers> ... </mappers> </configuration>
由于在 Spring中已经配置了数据源信息,所以在MyBatis的配置文件中就不再需要配置数源信息。这里只需要使用< typeAliases>和元素来配置文件别名以及指定Mapper文件位置即可
??采用传统DAO开发方式进行MyBatis与Spring框架的整合时,我们需要编写DAO接口以及接口的实现类,并且需要向DAO实现类中注入SqlSessionFactory,然后在方法体内通过 SqlSessionFactory创建SqlSession。为此,我们可以使用mybatis-spring包中所提供的 SqlSessionTemplate类或 SqlSessionDaoSupport类来实现此功能。这两个类的描述如下:
??SqlSessionTemplate:是mybatis-spring的核心类,它负责管理MyBatis的SqlSession,调用MyBatis的SQL方法。当调用SQL方法时,SqlSessionTemplate将会保证使用的 SqlSession和当前Spring的事务是相关的。它还管理 SqlSession的生命周期,包含必要的关闭、提交和回滚操作。
??SqlSessionDaoSupport:是一个抽象支持类,它继承了 DaoSupport类,主要是作为DAO的基类来使用。可以通过SqlSessionDaoSupport类的getSqlSession()方法来获取所需的SqISession。
UserMapper.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.ssm.po.UserMapper"> <!--根据用户编号获取用户信息 --> <select id="findUserById" parameterType="Integer" resultType="User"> select * from t_user where id=#{id} </select> </mapper>
UserDaolmp.java:
package com.ssm.dao.impl; import org.mybatis.spring.support.SqlSessionDaoSupport; import com.ssm.dao.UserDao; import com.ssm.po.User; public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { public User findUserById(Integer id) { return this.getSqlSession().selectOne("com.ssm.po.UserMapper.findUserById", id); } }
??UserDaolmpl类继承了SqlSessionDaoSupport并实现了UserDao接口。其中, SqlSessionDaoSupport类在使用时需要一个 SqlSessionFactory或一个SqlSessionTemplate对象,所以需要通过Spring给SqlSessionDaoSupport类的子类对象注入一个 SqlSessionFactory或SqlSessionTemplate。这样,子类中就能通过调用SqlSessionDaoSupport类的getSqlSession()方法来获取SqISession对象,并使用SqISession对象中的方法了。
DaoTest. java:
package com.ssm.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.ssm.dao.UserDao; import com.ssm.po.User; public class UserDaoTest { @Test public void findUserByIdDaotest(){ //1.初始化Spring容器,加载配置文件 ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml"); //2.通过容器获取userDao实例 UserDao userDao=(UserDao)applicationContext.getBean("userDao"); User user=userDao.findUserById(1); System.out.println(user); } }
UserMapper. java
package com.ssm.mapper; import com.ssm.po.User; public interface UserMapper { public User findUserById(Integer id); }
UserMapper.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.ssm.mapper.UserMapper"> <!--根据用户编号获取用户信息 --> <select id="findUserById" parameterType="Integer" resultType="User"> select * from t_user where id=#{id} </select> </mapper>
<!-- Mapper代理开发(基于MapperFactoryBean) --> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.ssm.mapper.UserMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
@Test public void findUserByldMapperTest(){ ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapper userMapper=(UserMapper)applicationContext.getBean("userMapper"); User user=userMapper.findUserById(1); System.out.println(user); }
<!-- Mapper代理开发(基于MapperScannerConfigurer) --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.ssm.mapper" /> </bean>