首页 > 代码库 > MyBatis系列:(9)mybatis-spring-springmvc-oracle/mysql整合

MyBatis系列:(9)mybatis-spring-springmvc-oracle/mysql整合


大体思路:首先是配置好mybatis的环境,其次就是mybatis与spring的整合,其整合的目标是①mybatis的SqlSessionFactory交由Spring来创建②mybatis的事务交由Spring来处理;最后就是springmvc的融入,使得mybatis(dao层)、spring(中间层)、springmvc(web层)融为一体。


1、MyBatis环境配置

步骤:jar包->SQL语句->entity->dao

1.1、引入jar包

mybatismybatis-3.2.7.jar
mybatis的支持包

asm-3.3.1.jar

commons-logging-1.1.1.jar

log4j-1.2.17.jar

oracleojdbc5.jar


1.2、SQL语句

OracleSQL

create table emps(
	eid number(1) primary key,
	ename varchar2(20),
	esal number(6,2),
	egender varchar2(3)
);


1.3、entity

Emp.java

package com.rk.entity;

public class Emp {
    private Integer id;
    private String name;
    private Double sal;
    private String gender;
    public Emp(){}
    
    public Emp(Integer id, String name, Double sal, String gender) {
        this.id = id;
        this.name = name;
        this.sal = sal;
        this.gender = gender;
    }

    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 getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    
}


1.4、dao

EmpDao.java

package com.rk.dao;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.rk.entity.Emp;

public class EmpDao {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            Reader reader = Resources.getResourceAsReader("mybatis.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public void add(Emp emp)throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("empNamespace.add", emp);
        sqlSession.commit();
        sqlSession.close();
    }
}


