- mybatis和spring整合
- 需要spring通过单例方式管理SqlSessionFactory
- spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession
- 持久层的mapper都需要由spring进行管理
- 需要导入的jar包
-
- 需要建立的文件
- 需要建立的包
- 在applicationContext.xml配置sqlSessionFactory
- 创建applicationContext.xml
- 配置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:context="http://www.springframework.org/schema/context" 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="classpath:db.properties"/> <!-- 数据源,使用dbcp --> <!-- driverClassName: url: username: password: maxActive: maxIdle: --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!--<property name="maxActive" value="10"/>--> <property name="maxIdle" value="5"/> </bean> <!-- 配置SqlSessionFactory --> <!-- class:设置为mybatis-spring.jar中的类 id:唯一表示标识 --> <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载mybatis的配置文件 --> <property name="configLocation" value="mybatis/SqlMapConfig.xml"/> <!-- 加载数据源 --> <property name="dataSource" ref="dataSource"/> </bean> </beans>
-
- 创建applicationContext.xml
- 整合代码及其bug
- 若报找不到org.springframework.dao.support.DaoSupport的类文件
- 导入spring-tx-4.3.5.RELEASE.jar
-
若报java.lang.ClassNotFoundException: org.apache.commons.pool2.PooledObjectFactory
- 导入commons-pool2-2.6.1.jar
-
若报java.lang.NoClassDefFoundError: org/springframework/aop/support/AopUtils
- 导入spring-aop-4.3.5.RELEASE.jar
- 若报nested exception is java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy
- 导入spring-jdbc-4.3.5.RELEASE.jar
- 原生dao
/** * dao接口实现类需要注入SqlSessionFactory,通过spring进行注入 * 这里通过spring声明配置方式,配置dao的bean */ public interface UserDao { public abstract List<User> selectAllUser(); } /** * UserDao的实现类 */ public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { @Override public List<User> selectAllUser() { //继承SqlSessionDaoSupport,通过this.getSqlSession()得到sqlSession SqlSession connection = this.getSqlSession(); List<User> users = connection.selectList("user.selectAllUser"); //方法结束就自动关闭,所以不需要close(); //connection.close(); return users; } } <!-- 在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:context="http://www.springframework.org/schema/context" 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="classpath:db.properties"/> <!-- 数据源,使用dbcp --> <!-- driverClassName: url: username: password: maxActive: maxIdle: --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!--<property name="maxActive" value="10"/>--> <property name="maxIdle" value="5"/> </bean> <!-- 配置SqlSessionFactory --> <!-- class:设置为mybatis-spring.jar中的类 id:唯一表示标识 --> <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载mybatis的配置文件 --> <property name="configLocation" value="mybatis/SqlMapConfig.xml"/> <!-- 加载数据源 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- 原始dao接口 --> <bean id="userDao" class="cn.muriel.ssm.dao.impl.UserDaoImpl"> <property name="sqlSessionFactory" ref="SqlSessionFactory"/> </bean> </beans> <!-- 在userMapper.xml配置 --> <?xml version="1.0" encoding="UTF-8" ?> <!-- 此时您可能想知道SqlSession或Mapper类究竟执行了什么。 MyBatis提供的全套功能可以通过使用多年来MyBatis流行的基于XML的映射语言来实现。 如果您以前使用过MyBatis,那么您将很熟悉这个概念,但是对XML映射文档进行了大量改进,以后会很清楚。 --> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace命名空间。作用对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用 --> <mapper namespace="cn.muriel.ssm.dao.UserDao"> <select id="selectAllUser" resultType="cn.muriel.mybatis.po.User"> select * from user </select> </mapper> <!-- 测试 --> public class TestUtil { private static ApplicationContext applicationContext; //在setUp这个方法得到spring容器 public static void main(String[] args) { applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); JSONArray sendJson = JSONArray.fromObject(userDao.selectAllUser()); System.out.println(sendJson + ""); } }
- 代理mapper
/** * dao接口实现类需要注入SqlSessionFactory,通过spring进行注入 * 这里通过spring声明配置方式,配置dao的bean */ public interface UserMapper { public abstract List<User> selectAllUser(); } /** * UserDao的实现类 */ public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper { @Override public List<User> selectAllUser() { //继承SqlSessionDaoSupport,通过this.getSqlSession()得到sqlSession SqlSession connection = this.getSqlSession(); List<User> users = connection.selectList("user.selectAllUser"); //方法结束就自动关闭,所以不需要close(); //connection.close(); return users; } } <!-- 在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:context="http://www.springframework.org/schema/context" 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="classpath:db.properties"/> <!-- 数据源,使用dbcp --> <!-- driverClassName: url: username: password: maxActive: maxIdle: --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!--<property name="maxActive" value="10"/>--> <property name="maxIdle" value="5"/> </bean> <!-- 配置SqlSessionFactory --> <!-- class:设置为mybatis-spring.jar中的类 id:唯一表示标识 --> <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载mybatis的配置文件 --> <property name="configLocation" value="mybatis/SqlMapConfig.xml"/> <!-- 加载数据源 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- mapper配置 --> <!-- class为mybatis-spring.jar下的类 MapperFactoryBean:根据mapper接口生成代理对象 --> <!-- UserMapper.java和userMapper.xml在同一个包下 --> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="cn.muriel.ssm.mapper.UserMapper"/> <!-- 若ref改为value,则报ConversionNotSupportedException --> <property name="sqlSessionFactory" rel="SqlSessionFactory"/> </bean> </beans> <!-- 在userMapper.xml配置 --> <?xml version="1.0" encoding="UTF-8" ?> <!-- 此时您可能想知道SqlSession或Mapper类究竟执行了什么。 MyBatis提供的全套功能可以通过使用多年来MyBatis流行的基于XML的映射语言来实现。 如果您以前使用过MyBatis,那么您将很熟悉这个概念,但是对XML映射文档进行了大量改进,以后会很清楚。 --> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace命名空间。作用对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用 --> <mapper namespace="cn.muriel.ssm.mapper.UserMapper"> <select id="selectAllUser" resultType="cn.muriel.mybatis.po.User"> select * from user </select> </mapper> <!-- 测试 --> public class TestUtil { private static ApplicationContext applicationContext; //在setUp这个方法得到spring容器 public static void main(String[] args) { applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper"); JSONArray sendJson = JSONArray.fromObject(userMapper.selectAllUser()); System.out.println(sendJson + ""); } }
- mapper的扫描配置
/** * dao接口实现类需要注入SqlSessionFactory,通过spring进行注入 * 这里通过spring声明配置方式,配置dao的bean */ public interface UserMapper { public abstract List<User> selectAllUser(); } /** * UserDao的实现类 */ public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper { @Override public List<User> selectAllUser() { //继承SqlSessionDaoSupport,通过this.getSqlSession()得到sqlSession SqlSession connection = this.getSqlSession(); List<User> users = connection.selectList("user.selectAllUser"); //方法结束就自动关闭,所以不需要close(); //connection.close(); return users; } } <!-- 在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:context="http://www.springframework.org/schema/context" 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="classpath:db.properties"/> <!-- 数据源,使用dbcp --> <!-- driverClassName: url: username: password: maxActive: maxIdle: --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!--<property name="maxActive" value="10"/>--> <property name="maxIdle" value="5"/> </bean> <!-- 配置SqlSessionFactory --> <!-- class:设置为mybatis-spring.jar中的类 id:唯一表示标识 --> <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载mybatis的配置文件 --> <property name="configLocation" value="mybatis/SqlMapConfig.xml"/> <!-- 加载数据源 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创 建代理对象并且在spring容器中注册 --> <!-- 自动扫描出来的mapper的bean的id为mapper类名(首字母小写) --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 指定扫描的包名 指定mapper接口的包名,mybatis自动扫描包下边所以mapper接口进行加载 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中 如果扫描多个包,每个包中间使用逗号分隔 --> <property name="basePackage" value="cn.muriel.ssm.mapper"/> <!-- 数据源 --> <property name="sqlSessionFactoryBeanName" value="SqlSessionFactory"/> </bean> </beans> <!-- 在userMapper.xml配置 --> <?xml version="1.0" encoding="UTF-8" ?> <!-- 此时您可能想知道SqlSession或Mapper类究竟执行了什么。 MyBatis提供的全套功能可以通过使用多年来MyBatis流行的基于XML的映射语言来实现。 如果您以前使用过MyBatis,那么您将很熟悉这个概念,但是对XML映射文档进行了大量改进,以后会很清楚。 --> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace命名空间。作用对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用 --> <mapper namespace="cn.muriel.ssm.mapper.UserMapper"> <select id="selectAllUser" resultType="cn.muriel.mybatis.po.User"> select * from user </select> </mapper> <!-- 测试 --> public class TestUtil { private static ApplicationContext applicationContext; //在setUp这个方法得到spring容器 public static void main(String[] args) { applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper"); JSONArray sendJson = JSONArray.fromObject(userMapper.selectAllUser()); System.out.println(sendJson + ""); } }
- 若报找不到org.springframework.dao.support.DaoSupport的类文件
- 需要建立的文件