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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util"
  4. xmlns:jee="http://www.springframework.org /schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
  5. xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
  9. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
  10. http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
  11. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  12. http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
  13. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
  14.  
  15. <!-- 配置连接池 -->
  16. <!-- 读取属性文件 -->
  17. <util:properties id="db" location="classpath:config.properties">
  18. </util:properties>
  19. <!-- 配置连接池,可以参考DBUtil的方法,这里采用spring创建连接池-->
  20. <!-- destroy-method方法作用是:当spring容器关闭后,会将连接释放回到连接池,避免资源浪费 -->
  21. <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  22. <property name="driverClassName" value="#{db.driver}"/>
  23. <property name="url" value="#{db.url}" />
  24. <property name="username" value="#{db.user}" />
  25. <property name="password" value="#{db.pwd}" />
  26. </bean>
  27.  
  28. <!-- 配置SqlSessionFactoryBean -->
  29. <bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
  30. <!-- 指定连接资源 -->
  31. <property name="dataSource" ref="ds"/>
  32. <!-- 指定映射文件:entity包下的所有后缀xml的映射文件 -->
  33. <property name="mapperLocations" value="classpath:entity/*.xml"/>
  34. </bean>
  35.  
  36. <!-- 配置SqlSessionTemplate -->
  37. <bean id="sst" class="org.mybatis.spring.SqlSessionTemplate">
  38. <!-- 采用构造器方式注入SqlSessionFactoryBean,注入第一个参数 -->
  39. <constructor-arg index="0" ref="ssfb"></constructor-arg>
  40. </bean>
  41.  
  42. <!-- 配置组件扫描 -->
  43. <context:component-scan base-package="dao"></context:component-scan>
  44. </beans>

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