1.5、mybatis的映射文件(EmpMapper.xml)和主配置文件(mybatis.xml)

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="empNamespace">
    <resultMap type="com.rk.entity.Emp" id="empResultMap">
        <id property="id" column="eid"/>
        <result property="name" column="ename"/>
        <result property="sal" column="esal"/>
        <result property="gender" column="egender"/>
    </resultMap>
    <insert id="add" parameterType="com.rk.entity.Emp">
        insert into emps(eid,ename,esal,egender) values(#{id},#{name},#{sal},#{gender})
    </insert>
</mapper>

mybatis.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>
    <properties resource="db.properties"/>
    <environments default="oracle_development">
        <environment id="oracle_development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="http://www.mamicode.com/${oracle.driver}"/>
                <property name="url" value="http://www.mamicode.com/${oracle.url}"/>
                <property name="username" value="http://www.mamicode.com/${oracle.username}"/>
                <property name="password" value="http://www.mamicode.com/${oracle.password}"/>
            </dataSource>
        </environment>
        <environment id="mysql_developer">
            <transactionManager type="jdbc"/>   
            <dataSource type="pooled">
                <property name="driver" value="http://www.mamicode.com/${mysql.driver}"/>
                <property name="url" value="http://www.mamicode.com/${mysql.url}"/>
                <property name="username" value="http://www.mamicode.com/${mysql.username}"/>
                <property name="password" value="http://www.mamicode.com/${mysql.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/rk/entity/EmpMapper.xml"/>
    </mappers>
</configuration>

db.properties

#key=value
oracle.driver=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
oracle.username=scott
oracle.password=tiger

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://127.0.0.1:3306/testdb
mysql.username=root
mysql.password=root


1.6、测试

package com.rk.test;

import org.junit.Test;

import com.rk.dao.EmpDao;
import com.rk.entity.Emp;

public class MybatisTest {

    @Test
    public void testAdd() throws Exception {
        EmpDao dao = new EmpDao();
        Emp emp = new Emp(1, "小明", 800D, "男");
        dao.add(emp);
    }

}


2、Mybatis与Spring整合

(1)MyBatis的SqlSessionFactory交由Spring来创建

(2)Mybatis的事务交由Spring来管理

(3)DAO、Service对象的生成和依赖注入由Spring来完成


2.1、引入需要的jar包

c3p0c3p0-0.9.1.2.jar
spring-core

commons-logging-1.2.jar (mybaits中引入了1.1.1版本,可以删除1.1.1版本)

spring-beans-3.2.5.RELEASE.jar

spring-context-3.2.5.RELEASE.jar

spring-core-3.2.5.RELEASE.jar

spring-expression-3.2.5.RELEASE.jar

spring-aop

aopalliance-.jar

aspectjrt.jar

aspectjweaver.jar

spring-aop-3.2.5.RELEASE.jar

spring-jdbc

spring-jdbc-3.2.5.RELEASE.jar

spring-tx-3.2.5.RELEASE.jar

spring-ormspring-orm-3.2.5.RELEASE.jar
mybatis与spring整合的jar

mybatis-spring-1.2.4.jar

下载地址:https://github.com/mybatis/spring/releases 

版本不同带来的问题:之前引入的是mybatis-spring-1.0.0.jar,后来测试的时候发现错误,错误信息:java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction(Ljavax/sql/DataSource;Lorg/apache/ibatis/session/TransactionIsolationLevel;Z)Lorg/apache/ibatis/transaction/Transaction。换成1.2.4版本后,错误消失。


2.2、修改mybatis.xml

注释或者删除mybatis.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>
    <!--
    <properties resource="db.properties"/>
    <environments default="oracle_development">
        <environment id="oracle_development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="http://www.mamicode.com/${oracle.driver}"/>
                <property name="url" value="http://www.mamicode.com/${oracle.url}"/>
                <property name="username" value="http://www.mamicode.com/${oracle.username}"/>
                <property name="password" value="http://www.mamicode.com/${oracle.password}"/>
            </dataSource>
        </environment>
        <environment id="mysql_developer">
            <transactionManager type="jdbc"/>   
            <dataSource type="pooled">
                <property name="driver" value="http://www.mamicode.com/${mysql.driver}"/>
                <property name="url" value="http://www.mamicode.com/${mysql.url}"/>
                <property name="username" value="http://www.mamicode.com/${mysql.username}"/>
                <property name="password" value="http://www.mamicode.com/${mysql.password}"/>
            </dataSource>
        </environment>
    </environments> 
    -->
    <mappers>
        <mapper resource="com/rk/entity/EmpMapper.xml"/>
    </mappers>
</configuration>


2.3、添加Spring的主配置文件spring.xml


(1)MyBatis的SqlSessionFactory交由Spring来创建

(2)Mybatis的事务交由Spring来管理

(3)DAO、Service对象的生成和依赖注入由Spring来完成



<?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:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 配置C3P0连接池,目的:管理数据库连接 -->
<!-- 
    <bean id="comboPooledDataSourceID" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="http://www.mamicode.com/oracle.jdbc.driver.OracleDriver"></property>
        <property name="jdbcUrl" value="http://www.mamicode.com/jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property>
        <property name="user" value="http://www.mamicode.com/scott"></property>
        <property name="password" value="http://www.mamicode.com/tiger"></property>
    </bean> 
 -->    
    <context:property-placeholder location="classpath:db.properties"/>
    <bean id="comboPooledDataSourceID" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="http://www.mamicode.com/${oracle.driver}"></property>
        <property name="jdbcUrl" value="http://www.mamicode.com/${oracle.url}"></property>
        <property name="user" value="http://www.mamicode.com/${oracle.username}"></property>
        <property name="password" value="http://www.mamicode.com/${oracle.password}"></property>
    </bean> 
    
    <!-- 配置SqlSessionFactoryBean,目的:加载mybaits配置文件和映射文件,即替代原Mybatis工具类的作用 -->
    <bean id="sqlSessionFactoryBeanID" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="comboPooledDataSourceID"></property>
        <property name="configLocation" value="http://www.mamicode.com/classpath:mybatis.xml"></property>
    </bean>
    
    <!-- 配置Mybatis的事务管理器,即DataSourceTransactionManager。
            因为Mybatis底层用的是JDBC事务管事器,所以在这里依然配置JDBC事务管理器 
    -->
    <bean id="dataSourceTransactionManagerID" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="comboPooledDataSourceID"></property>
    </bean>
    
    <!-- 配置事务通知,即让哪些方法需要事务支持 -->
    <tx:advice id="tx" transaction-manager="dataSourceTransactionManagerID">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    
    <!-- 配置事务切面,即让哪些包下的类需要事务 -->
    <aop:config>
        <aop:pointcut  id="pointcut" expression="execution(* com.rk.service.*.*(..))"/>
        <aop:advisor advice-ref="tx" pointcut-ref="pointcut"/>
    </aop:config>
    
    <!-- 注册EmpDao -->
    <bean id="empDaoID" class="com.rk.dao.EmpDao">
        <property name="sqlSessionFactory" ref="sqlSessionFactoryBeanID"></property>
    </bean>
    
    <!-- 注册EmpService -->
    <bean id="empService" class="com.rk.service.EmpService">
        <property name="empDao" ref="empDaoID"></property>
    </bean>
</beans>


2.4、Dao

EmpDao.java

package com.rk.dao;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.rk.entity.Emp;

public class EmpDao {
    private SqlSessionFactory sqlSessionFactory;
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }
    
    public void add(Emp emp) throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("empNamespace.add", emp);
        sqlSession.close();
    }
}


