01、相关JAR包
实现SSM框架整合开发,需要导入相关JAR包,包括MyBatis、Spring、Spring MVC、MySQL连接器、MyBatis与Spring桥接器、Log4j以及DBCP等JAR包。
1●MyBatis框架所需的JAR包
MyBatis框架所需的JAR包,包括它的核心包和依赖包。
2●Spring框架所需的JAR包
Spring框架所需的JAR包,包括它的核心模块JAR、AOP开发使用的JAR、JDBC和事务的JAR包以及Spring MVC所需要的JAR包,具体如下:
commons-logging-1.2.jar
spring-aop-5.3.2.jar
spring-beans-5.3.2.jar
spring-context-5.3.2.jar
spring-core-5.3.2.jar
spring-expression-5.3.2.jar
spring-jdbc-5.3.2.jar
spring-tx-5.3.2.jar
spring-web-5.3.2.jar
spring-webmvc-5.3.2.jar
3●MyBatis与Spring整合的中间JAR包
该中间JAR包的最新版本为mybatis-spring-2.0.6.jar。此版本可从地址“http://mvnrepository.com/artifact/org.mybatis/mybatis-spring”下载。
4●数据库驱动JAR包
我们所使用的MySQL数据库驱动包为mysql-connector-java-5.1.45-bin.jar。
5●数据源所需的JAR包
整合时使用的是DBCP数据源,需要准备DBCP和连接池的JAR包。最新版本的DBCP的JAR包为commons-dbcp2-2.8.0.jar,可从地址“http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi”下载;最新版本的连接池的JAR包为commons-pool2-2.9.0.jar,可从地址“http://commons.apache.org/proper/commons-pool/download_pool.cgi”下载。
02、MapperScannerConfigurer方式
一般情况下,将数据源及MyBatis工厂配置在Spring的配置文件中,实现MyBatis与Spring的无缝整合。在Spring的配置文件中,首先,使用org.apache.commons.dbcp2.BasicDataSource配置数据源。其次,使用org.springframework.jdbc.datasource.DataSourceTransactionManager为数据源添加事务管理器。最后,使用org.mybatis.spring.SqlSessionFactoryBean配置MyBatis工厂,同时指定数据源,并与MyBatis完美整合。
使用Spring管理MyBatis的数据操作接口的方式有多种。其中,最常用最简捷的一种是基于org.mybatis.spring.mapper.MapperScannerConfigurer的整合,实现Mapper代理开发。MapperScannerConfigurer将包()中所有接口自动装配为MyBatis映射接口Mapper的实现类的实例(映射器),所有映射器都被自动注入SqlSessionFactory实例,同时扫描包中SQL映射文件,MyBatis核心配置文件不再加载SQL映射文件(但要保证接口与SQL映射文件名相同)。配置文件的示例代码如下:
<!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <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="maxTotal" value="${jdbc.maxTotal}" /> <!-- 最大空闲连接数 --> <property name="maxIdle" value="${jdbc.maxIdle}" /> <!-- 初始化连接数 --> <property name="initialSize" value="${jdbc.initialSize}" /> </bean> <!-- 添加事务支持 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 开启事务注解 --> <tx:annotation-driven transaction-manager="txManager" /> <!-- 配置MyBatis工厂,同时指定数据源,并与MyBatis完美整合 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- configLocation的属性值为MyBatis的核心配置文件 --> <property name="configLocation" value="classpath:config/mybatis-config.xml" /> </bean> <!--Mapper代理开发,MapperScannerConfigurer将包中所有接口自动装配为MyBatis映射接口Mapper的实现类的实例(映射器),所有映射器都被自动注入SqlSessionFactory实例,同时扫描包中SQL映射文件,MyBatis核心配置文件不再加载SQL映射文件 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- mybatis-spring组件的扫描器,basePackage:属性可以包含多个包名,多个包名之间可以用逗号或分号隔开 --> <property name="basePackage" value="dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean>
03、整合示例
下面通过SSM框架整合,实现【例3-2】的功能。
【例3-2】SSM框架整合开发。
具体实现步骤如下。
1●创建Web应用并导入相关JAR包
使用Eclipse创建一个名为ch3_2的Web应用,将相关JAR包复制到WEB-INF/lib目录中。
2●创建数据库连接信息属性文件及Log4j的日志配置文件
在应用ch3_2的src目录下,创建名为config的包,并在该包中创建数据库连接信息属性文件jdbc.properties文件,具体内容如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8
jdbc.username=root
jdbc.password=root
jdbc.maxTotal=30
jdbc.maxIdle=10
jdbc.initialSize=5
在应用ch3_2的src目录下,创建Log4j的日志配置文件log4j.properties文件.
3●创建持久化类
在应用ch3_2的src目录下,创建一个名为com.mybatis.po的包,并在该包中创建持久化类MyUser。
4●创建SQL映射文件
在应用ch3_2的src目录下,创建一个名为com.mybatis.mapper的包,并在该包中创建SQL映射文件UserMapper.xml。
5●创建MyBatis的核心配置文件
在应用ch3_2的config包中,创建MyBatis的核心配置文件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> <settings> <setting name="logImpl" value="LOG4J" /> </settings> <typeAliases> <package name="com.mybatis.po" /> </typeAliases> </configuration>
6●创建Mapper接口
在应用ch3_2的com.mybatis.mapper包中,创建接口UserMapper。使用@Repository注解标注该接口是数据访问层。该接口中的方法与SQL映射文件UserMapper.xml的id一致。UserMapper接口的核心代码如下:
@Repository public interface UserMapper { public MyUser selectUserById(Integer id); public List<MyUser> selectAllUser(); public int addUser(MyUser myUser); public int updateUser(MyUser myUser); public int deleteUser(Integer id); }
7●创建控制类
在应用ch3_2的src目录下,创建一个名为controller的包,并在该包中创建控制器类TestController。在该控制器类中,调用Mapper接口中的方法操作数据库,核心代码如下:
@Controller public class TestController { @Autowired private UserMapper userMapper; @RequestMapping("/test") public String test() { //查询一个用户 MyUser mu = userMapper.selectUserById(1); System.out.println(mu); //添加一个用户 MyUser addmu = new MyUser(); addmu.setUname("陈恒"); addmu.setUsex("男"); userMapper.addUser(addmu); //修改一个用户 MyUser updatemu = new MyUser(); updatemu.setUid(1); updatemu.setUname("张三"); updatemu.setUsex("女"); userMapper.updateUser(updatemu); //删除一个用户 userMapper.deleteUser(3); //查询所有用户 List<MyUser> listMu = userMapper.selectAllUser(); for (MyUser myUser : listMu) { System.out.println(myUser); } return "test"; } }
8●创建测试页面
在/WEB-INF/目录下,创建一个名为jsp的文件夹,并在该文件夹中创建test.jsp文件
9●创建Web、Spring、Spring MVC的配置文件
在应用ch3_2的config包中创建Spring配置文件applicationContext.xml和Spring MVC配置文件springmvc.xml,在应用ch3_2的/WEB-INF/目录中创建Web配置文件web.xml。
在Spring配置文件applicationContext.xml中,首先,使用加载数据库连接信息属性文件;其次,使用org.apache.commons.dbcp2.BasicDataSource配置数据源,并使用org.springframework.jdbc.datasource.DataSourceTransactionManager为数据源添加事务管理器;再次,使用org.mybatis.spring.SqlSessionFactoryBean配置MyBatis工厂,同时指定数据源,并与MyBatis完美整合;最后,使用org.mybatis.spring.mapper.MapperScannerConfigurer实现Mapper代理开发,将basePackage属性指定包中所有接口自动装配为MyBatis映射接口Mapper的实现类的实例(映射器),所有映射器都被自动注入SqlSessionFactory实例,同时扫描包中SQL映射文件,MyBatis核心配置文件不再加载SQL映射文件。Spring配置文件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: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.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 加载数据库配置文件 --> <context:property-placeholder location="classpath:config/db.properties" /> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <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="maxTotal" value="${jdbc.maxTotal}" /> <!-- 最大空闲连接数 --> <property name="maxIdle" value="${jdbc.maxIdle}" /> <!-- 初始化连接数 --> <property name="initialSize" value="${jdbc.initialSize}" /> </bean> <!-- 添加事务支持 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 开启事务注解 --> <tx:annotation-driven transaction-manager="txManager" /> <!-- 配置MyBatis工厂,同时指定数据源,并与MyBatis完美整合 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:config/mybatis-config.xml" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.mybatis.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean> </beans>
在Spring MVC配置文件springmvc.xml中,使用扫描控制器包,并使用org.springframework.web.servlet.view.InternalResourceViewResolver配置视图解析器。具体代码如下:
<?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:component-scan base-package="controller"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
在Web配置文件web.xml中,首先通过加载Spring配置文件applicationContext.xml,并通过org.springframework.web.context.ContextLoaderListener启动Spring容器;其次配置Spring MVC DispatcherServlet,并加载Spring MVC配置文件springmvc.xml。Web配置文件web.xml的代码如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <!-- 实例化ApplicationContext容器 --> <context-param> <!-- 加载applicationContext.xml文件 --> <param-name>contextConfigLocation</param-name> <param-value> classpath:config/applicationContext.xml </param-value> </context-param> <!-- 指定以ContextLoaderListener方式启动Spring容器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--配置Spring MVC DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!-- classpath是指到src目录查找配置文件 --> <param-value>classpath:config/springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
10●测试应用
发布应用ch3_2到Web服务器Tomcat后,通过地址http://localhost:8080/ch3_2/test测试应用。成功运行后,控制台信息输出结果,如图3.4所示。
04、SqlSessionDaoSupport方式
在MyBatis中,当我们编写好访问数据库的映射器接口后,MapperScannerConfigurer就能自动根据这些接口生成DAO对象,然后使用@Autowired把这些DAO对象注入到业务逻辑层或控制层。因此,在这种情况下的DAO层中,几乎不用编写代码,而且也没有地方编写,因为只有接口。这固然方便,不过当我们需要在DAO层写代码时,这种方式就无能为力。幸运的是,MyBatis-Spring提供了继承SqlSessionDaoSupport类的方式访问数据库。
类org.mybatis.spring.support.SqlSessionDaoSupport继承了org.springframework.dao.support.DaoSupport类,是一个抽象类,是作为DAO的基类使用,需要一个SqlSessionFactory。我们在继承SqlSessionDaoSupport类的子类中通过调用SqlSessionDaoSupport类的getSqlSession()方法来获取这个SqlSessionFactory提供的SqlSessionTemplate对象。而SqlSessionTemplate类实现了SqlSession接口,即可以进行数据库访问。所以,我们需要Spring框架给SqlSessionDaoSupport类的子类的对象(多个DAO对象)注入一个SqlSessionFactory。
但自mybatis-spring-1.2.0以来,SqlSessionDaoSupport的setSqlSessionTemplate和setSqlSessionFactory两个方法上的@Autowired注解被删除,这就意味着继承于SqlSessionDaoSupport的DAO类,它们的对象不能被自动注入SqlSessionFactory或SqlSessionTemplate对象。如果在Spring的配置文件中一个一个地配置的话,显然太麻烦。比较好的解决办法是在我们的DAO类中覆盖这两个方法之一,并加上@Autowired或@Resource注解。那么如果在每个DAO类中都这么做的话,显然很低效。更合理的做法是,写一个继承于SqlSessionDaoSupport的 BaseDao,在BaseDao中完成这个工作,然后其他的DAO类再都BaseDao继承。BaseDao的示例代码如下:
package dao; import javax.annotation.Resource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.support.SqlSessionDaoSupport; public class BaseDao extends SqlSessionDaoSupport { //依赖注入sqlSession工厂 @Resource(name = "sqlSessionFactory") public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { super.setSqlSessionFactory(sqlSessionFactory); } }
下面通过实例讲解继承SqlSessionDaoSupport类的方式访问数据库。
【例3-3】【例3-2】的基础上,实现继承SqlSessionDaoSupport类的方式访问数据库。
1●创建Web应用并导入相关JAR包
使用Eclipse创建一个名为ch3_3的Web应用,将相关JAR包复制到WEB-INF/lib目录中。
2●复制数据库连接信息属性文件及Log4j的日志配置文件
在应用ch3_3的src目录下,创建名为config的包,将应用ch3_3的数据库连接信息属性文件jdbc.properties文件复制到该包中。
将应用ch3_2的Log4j日志配置文件log4j.properties文件,复制到ch3_3的src目录中,并将其中的“log4j.logger.com.mybatis.mapper=DEBUG”修改为“log4j.logger.dao=DEBUG”。
3●创建持久化类
在应用ch3_3的src目录下,创建一个名为po的包,并在该包中创建持久化类MyUser。
4●创建SQL映射文件
在应用ch3_3的src目录下,创建一个名为dao的包,并在该包中创建SQL映射文件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="dao.UserMapper"> <!-- 根据uid查询一个用户信息 --> <select id="selectUserById" parameterType="Integer" resultType="MyUser"> select * from user where uid = #{uid} </select> <!-- 查询所有用户信息 --> <select id="selectAllUser" resultType="MyUser"> select * from user </select> </mapper>
5●创建MyBatis的核心配置文件
在应用ch3_3的config包中,创建MyBatis的核心配置文件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> <settings> <setting name="logImpl" value="LOG4J" /> </settings> <typeAliases> <package name="po" /> </typeAliases> <!-- 告诉 MyBatis到哪里去找映射文件 --> <mappers> <mapper resource="dao/UserMapper.xml"/> </mappers> </configuration>
6●创建DAO接口和接口实现类
在应用ch3_3的dao包中,创建接口UserMapper。UserMapper接口代码如下:
package dao; import java.util.List; import po.MyUser; public interface UserMapper { public MyUser selectUserById(int id); public List<MyUser> selectAllUser(); }
在应用ch3_3的dao包中,创建BaseMapper类,在该类中使用@Resource(name = "sqlSessionFactory")注解依赖注入sqlSession工厂。BaseMapper类的核心代码如下:
public class BaseMapper extends SqlSessionDaoSupport { //依赖注入sqlSession工厂 @Resource(name = "sqlSessionFactory") public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { super.setSqlSessionFactory(sqlSessionFactory); } }
在应用ch3_3的dao包中,创建接口UserMapper的实现类UserMapperImpl,在该类中使用@Repository注解标注该类的实例是数据访问对象。UserMapperImpl类的核心代码如下:
@Repository public class UserMapperImpl extends BaseMapper implements UserMapper { public MyUser selectUserById(int id) { //获取SqlSessionFactory提供的SqlSessionTemplate对象 SqlSession session = getSqlSession(); return session.selectOne("dao.UserMapper.selectUserById", id); } public List<MyUser> selectAllUser() { SqlSession session = getSqlSession(); return session.selectList("dao.UserMapper.selectAllUser"); } }
7●创建控制类
在应用ch3_3的src目录下,创建一个名为controller的包,并在该包中创建控制器类MyController。在该控制器类中,调用UserMapper接口中的方法操作数据库,核心代码如下:
@Controller public class MyController { @Autowired private UserMapper userMapper; @RequestMapping("/test") public String test() { // 查询一个用户 MyUser mu = userMapper.selectUserById(1); System.out.println(mu); // 查询所有用户 List<MyUser> listMu = userMapper.selectAllUser(); for (MyUser myUser : listMu) { System.out.println(myUser); } return "test"; } }
8●创建测试页面
在/WEB-INF/目录下,创建一个名为jsp的文件夹,并在该文件夹中创建test.jsp文件
9●创建Web、Spring、Spring MVC的配置文件
在应用ch3_3的config包中创建Spring配置文件applicationContext.xml和Spring MVC配置文件springmvc.xml,在应用ch3_3的/WEB-INF/目录中创建Web配置文件web.xml。
在Spring配置文件applicationContext.xml中,首先,使用加载数据库连接信息属性文件;其次,使用org.apache.commons.dbcp2.BasicDataSource配置数据源,并使用org.springframework.jdbc.datasource.DataSourceTransactionManager为数据源添加事务管理器;最后,使用org.mybatis.spring.SqlSessionFactoryBean配置MyBatis工厂,同时指定数据源,并与MyBatis完美整合。Spring配置文件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: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.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 加载数据库配置文件 --> <context:property-placeholder location="classpath:config/db.properties" /> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <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="maxTotal" value="${jdbc.maxTotal}" /> <!-- 最大空闲连接数 --> <property name="maxIdle" value="${jdbc.maxIdle}" /> <!-- 初始化连接数 --> <property name="initialSize" value="${jdbc.initialSize}" /> </bean> <!-- 添加事务支持 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 开启事务注解 --> <tx:annotation-driven transaction-manager="txManager" /> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:config/mybatis-config.xml"></property> </bean> </beans>
在Spring MVC配置文件springmvc.xml中,使用扫描包,并使用org.springframework.web.servlet.view.InternalResourceViewResolver配置视图解析器。具体代码如下:
<?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:component-scan base-package="controller"/> <context:component-scan base-package="dao"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
在Web配置文件web.xml中,首先通过加载Spring配置文件applicationContext.xml,并通过org.springframework.web.context.ContextLoaderListener启动Spring容器;其次配置Spring MVC DispatcherServlet,并加载Spring MVC配置文件springmvc.xml。
10●测试应用
发布应用ch3_3到Web服务器Tomcat后,通过地址http://localhost:8080/ch3_3/test测试应用。
小结:
全新的专栏可能文章还是有点不成熟,希望大家多提点建议,我也会愈加完善专栏及文章。