同Mapper映射器中的配置方式

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5.  
  6. <mapper namespace="newname"><!-- 如果不是采用Mapper映射器,命名空间随便写,不做要求 -->
  7. <!-- id要求唯一
  8. parameterType:填写实体类的完整名字
  9. -->
  10. <!-- 插入语句 -->
  11. <insert id="save" parameterType="entity.Employee">
  12. INSERT INTO T_TABLE VALUES(6,#{name},#{age})
  13. </insert>
  14. <!-- 根据id查询语句 -->
  15. <select id="findByID" parameterType="int" resultType="entity.Employee">
  16. SELECT * FROM T_TABLE WHERE ID=#{id}
  17. </select>
  18. <!-- 查询所有结果,不需要参数类型 -->
  19. <select id="findAll" resultType="entity.Employee">
  20. SELECT * FROM T_TABLE
  21. </select>
  22. <!-- 修改操作 -->
  23. <update id="modify" parameterType="entity.Employee">
  24. UPDATE T_TABLE SET NAME=#{name},AGE=#{age} WHERE ID=#{id}
  25. </update>
  26. <!-- 删除操作 -->
  27. <delete id="delete" parameterType="int">
  28. DELETE FROM T_TABLE WHERE ID=#{ididid}
  29. </delete>
  30.  
  31. <!-- 返回map类型的结果 -->
  32. <!-- 也可以将返回结果简写成map,map即为java.util.Map -->
  33. <select id="findOne" parameterType="int" resultType="java.util.Map">
  34. SELECT * FROM T_TABLE WHERE ID=#{id}
  35. </select>
  36.  
  37. <!-- 使用resultMap解决表的字段名和实体类的属性名不一致的情况 -->
  38. <resultMap id="resultMapID" type="entity.NewEmployee">
  39. <result property="empID" column="id" />
  40. <result property="empName" column="name" />
  41. <result property="empAge" column="age" />
  42. </resultMap>
  43.  
  44. <select id="findOneByNewEmp" parameterType="int" resultMap="resultMapID">
  45. SELECT * FROM T_TABLE WHERE ID=#{id}
  46. </select>
  47.  
  48. </mapper>

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

  1. import java.util.List;
  2. import java.util.Map;
  3. import org.springframework.stereotype.Repository;
  4. import entity.Employee;
  5. import entity.NewEmployee;
  6. /**
  7. * Mapper映射器,接口方法不一定跟EmpMapper.xml中写的sql的id一致,本例中没有修改
  8. * @author clyang
  9. */
  10. public interface EmployeeDAO {
  11.  
  12. //将一条数据插入数据库
  13. public void save(Employee e);
  14. //查询所有结果
  15. public List<Employee> findAll();
  16. //根据id来查找结果
  17. public Employee findByID(int id);
  18. //修改操作
  19. public void modify(Employee e);
  20. //删除操作
  21. public void delete(int id);
  22. //返回类型为map的查询,根据id来查询
  23. public Map findOne(int id);
  24. //当表的字段名和实体类的属性名不一致时,根据id来查询
  25. public NewEmployee findOneByNewEmp(int id);
  26.  
  27. }

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

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

  1. import java.util.List;
  2. import java.util.Map;
  3. import org.mybatis.spring.SqlSessionTemplate;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.beans.factory.annotation.Qualifier;
  6. import org.springframework.stereotype.Repository;
  7. import entity.Employee;
  8. import entity.NewEmployee;
  9. @Repository("empDAO")
  10. public class EmployeeDAOImpl implements EmployeeDAO{
  11.  
  12. //注入SqlsessionTemplate
  13. @Autowired
  14. @Qualifier("sst")
  15. private SqlSessionTemplate sst;
  16. /**
  17. * 不用考虑提交事务和关闭SqlSession,SqlSessionTemplate为线程安全接口
  18. */
  19. public void save(Employee e) {
  20. sst.insert("newname.save",e);
  21. }
  22.  
  23. public List<Employee> findAll() {
  24. return sst.selectList("newname.findAll");
  25. }
  26.  
  27. public Employee findByID(int id) {
  28. return sst.selectOne("newname.findByID", id);
  29. }
  30.  
  31. public void modify(Employee e) {
  32. sst.update("newname.modify", e);
  33. }
  34.  
  35. public void delete(int id) {
  36. sst.delete("newname.delete",id);
  37. }
  38.  
  39. public Map findOne(int id) {
  40. return sst.selectOne("newname.findOne",id);
  41. }
  42.  
  43. public NewEmployee findOneByNewEmp(int id) {
  44. return sst.selectOne("newname.findOneByNewEmp",id);
  45. }
  46. }

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

测试代码:

  1. import java.util.List;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. import dao.EmployeeDAO;
  8. import entity.Employee;
  9.  
  10. public class testCase {
  11. @Test
  12. public void test1() {
  13. //启动spring容器
  14. String config="spring-mybatis.xml";
  15. ApplicationContext ac=new ClassPathXmlApplicationContext(config);
  16. //调用EmployeeDAOImpl实现类,使用父类接口指向子类对象
  17. EmployeeDAO dao=ac.getBean("empDAO",EmployeeDAO.class);
  18. //调用查询方法
  19. List<Employee> list=dao.findAll();
  20. System.out.println(list);
  21. //不需要手动关闭连接
  22. }
  23. }

测试结果:OK

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

Spring集成MyBatis的使用-使用SqlSessionTemplate的更多相关文章

  1. Spring集成Mybatis,spring4.x整合Mybatis3.x

    Spring集成Mybatis,spring4.x整合Mybatis3.x ============================== 蕃薯耀 2018年3月14日 http://www.cnblo ...

  2. Unit08: Spring集成mybatis

    Unit08: Spring集成mybatis 1. Spring集成mybatis (1)方式一 step1. 导包. spring-webmvc,mybatis,mybatis-spring, o ...

  3. Spring集成MyBatis框架

    Java在写数据库查询时,我接触过四种方式: 1.纯Java代码,引用对应的数据库驱动包,自己写连接与释放逻辑(可以用连接池) 这种模式实际上性能是非常不错的,但是使用起来并不是非常方便:一是要手工为 ...

  4. SSM框架开发web项目系列(五) Spring集成MyBatis

    前言 在前面的MyBatis部分内容中,我们已经可以独立的基于MyBatis构建一个数据库访问层应用,但是在实际的项目开发中,我们的程序不会这么简单,层次也更加复杂,除了这里说到的持久层,还有业务逻辑 ...

  5. Spring集成MyBatis的使用-使用Mapper映射器

    Spring集成MyBatis使用 前面复习MyBatis时,发现在测试时,需要手动创建sqlSessionFactory,Spring将帮忙自动创建sqlSessionFactory,并且将自动扫描 ...

  6. spring集成mybatis配置多个数据源,通过aop自动切换

    spring集成mybatis,配置多个数据源并自动切换. spring-mybatis.xml如下: <?xml version="1.0" encoding=" ...

  7. MyBatis从入门到精通(第9章):Spring集成MyBatis(下)

    MyBatis从入门到精通(第9章):Spring集成MyBatis(下) springmvc执行流程原理 mybatis-spring  可以帮助我们将MyBatis代码无缝整合到Spring中.使 ...

  8. MyBatis从入门到精通(第9章):Spring集成MyBatis(中)

    MyBatis从入门到精通(第9章):Spring集成MyBatis(中) 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法.应该将应用自身的设计和具体 ...

  9. MyBatis从入门到精通(第9章):Spring集成MyBatis(上)

    MyBatis从入门到精通(第9章):Spring集成MyBatis(上) Spring是一个为了解决企业级Web应用开发过程中面临的复杂性,而被创建的一个非常流行的轻量级框架. mybatis-sp ...

随机推荐

  1. 权重比较(id class 标签)

    权重的取值: 按照 id   class  标签 的顺序在其位置上标出1或者0 例如下面的例子 <!DOCTYPE html> <html lang="en"&g ...

  2. android 开发 在一个工具类(或者适配器class)里启动activity

    实现思路: 1.需要给工具类里传入context: 2.使用上下文mContext.startActivity启动activity 例子1: public class SafePlaceRecycle ...

  3. gentoo samba 配置

    准备搞一台 PC 作为 NAS, 开启 SAMBA 作为文件服务器.考虑多个手机自动备份到不同的文件夹,可以通过盒子进行播放,还要密码防护. 所以在配置文件里面 valid users 这里把 手机和 ...

  4. 17.scrapy-splash安装-2

    scrapy-splash是一个scrapy中支持的javascript渲染的工具. scrapy-splash安装分为两部分.一个是splash服务的安装,具体是通过docker,安装之后,会启动一 ...

  5. 《算法导论》——MergeSort

    前言: 在今后的日子里,我将持续更新博客,讨论<算法导论>一书中的提到的各算法的C++实现.初来乍到,请多指教. 今日主题: 今天讨论<算法导论>第二章算法基础中的归并排序算法 ...

  6. 记一次恐怖的 Integer 溢出

    一不注意, 看起来ok 的地方都出问题了! 后来才突然想起,原来是 Integer 溢出啊 这样的代码, 没想到也会出问题. public static final long Cap_Size = 9 ...

  7. Mybatis学习4——多对一

    一个用户对多个订单 在用户中添加属性List<user> User.java package pojo; import java.util.Date; import java.util.L ...

  8. 关于 version control

    1.什么是 version control 版本控制(Vevision control)是维护工程蓝图的标准作法,能追踪工程蓝图从诞生一直到定案的过程.此外,版本控制也是一种软体工程技巧,借此能在软体 ...

  9. C# 中的 ConfigurationManager类引用方法

    c#添加了Configuration;后,竟然找不到 ConfigurationManager 这个类,后来才发现:虽然引用了using System.Configuration;这个包,但是还是不行 ...

  10. WPF 透明窗体

    窗体属性中设置:Background="Transparent" AllowsTransparency="True" WindowStyle="Non ...