2.5、Serivce

EmpService.java

package com.rk.service;

import com.rk.dao.EmpDao;
import com.rk.entity.Emp;

public class EmpService {
    private EmpDao empDao;
    public void setEmpDao(EmpDao empDao) {
        this.empDao = empDao;
    }
    
    public void register(Emp emp) throws Exception{
//        int i = 1/0;
//        System.out.println(i);
        empDao.add(emp);
    }
}


2.6、测试

package com.rk.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.rk.entity.Emp;
import com.rk.service.EmpService;

public class TestMybatis_Spring {

    @Test
    public void testRegister() throws Exception {
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
        EmpService empService = (EmpService) ac.getBean("empService");
        
        Emp emp = new Emp(3, "小刚", 400D, "男");
        empService.register(emp);
        
    }

}




3、SpringMVC的融入


3.1、引入JAR包

spring-webspring-web-3.2.5.RELEASE.jar
spring-webmvcspring-webmvc-3.2.5.RELEASE.jar


3.2、配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
    <display-name>springmvc-mybatis-oracle</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <!-- 核心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:spring.xml</param-value>
        </init-param>
    </servlet> 
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    
    <!-- POST编码过滤器 -->
    <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>
     
</web-app>



3.3、修改spring.xml

添加以下内容

    <!-- 注册EmpAction -->
    <context:component-scan base-package="com.rk.action"/>  
     
    <!-- 通知springioc容器这些注解的作用 -->     
    <context:annotation-config/>
    
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="http://www.mamicode.com/jsp/"/>
        <property name="suffix" value="http://www.mamicode.com/.jsp"/>
    </bean>

