码迷,mamicode.com
首页 > 编程语言 > 详细

Spring+MyBatis整合

时间:2016-08-01 23:06:08      阅读:356      评论:0      收藏:0      [点我收藏+]

标签:spring+mybatis整合

1.创建一个web工程。工程名为ssm

2.导入Spring,MyBatis,Oracle和MySQL以及MyBatis提供的与Spring整合的插件包

技术分享

mysql的jar文件:mysql-connector-java-5.1.7-bin.jar

oracle的jar文件:ojdbc5.jar

c3p0的jar文件:c3p0-0.9.1.2.jar

mybatis的jar文件:

    asm-3.3.1.jar

    cglib-2.2.2.jar

    commons-logging-1.1.1.jar

    log4j-1.2.16.jar

    mybatis-3.1.1.jar

mybatis提供的与Spring整合的jar文件:mybatis-spring-1.1.1.jar

Spring core的jar文件:

    org.springframework.asm-3.0.5.RELEASE.jar

    org.springframework.beans-3.0.5.RELEASE.jar

    org.springframework.context-3.0.5.RELEASE.jar

    org.springframework.core-3.0.5.RELEASE.jar

    org.springframework.expression-3.0.5.RELEASE.jar

Spring AOP的jar文件:

    aopalliance.jar

    aspectjweaver.jar

    cglib-2.2.2.jar

    org.springframework.aop-3.0.5.RELEASE.jar

Spring traction的jar文件:

    org.springframework.jdbc-3.0.5.RELEASE.jar

    org.springframework.orm-3.0.5.RELEASE.jar

    org.springframework.transaction-3.0.5.RELEASE.jar

技术分享

百度云链接:http://pan.baidu.com/s/1bp3bZKN 密码:gtew

3.创建一个emps的员工表

-- 删除数据库
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)
);

4.创建Emp.java实体类

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;
    }  
}

创建MyBatisUtil.java工具类

package util; 
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
     private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
        public static SqlSessionFactory sqlSessionFactory ;
        //私有化构造方法
        private MyBatisUtil(){}
        //加载位于src/Mybatis.cfg.xml
        static{
            try {
                Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
                sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } 
        /**
         * 获取SQLSession
         * @return
         */
        public static SqlSession getSqlSession(){
            //从当前线程中获取SqlSession对象
            SqlSession sqlSession = threadLocal.get();
            if(sqlSession == null){
                if(sqlSessionFactory != null){
                    sqlSession = sqlSessionFactory.openSession();
                    //讲sqlSession与当前线程绑定在一起
                    threadLocal.set(sqlSession);
                }
            }
            return sqlSession;
        }
        /**
         * 关闭SqlSession 并与当前线程分开
         */
        public static void closeSqlSession(){
            //从当前线程中获取SqlSession对象
            SqlSession sqlSession = threadLocal.get();
            //如果SqlSession对象非空
            if(sqlSession != null){
                //关闭SqlSession对象
                sqlSession.close();
                //分离当前线程与SqlSession的关系
                threadLocal.remove();
            }
        }
        //测试
        public static void main(String[] args) {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            Connection conn= sqlSession.getConnection();
            System.out.println(conn != null ?"连接成功":"连接失败");
        }  
}

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>

6.在src目录下创建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>
    <!-- 设置一个默认的环境信息 -->
    <environments default="mysql_developer">
        <!-- 连接MySQL环境信息 -->
        <environment id="mysql_developer">
            <!-- MyBatis使用jdbc事务管理器 -->
            <transactionManager type="jdbc"/>
            <!-- MyBatis使用连接池方式来获取连接对象 -->
            <dataSource type="pooled">
                <!-- 配置与数据库交互的4个必要属性 -->
                <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>
        <!-- 连接Oracle环境信息 -->
        <environment id="oracle_developer">
            <!-- MyBatis使用jdbc事务管理器 -->
            <transactionManager type="jdbc"/>
            <!-- MyBatis使用连接池方式来获取连接对象 -->
            <dataSource type="pooled">
                <!-- 配置与数据库交互的4个必要属性 -->
                <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>

7.在cn.dao包创建EmpDAO.java类

package cn.dao;
import org.apache.ibatis.session.SqlSession;
import util.MyBatisUtil;
import cn.vo.Emp;
public class EmpDAO { 
    public void add(Emp vo) throws Exception{
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtil.getSqlSession();
            
            sqlSession.insert(Emp.class.getName()+".add", vo);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
            throw e;
        }finally{
            MyBatisUtil.closeSqlSession();
        }
    }
}

8.在cn.test包下新建EmpDAOTest.java的单元测试类

package test;
import org.junit.Test;
import cn.dao.EmpDAO;
import cn.vo.Emp;
/**
 * 单元测试
 * @author Administrator
 *
 */
public class EmpDAOTest {
    @Test
    public void test() throws Exception{
        EmpDAO dao = new EmpDAO();
        Emp vo = new Emp();
        vo.setId(1);
        vo.setName("哈哈");
        vo.setSal(7000.0);
        vo.setSex("男");
        dao.add(vo);
    }

}

上述是MyBatis的独立运行

下面是与Spring的整合


回顾Hibernate与Spring的整合

c3p0连接池,用来管理连接

LocalSessionFactoryBean,用来管理hibernate相关配置文件

Hibernate事务管理器 HibernateTransactionManager

事务通知,即通知Spring容器那些方法需要事务支持。<tx:advice>

事务切入,即通知Spring容器事务切入到那些包下的那些类中的那些方法

注册EmpDAO

注册EmpService

注册EmpAction


那么MyBatis与Spring整合很相似

那就是在src目录下新建一个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>
</beans>

既然Spring通过c3p0来管理连接,那么mybatis.cfg.xml文件中就不需要配置连接信息了,此时的mybatis.cfg.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>

配置SqlSessionFactoryBean,用来管理MyBatis相关配置文件

           <!-- 
          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的事务管理器,
              即因为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>

事务切入,即通知Spring容器事务切入到那些包下的那些类中的那些方法

           <!-- 
          配置事务切入,即让那些包下的类中的方法需要事务支持 
          一般切入到业务层,这里为了方便就切入到持久层
      -->
      <aop:config>
          <aop:pointcut expression="execution(* cn.dao.*.*(..))" id="pointcut"/>
          <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
      </aop:config>

注册EmpDAO.java类

          <!-- 注册EmpDAO -->
      <bean id="empDAO" class="cn.dao.EmpDAO">
          <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
      </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="sqlSessionFactoryBean" 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>
      
      <!-- 注册EmpDAO -->
      <bean id="empDAO" class="cn.dao.EmpDAO">
          <property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
      </bean>
      
</beans>

那么此时需要修改持久层EmpDAO.java类

package cn.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import cn.vo.Emp;
public class EmpDAO {
    private SqlSessionFactory sqlSessionFactory;
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }
    public void add(Emp vo) throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert(Emp.class.getName()+".add", vo);
    }
}

测试代码

     @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(2);
        vo.setName("呵呵");
        vo.setSal(6000.0);
        vo.setSex("女");
        dao.add(vo);
    }


本文出自 “11831428” 博客,请务必保留此出处http://11841428.blog.51cto.com/11831428/1833191

Spring+MyBatis整合

标签:spring+mybatis整合

原文地址:http://11841428.blog.51cto.com/11831428/1833191

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!