Spring集成MyBatis使用

前面复习MyBatis时,发现在测试时,需要手动创建sqlSessionFactory,Spring将帮忙自动创建sqlSessionFactory,并且将自动扫描Mapper映射器

(1)集成步骤

step1 导包: spring-webmvc, mybatis, mybatis-spring, dbcp, ojdbc, spring-jdbc, junit, mysql相关等

<dependencies>
<!--导入junit测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<classifier>sources</classifier>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<classifier>javadoc</classifier>
</dependency> <!-- 导入数据库包 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency> <!-- 导入mybatis的包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency> <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
<classifier>sources</classifier>
</dependency> <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
<classifier>javadoc</classifier>
</dependency> <!-- 针对mysql的导包 -->
<dependency>
<groupId>org.wisdom-framework</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34_1</version>
</dependency> <!-- 导入spring-webmvc的jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.3.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.3.RELEASE</version>
<classifier>sources</classifier>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.3.RELEASE</version>
<classifier>javadoc</classifier>
</dependency> <!-- 针对spring JDBC导包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.3.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.3.RELEASE</version>
<classifier>sources</classifier>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.3.RELEASE</version>
<classifier>javadoc</classifier>
</dependency> <!-- 关键:导入mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency> <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
<classifier>sources</classifier>
</dependency> <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
<classifier>javadoc</classifier>
</dependency> </dependencies>

注意:导包可能出现版本不兼容的问题,可以参考博客建议,暂时没找着链接

step2 添加spring配置文件,不再需要MyBatis的配置文件

<?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> <!-- 配置MapperScannerConfigurer -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入映射器所在的包名 -->
<property name="basePackage" value="dao"/>
<!-- 只扫描有特定注解的接口 -->
<property name="annotationClass" value="annotations.MyBatisRepository" />
</bean> </beans>

可以在spring配置文件中,添加SqlSessionFactoryBean来代替单独使用MyBatis时,需要加载sqlMapConfig.xml。MyBatis创建sqlSessionFactory时,会加载这个配置文件,完成初始化连接池,以及读取映射文件后将sql预编译后存入一个Map集合两项工作,配置sqlSessionFactoryBean也完成了上述两项工作,其主要交给Spring来自动完成。

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

public class Employee {
private int id;
private String name;
private int age; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}

step4 写了具体sql的xml映射文件,跟MyBatis写法一样,要注意的是namespace是mapper映射器的包名+类名

<?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="dao.EmployeeDAO">
<!-- 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 Mapper映射器:一个接口,里面写好了方法,跟MyBatis配置时一样,主要目的为调用方法时能依据命名空间和其他约束条件找到对应的sql

import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import annotations.MyBatisRepository;
import entity.Employee;
import entity.NewEmployee; /**
* Mapper映射器
* @author clyang
*/
@Repository("empDAO")
@MyBatisRepository
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 配置MapperScannerConfigurer

配置参考上上图

该bean会扫描指定包及其子包下面的所有mapper映射器(即接口),并调用session.getMapper()方法获得映射器的具体实现,比如MyBatis例子中的EmployeeDAO dao=session.getMapper(EmployeeDAO.class),并且将这些实现后的对象添加到spring容器中,对应的bean id为接口首字母小写,可以使用repository("别名")来,重命名bean 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);
//调用mapper映射器实现类对象
EmployeeDAO dao=ac.getBean("empDAO",EmployeeDAO.class);
//调用查询方法
List<Employee> list=dao.findAll();
System.out.println(list);
//不需要手动关闭连接
} //下面略去
}

测试时只要启动Spring容器,Spring会根据配置自动完成MyBatis中需要手动完成的工作,如得到一个sqlSession,创建一个Mapper映射器具体实现对象。

Spring容器实现Mapper映射器具体实现,采用了接口指向对象,这为Java多态的使用,根据接口具体实现方法的不同,实现方法动态调度

测试结果:

(2)只扫描特定的接口

