1.Spring+MyBatis整合,和昨天的略有区别
1.1新建一个名为ssm的web工程
1.2导入相关jar文件
jar文件的百度云分享链接:http://pan.baidu.com/s/1bp3bZKN 密码:gtew
1.3新建数据库脚本
-- 删除数据库 drop database if exists mybatis; -- 创建数据库 create database if not exists mybatis default character set utf8; -- 使用数据库 use mybatis; -- 删除数据表 drop table if exists emps; -- 创建数据表 create table emps( eid int primary key, ename varchar(20), esal double(8,2), esex varchar(4) );
1.4建立emps对应的实体类cn.vo.Emp类
package cn.vo; import java.io.Serializable; @SuppressWarnings("serial") public class Emp implements Serializable { private Integer id; private String name; private Double sal; private String sex; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getSal() { return sal; } public void setSal(Double sal) { this.sal = sal; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
1.5在cn.vo包下建立EmpMapper.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="cn.vo.Emp"> <resultMap type="cn.vo.Emp" id="empMap"> <id column="eid" property="id"/> <result column="ename" property="name"/> <result column="esex" property="sex"/> <result column="esal" property="sal"/> </resultMap> <insert id="add" parameterType="cn.vo.Emp"> insert into emps(eid,ename,esex,esal) values(#{id},#{name},#{sex},#{sal}) </insert> </mapper>
1.6在src下新建mybatis.cfg.xml文件,但是因为我们现在是与Spring整合,所以在mybatis.cfg.xml文件中不需要配置数据库连接信息,而是让Spring通过c3p0来管理数据库连接。只需要将EmpMapper.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> <!-- <environments default="mysql_developer"> <environment id="mysql_developer"> <transactionManager type="jdbc"/> <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="mysqladmin"/> </dataSource> </environment> <environment id="oracle_developer"> <transactionManager type="jdbc"/> <dataSource type="pooled"> <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </dataSource> </environment> </environments> --> <!-- 加载映射文件 --> <mappers> <mapper resource="cn/vo/EmpMapper.xml"/> </mappers> </configuration>
1.7在src目录下新建applicationContext.xml文件
1.7.1配置c3p0,用来管理数据库连接
<!-- 配置c3p0连接池,用来管理数据库连接 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/mybatis"/> <property name="user" value="root"/> <property name="password" value="mysqladmin"></property> </bean>
1.7.2配置SqlSessionFactory来加载数据源和映射文件
<!-- Hibernate与Spring整合的时候, 通过LocalSessionFactoryBean来管理Hibernate的相关配置文件 那么MyBatis与Spring整合的时候, 通过什么来管理Mybatis的相关配置文件呢? 、 org.mybatis.spring.SqlSessionFactoryBean, 用来替代原来的MyBatisUtil.java工具类的作用 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis.cfg.xml"/> <property name="dataSource" ref="dataSource"></property> </bean>
1.7.3配置MyBatis的事务管理器
<!-- 配置MyBatis的事务管理器, 即因为MyBatis底层用的是JDBC事务管理器 所以这里依然配置JDBC事务管理器 --> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
1.7.4配置事务通知
<!-- 事务通知,即让那些方法需要事务支持 --> <tx:advice id="advice" transaction-manager="dataSourceTransactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
1.7.5配置事务切入
<!-- 配置事务切入,即让那些包下的类中的方法需要事务支持 一般切入到业务层,这里为了方便就切入到持久层 --> <aop:config> <aop:pointcut expression="execution(* cn.dao.*.*(..))" id="pointcut"/> <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/> </aop:config>
1.7.6配置SqlSessionTemplate
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
1.7.7注册EmpDAO
<!-- 注册EmpDAO --> <bean id="empDAO" class="cn.dao.EmpDAO"> <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/> </bean>
此时的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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 配置c3p0连接池,用来管理数据库连接 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/mybatis"/> <property name="user" value="root"/> <property name="password" value="mysqladmin"></property> </bean> <!-- Hibernate与Spring整合的时候, 通过LocalSessionFactoryBean来管理Hibernate的相关配置文件 那么MyBatis与Spring整合的时候, 通过什么来管理Mybatis的相关配置文件呢? 、 org.mybatis.spring.SqlSessionFactoryBean, 用来替代原来的MyBatisUtil.java工具类的作用 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis.cfg.xml"/> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置MyBatis的事务管理器, 即因为MyBatis底层用的是JDBC事务管理器 所以这里依然配置JDBC事务管理器 --> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 事务通知,即让那些方法需要事务支持 --> <tx:advice id="advice" transaction-manager="dataSourceTransactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- 配置事务切入,即让那些包下的类中的方法需要事务支持 一般切入到业务层,这里为了方便就切入到持久层 --> <aop:config> <aop:pointcut expression="execution(* cn.dao.*.*(..))" id="pointcut"/> <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/> </aop:config> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> <!-- 注册EmpDAO --> <bean id="empDAO" class="cn.dao.EmpDAO"> <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/> </bean> </beans>
1.8在cn.dao包下创建EmpDAO.java类
package cn.dao; import org.mybatis.spring.SqlSessionTemplate; import cn.vo.Emp; public class EmpDAO { private SqlSessionTemplate sqlSessionTemplate; public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate; } // private SqlSessionFactory sqlSessionFactory; // public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { // this.sqlSessionFactory = sqlSessionFactory; // } public void add(Emp vo) throws Exception{ // SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSessionTemplate.insert(Emp.class.getName()+".add", vo); } }
1.9测试代码
@Test public void testSpringMybatis() throws Exception{ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); EmpDAO dao = context.getBean("empDAO", EmpDAO.class); Emp vo = new Emp(); vo.setId(4); vo.setName("嘻嘻"); vo.setSal(6000.0); vo.setSex("男"); dao.add(vo); }
2.SpringMVC+mybatis+Spring整合
在前面的基础之上,加入SpringMVC进行整合。
不需要导入jar包了,因为前面已经导入了
在web.xml文件下配置核心控制器DispatcherServlet和编码过滤器CharacterEncodingFilter。
<!-- 配置SpringMVC核心控制器 --> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <!-- 配置编码过滤器 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在src目录下新建cn.action.EmpAction.java类
package cn.action; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import cn.dao.EmpDAO; import cn.vo.Emp; /** * 控制器 * @author Administrator * */ @Controller @RequestMapping("/emp") public class EmpAction { @Resource private EmpDAO empDAO; public void setDao(EmpDAO empDAO) { this.empDAO = empDAO; } /** * 注册员工 */ @RequestMapping("/register") public String register(Emp emp) throws Exception{ //本次不写业务层,直接调用数据访问层,即持久层 this.empDAO.add(emp); return "/jsp/success.jsp"; } }
在webRoot目录下新建jsp文件下,并在jsp文件夹下新建success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>成功页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 成功啦 </body> </html>
在webRoot下新建一个名为register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>员工注册</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="emp/register.action" method="post"> <table border="2" align="center"> <tr> <td>编号</td> <td><input type="text" name="id" value="6"/></td> </tr> <tr> <td>姓名</td> <td><input type="text" name="name" value="笨笨"/></td> </tr> <tr> <td>性别</td> <td> <input type="radio" name="sex" value="女"/>女 <input type="radio" name="sex" value="男" checked="checked"/>男 </td> </tr> <tr> <td>工资</td> <td><input type="text" name="sal" value="6000.1"/></td> </tr> <tr> <td colspan="2"> <input type="submit" value="注册"/> </td> </tr> </table> </form> </body> </html>
在applicationContext.xml文件中配置组件扫描
<!-- 注册EmpAction --> <context:component-scan base-package="cn"/>
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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 配置c3p0连接池,用来管理数据库连接 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/mybatis"/> <property name="user" value="root"/> <property name="password" value="mysqladmin"></property> </bean> <!-- Hibernate与Spring整合的时候, 通过LocalSessionFactoryBean来管理Hibernate的相关配置文件 那么MyBatis与Spring整合的时候, 通过什么来管理Mybatis的相关配置文件呢? 、 org.mybatis.spring.SqlSessionFactoryBean, 用来替代原来的MyBatisUtil.java工具类的作用 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis.cfg.xml"/> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置MyBatis的事务管理器, 即因为MyBatis底层用的是JDBC事务管理器 所以这里依然配置JDBC事务管理器 --> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 事务通知,即让那些方法需要事务支持 --> <tx:advice id="advice" transaction-manager="dataSourceTransactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- 配置事务切入,即让那些包下的类中的方法需要事务支持 一般切入到业务层,这里为了方便就切入到持久层 --> <aop:config> <aop:pointcut expression="execution(* cn.dao.*.*(..))" id="pointcut"/> <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/> </aop:config> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> <!-- 注册EmpDAO --> <bean id="empDAO" class="cn.dao.EmpDAO"> <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/> </bean> <!-- 注册EmpAction --> <context:component-scan base-package="cn"/> </beans>