• Spring集成MyBatis的使用-使用SqlSessionTemplate


    Spring集成MyBatis的使用

    Spring集成MyBatis,早期是使用SqlSessionTemplate,当时并没有用Mapper映射器,既然是早期,当然跟使用Mapper映射器是存在一些区别的,比如映射文件命名空间不需要跟接口名一样,接口中的方法不一定跟sql的id一样,通过它的SqlSessionTemplate的使用,在具体实现类中可以实现找到对应的sql

    Spring-Mybatis集成方式二-使用SqlSessionTemplate

    step1 导包spring-webmvc,mybatis,mybatis-spring,dbcp,ojdbc,spring-jdbc,junit

    同Mapper映射器中的配置方式

    step2 添加Spring配置文件,不再需要Mybatis的配置文件可以在Spring配置文件中,添加SqlSessionFactoryBean来代替,且不需要配置MapperScannerConfigurer,而是配置SqlSessionTemplate

    <?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:util="http://www.springframework.org/schema/util"  
        xmlns:jee="http://www.springframework.org /schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:jpa="http://www.springframework.org/schema/data/jpa" 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.2.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
            http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">    
                  
            <!-- 配置连接池 -->               
            <!-- 读取属性文件 -->
            <util:properties id="db" location="classpath:config.properties">    
            </util:properties>
            <!-- 配置连接池,可以参考DBUtil的方法,这里采用spring创建连接池-->
            <!-- destroy-method方法作用是:当spring容器关闭后,会将连接释放回到连接池,避免资源浪费 -->
            <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
             <property name="driverClassName" value="#{db.driver}"/>
             <property name="url" value="#{db.url}" />
             <property name="username" value="#{db.user}" />
             <property name="password" value="#{db.pwd}" />
            </bean>
            
            <!-- 配置SqlSessionFactoryBean -->
            <bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
             <!-- 指定连接资源 -->
             <property name="dataSource" ref="ds"/>
             <!-- 指定映射文件:entity包下的所有后缀xml的映射文件 -->
             <property name="mapperLocations" value="classpath:entity/*.xml"/>
            </bean>
            
            <!-- 配置SqlSessionTemplate -->
            <bean id="sst" class="org.mybatis.spring.SqlSessionTemplate">
             <!-- 采用构造器方式注入SqlSessionFactoryBean,注入第一个参数 -->
             <constructor-arg index="0" ref="ssfb"></constructor-arg>
            </bean>
                    
            <!-- 配置组件扫描 -->
            <context:component-scan base-package="dao"></context:component-scan>
    </beans>

    step3 写实体类,属性名和表格的字段名一样

    同Mapper映射器中的配置方式

    step4 EmpMapper.xml映射文件namespace不再要求等同接口名,可以随便取,如取名newname,后续将在具体实现类中使用

    <?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="newname"><!-- 如果不是采用Mapper映射器,命名空间随便写,不做要求 -->
      <!-- id要求唯一 
           parameterType:填写实体类的完整名字
      -->
      <!-- 插入语句 -->
      <insert id="save" parameterType="entity.Employee">
       INSERT INTO T_TABLE VALUES(6,#{name},#{age})
      </insert>
      <!-- 根据id查询语句 -->
      <select id="findByID" parameterType="int" resultType="entity.Employee">
       SELECT * FROM T_TABLE WHERE ID=#{id}
      </select>
      <!-- 查询所有结果,不需要参数类型 -->
      <select id="findAll" resultType="entity.Employee">
      SELECT * FROM T_TABLE
      </select>
      <!-- 修改操作 -->
      <update id="modify" parameterType="entity.Employee">
      UPDATE T_TABLE SET NAME=#{name},AGE=#{age} WHERE ID=#{id}
      </update>
      <!-- 删除操作 -->
      <delete id="delete" parameterType="int">
      DELETE FROM T_TABLE WHERE ID=#{ididid} 
      </delete>
      
      <!-- 返回map类型的结果 -->
      <!-- 也可以将返回结果简写成map,map即为java.util.Map -->
      <select id="findOne" parameterType="int" resultType="java.util.Map">
       SELECT * FROM T_TABLE WHERE ID=#{id}
      </select>
      
      <!-- 使用resultMap解决表的字段名和实体类的属性名不一致的情况 -->
      <resultMap id="resultMapID" type="entity.NewEmployee">
        <result property="empID" column="id" />
        <result property="empName" column="name" />
        <result property="empAge" column="age" />
      </resultMap>
      
      <select id="findOneByNewEmp" parameterType="int" resultMap="resultMapID">
      SELECT * FROM T_TABLE WHERE ID=#{id}
      </select>
      
    </mapper>

    step5 写一个DAO接口,接口方法没有特定要求,本例没有做修改

    import java.util.List;
    import java.util.Map;
    import org.springframework.stereotype.Repository;
    import entity.Employee;
    import entity.NewEmployee;
    /**
     * Mapper映射器,接口方法不一定跟EmpMapper.xml中写的sql的id一致,本例中没有修改
     * @author clyang
     */
    public interface EmployeeDAO {
        
        //将一条数据插入数据库
        public void save(Employee e);
        //查询所有结果
        public List<Employee> findAll();
        //根据id来查找结果
        public Employee findByID(int id);
        //修改操作
        public void modify(Employee e);
        //删除操作
        public void delete(int id);
        //返回类型为map的查询,根据id来查询
        public Map findOne(int id);
        //当表的字段名和实体类的属性名不一致时,根据id来查询
        public NewEmployee findOneByNewEmp(int id);
        
    }

    step6 再写一个实现类实现这个接口,在接口的实现方法里写具体的方法,在里面使用注入SqlSessionTemplate,调用其API,实现跟映射文件中sql的关联。

    SqlSessionTemplate其对SqlSession进行了封装,为线程安全接口

    import java.util.List;
    import java.util.Map;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Repository;
    import entity.Employee;
    import entity.NewEmployee;
    @Repository("empDAO")
    public class EmployeeDAOImpl implements EmployeeDAO{
        
        //注入SqlsessionTemplate
        @Autowired
        @Qualifier("sst")
        private SqlSessionTemplate sst;
        /**
         * 不用考虑提交事务和关闭SqlSession,SqlSessionTemplate为线程安全接口
         */
        public void save(Employee e) {
            sst.insert("newname.save",e);        
        }
    
        public List<Employee> findAll() {
            return sst.selectList("newname.findAll");
        }
    
        public Employee findByID(int id) {
            return sst.selectOne("newname.findByID", id);
        }
    
        public void modify(Employee e) {
            sst.update("newname.modify", e);        
        }
    
        public void delete(int id) {
            sst.delete("newname.delete",id);        
        }
    
        public Map findOne(int id) {
          return sst.selectOne("newname.findOne",id);
        }
    
        public NewEmployee findOneByNewEmp(int id) {
            return sst.selectOne("newname.findOneByNewEmp",id);
        }
    }

    看大这里,就明白为什么不需要接口方法跟映射文件中的sql的id名字一样,命名空间也不做要求了,因为实现类方法中已经指明了。

    测试代码:

    import java.util.List;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import dao.EmployeeDAO;
    import entity.Employee;
    
    public class testCase {
        @Test
        public void test1() {
            //启动spring容器
            String config="spring-mybatis.xml";
            ApplicationContext ac=new ClassPathXmlApplicationContext(config);
            //调用EmployeeDAOImpl实现类,使用父类接口指向子类对象
            EmployeeDAO dao=ac.getBean("empDAO",EmployeeDAO.class);
            //调用查询方法
            List<Employee> list=dao.findAll();
            System.out.println(list);
            //不需要手动关闭连接
        }
    }

    测试结果:OK

    总结:使用SqlSessionTemplate跟使用Mapper映射器配置方法整体区别不大,为早期的使用方法,主要为需要有实现类,实现类要依赖注入SqlSessionTemplate,然后使用它的API实现对数据库的操作。

  • 相关阅读:
    [面试题]什么是面向对象编程
    面向对象编程的新手理解
    Object of type type is not JSON serializable
    STL---map
    STL---llist
    Div标签使用inline-block有间距
    STL---vector
    KMP算法
    算法06
    算法05
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/10354152.html
Copyright © 2020-2023  润新知