完整的spring.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:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 配置C3P0连接池,目的:管理数据库连接 -->
<!-- 
    <bean id="comboPooledDataSourceID" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="http://www.mamicode.com/oracle.jdbc.driver.OracleDriver"></property>
        <property name="jdbcUrl" value="http://www.mamicode.com/jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property>
        <property name="user" value="http://www.mamicode.com/scott"></property>
        <property name="password" value="http://www.mamicode.com/tiger"></property>
    </bean> 
 -->    
    <context:property-placeholder location="classpath:db.properties"/>
    <bean id="comboPooledDataSourceID" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="http://www.mamicode.com/${oracle.driver}"></property>
        <property name="jdbcUrl" value="http://www.mamicode.com/${oracle.url}"></property>
        <property name="user" value="http://www.mamicode.com/${oracle.username}"></property>
        <property name="password" value="http://www.mamicode.com/${oracle.password}"></property>
    </bean> 
    
    <!-- 配置SqlSessionFactoryBean,目的:加载mybaits配置文件和映射文件,即替代原Mybatis工具类的作用 -->
    <bean id="sqlSessionFactoryBeanID" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="comboPooledDataSourceID"></property>
        <property name="configLocation" value="http://www.mamicode.com/classpath:mybatis.xml"></property>
    </bean>
    
    <!-- 配置Mybatis的事务管理器,即DataSourceTransactionManager。
            因为Mybatis底层用的是JDBC事务管事器,所以在这里依然配置JDBC事务管理器 
    -->
    <bean id="dataSourceTransactionManagerID" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="comboPooledDataSourceID"></property>
    </bean>
    
    <!-- 配置事务通知,即让哪些方法需要事务支持 -->
    <tx:advice id="tx" transaction-manager="dataSourceTransactionManagerID">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    
    <!-- 配置事务切面,即让哪些包下的类需要事务 -->
    <aop:config>
        <aop:pointcut  id="pointcut" expression="execution(* com.rk.service.*.*(..))"/>
        <aop:advisor advice-ref="tx" pointcut-ref="pointcut"/>
    </aop:config>
    
    <!-- 注册EmpDao -->
    <bean id="empDaoID" class="com.rk.dao.EmpDao">
        <property name="sqlSessionFactory" ref="sqlSessionFactoryBeanID"></property>
    </bean>
    
    <!-- 注册EmpService -->
    <bean id="empServiceID" class="com.rk.service.EmpService">
        <property name="empDao" ref="empDaoID"></property>
    </bean>
    
    <!-- 注册EmpAction -->
    <context:component-scan base-package="com.rk.action"/>  
     
    <!-- 通知springioc容器这些注解的作用 -->     
    <context:annotation-config/>
    
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="http://www.mamicode.com/jsp/"/>
        <property name="suffix" value="http://www.mamicode.com/.jsp"/>
    </bean>
</beans>


3.4、添加action

package com.rk.action;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.rk.entity.Emp;
import com.rk.service.EmpService;

@Controller
@RequestMapping(value="http://www.mamicode.com/emp")
public class EmpAction {
    private EmpService empService;
    @Resource(name="empServiceID")
    public void setEmpService(EmpService empService) {
        this.empService = empService;
    }
    @RequestMapping(value="http://www.mamicode.com/registerEmp")
    public String registerEmp(Emp emp) throws Exception{
        empService.register(emp);
        return "success";
    }
}


3.5、添加index.jsp和success.jsp

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta name="content-type" content="text/html; charset=UTF-8"/>
    <title>My JSP ‘index.jsp‘ starting page</title>
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/emp/registerEmp.action" method="POST">
        <table>
            <tr>
                <td>编号:</td>
                <td>
                    <input type="text" name="id"/>
                </td>
            </tr>
            <tr>
                <td>姓名:</td>
                <td>
                    <input type="text" name="name"/>
                </td>
            </tr>
            <tr>
                <td>薪水:</td>
                <td>
                    <input type="text" name="sal"/>
                </td>
            </tr>
            <tr>
                <td>性别:</td>
                <td>
                    <input type="radio" name="gender" value="http://www.mamicode.com/男"/>男
                    <input type="radio" name="gender" value="http://www.mamicode.com/女" checked="checked"/>女
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="http://www.mamicode.com/注册"/>
                </td>
            </tr>
        </table>
    </form>
  </body>
</html>

/jsp/success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta name="content-type" content="text/html; charset=UTF-8"/>
    <title>success page</title>
  </head>
  
  <body>
    success <br>
  </body>
</html>








MyBatis系列:(9)mybatis-spring-springmvc-oracle/mysql整合