为什么只扫描特定的接口,因为dao下的Mapper映射器接口,有些可能不是采用MyBatis来实现连接,可能采用其它的连接方式,如果是JDBC实现的dao类,也会被MapperScannerConfigure扫描到,但是扫描到后无法使用,会导致程序报错,为了解决这个问题,需要做到只扫描特定的接口

方法:

step1 开发一个注解,注解只是一个标识,代表只扫描它,其他的的不扫描

/**
* 一个标识
* @author clyang
*/
public @interface MyBatisRepository { }

step2 将该注解添加到需要扫描的接口之上

step3 修改MapperScannerConfigurer,告诉它只扫描有注解的接口

总结:Spring集成MyBatis后,充分发挥了Spring的管理对象之间关系的能力,配置好后,自动完成以前MyBatis需要手动完成的步骤

Spring集成MyBatis的使用-使用Mapper映射器的更多相关文章

  1. MyBatis02 MyBatis基础知识之Mapper映射器

    1 Mapper映射器是什么 是符合映射文件要求的接口 接口要求 a. 方法名要与sql的id一致. b. 方法的参数类型要与parameterType一致. c. 方法的返回类型要与resultTy ...

  2. MyBatis(3)-- Mapper映射器

    一.select元素 1.select元素的应用 id为Mapper的全限定名,联合称为一个唯一的标识 paremeterType标识这条SQL接收的参数类型 resultType标识这条SQL返回的 ...

  3. Spring集成MyBatis框架

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

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

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

  5. Spring集成MyBatis的使用-使用SqlSessionTemplate

    Spring集成MyBatis的使用 Spring集成MyBatis,早期是使用SqlSessionTemplate,当时并没有用Mapper映射器,既然是早期,当然跟使用Mapper映射器是存在一些 ...

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

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

  7. Unit08: Spring集成mybatis

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

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

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

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

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

随机推荐

  1. SQLServer树查询

    感觉这个CTE递归查询蛮好用的,先举个例子: use City; go create table Tree ( ID int identity(1,1) primary key not null, N ...

  2. js 数组对象的操作方法

    在jquery中处理JSON数组的情况中遍历用到的比较多,但是用添加移除这些好像不是太多. 今天试过json[i].remove(),json.remove(i)之后都不行,看网页的DOM对象中好像J ...

  3. Java多层嵌套异常处理的基本流程

    异常是程序中的一些错误,但并不是所有的错误都是异常,错误有时候是可以避免的.异常的对象有两个来源,一是Java运行时环境自动抛出系统生成的异常,而不管你是否愿意捕获和处理,它总要被抛出!比如除数为0的 ...

  4. kvm云主机使用宿主机usb设备

    有些时候KVM客户机还是要使用USB设备,比如USB密钥等 KVM命令行参数 -usb 打开usb驱动程序,启动客户机usb支持-usbdevice devname 为客户机增加usb设备,devna ...

  5. <转载> nginx服务器安装及配置文件详解 https://segmentfault.com/a/1190000002797601

    nginx在工作中已经有好几个环境在使用了,每次都是重新去网上扒博客,各种编译配置,今天自己也整理一份安装文档和nginx.conf配置选项的说明,留作以后参考.像负载均衡配置(包括健康检查).缓存( ...

  6. 高程三 BOM 读书笔记

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. Android ADB 基本命令

    ADB很强大,记住一些ADB命令有助于提高工作效率. 获取序列号: adb get-serialno 查看连接计算机的设备: adb devices 重启机器: adb reboot 重启到bootl ...

  8. zabbix模块注意

    1,每个监控组使用一个模版,对模版操作时会对监控组的每个模版进行修改操作.

  9. beego orm 时间相差八小时

    使用beego框架,前端调用api插入一条数据到mysql,时间差了8个小时,fuck!!! 解决办法: 在db的url后面加上时区- dbDataSource = root:test@tcp(192 ...

  10. mysql root密码修改

    1.假如之前没设置密码,现在想成test mysqladmin -u root password test 2.假如之前密码是1234,现在想改成test mysqladmin -u root -p1 ...