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

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。
应该将应用自身的设计和具体的实现技术解耦。技术实现是应用的底层支撑,它不应该直接对应用产生影响。

框架一般处在低层应用平台(如 J2EE)和高层业务逻辑之间的中间层。

  • mybatis-spring  可以帮助我们将MyBatis代码无缝整合到Spring中。使用这个类库中的类,Spring将会加载必要的MyBatis工厂类和Session类。
  • MyBatis Spring Adapter项目地址为:  https://github.com/mybatis/spring

9.3 集成 MyBatis

需要注意的是,在 9.1 节创建基本项目的时候就己经添加了 MyBatis 的依赖,这一节主要是介绍与 mybatis-spring 相关的内容。
  1. 在 pom.xml 中添加 mybatis-spring 依赖

  mybatis-spring就是Mybatis和spring集成中必须的依赖。

此处使用版本为2.0.2版本。mybatis 3.5.2  spring 5.0.15.RELEASE

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>

2.  配置 SqlSessionFactoryBean  
  在mybatis-spring中,SqlSessionFactoryBean 是用于创建SqlSessionFactory 的。在Spring的.xml配置文件 applicationContext.xml中配置这个工厂类,代码如下。

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations">
<array>
<value>classpath:cn/bjut/mybatis/**/mapper/*.xml</value>
</array>
</property>
<property name="typeAliasesPackage" value="cn.bjut.mybatis.web.model"/>
</bean>
typeAliasesPackage :配置包中类的别名 ,这个配置不支持 *通配符的路径,当需要配置多个包路径时,可以使用分号或逗号进行分隔。

上面配置的 mybatis-config.xml 位于 src/main/resources 目录下 , 配置文件内容如下 。

  mybatis-config.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>
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="cacheEnabled" value="true"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
</configuration>

  3. 配置 MapperScannerConfigurer 

      这里要介绍的用法是最简单且推荐使用的一种,通过 MapperScannerConfigurer 类: 自动扫描所有的 Mapper 接口,使用时可以直接注入接口

在spring配置文件 applicationContext.xml 中配置扫描类,代码如下。

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="addToConfig" value="true"/>
<property name="basePackage" value="cn.bjut.mybatis.**.mapper"/>
</bean>

MapperScannerConfigurer 中常配置以下两个属性 。

  • basePackage :     用于配置基本的包路径。可以使用分号或逗号作为分隔符设置多于一个的包路径 。
  • annotationClass : 用于过滤被扫描的接口,如果设置了该属性,那么 MyBatis 的接口只有包含该注解才会被扫描进去。

  9.4 几个简单实例 

   在resources目录下添加日志的配置文件:log4j.properties

log4j.rootLogger=DEBUG, stdout

log4j.logger.cn.bjut.mybatis=DEBUG

log4j.logger.cn.bjut.mybatis.web.mapper=TRACE

### Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

这一小节会通过一整套的代码来演示MyBatis在项目开发中的基本用法,按照自下而上的顺序进行开发。

从Mapper开始,依次开发Service层、Controller层、JSP前端页面。

9.4.1 基本准备

  在开始之前需要先准备数据库,表和数据。这一节会新增一个 表(table),然后针对这个表进行增、删、改、查4类操作。

字典表的建表语句和基础数据的SQL如下。

-- ----------------------------
-- Table structure for sys_dict
-- ----------------------------
DROP TABLE IF EXISTS `sys_dict`;
CREATE TABLE `sys_dict` (
`id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
`code` varchar(64) NOT NULL COMMENT '类别',
`name` varchar(64) NOT NULL COMMENT '字典名',
`value` varchar(64) NOT NULL COMMENT '字典值',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of sys_dict
-- ----------------------------
INSERT INTO `sys_dict` VALUES ('', '性别', '男', '男');
INSERT INTO `sys_dict` VALUES ('', '性别', '女', '女');
INSERT INTO `sys_dict` VALUES ('', '季度', '第一季度', '');
INSERT INTO `sys_dict` VALUES ('', '季度', '第二季度', '');
INSERT INTO `sys_dict` VALUES ('', '季度', '第三季度', '');
INSERT INTO `sys_dict` VALUES ('', '季度', '第四季度', '');

在src/main/java 中新建 cn.bjut.mybatis.web.model 包,然后新建 SysDict 实体类。

package cn.bjut.mybatis.web.model;

import java.io.Serializable;

public class SysDict implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String code;
private String name;
private String value; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
}
}

9.4.2 开发(DAO层)Mapper层

数据访问层(DAO层) 也就是常说的Mapper层。使用Mapper接口和XML映射文件结合的方式进行开发,在9.3节集成MyBatis的配置中,自动扫描接口的包名为 cn.bjut.mybatis.**.mapper ,因此在创建Mapper接口所在的包时也要参照这个命名规则。

在 src/main/java 中新建 cn.bjut.mybatis.web.mapper 包,然后新建  DictMapper接口。

package cn.bjut.mybatis.web.mapper;

import cn.bjut.mybatis.web.model.SysDict;
import org.apache.ibatis.session.RowBounds;
import cn.bjut.mybatis.web.model.SysDict; import java.util.List; /**
* @author kangmainfeng
*/
public interface DictMapper { /**
* 根据主键查询
*
* @param id
* @return
*/
SysDict selectByPrimaryKey(Long id); /**
* 条件查询
*
* @param sysDict
* @return
*/
List<SysDict> selectBySysDict(SysDict sysDict, RowBounds rowBounds); /**
* 新增
*
* @param sysDict
* @return
*/
int insert(SysDict sysDict); /**
* 根据主键更新
*
* @param sysDict
* @return
*/
int updateById(SysDict sysDict); /**
* 根据主键删除
*
* @param id
* @return
*/
int deleteById(Long id);
}

同时,9.3节的 SqlSessionFactoryBean 中也配置了扫描XML映射文件的目录

classpath:cn/bjut/mybatis/**/mapper/*.xml

在 src/main/resources 中新建 cn/bjut/mybatis/web/mapper/ 目录,然后新建 DictMapper.xml文件。

此处直接将接口和对应的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.bjut.mybatis.web.mapper.DictMapper">
<select id="selectByPrimaryKey" resultType="SysDict">
select id, code, name, `value` from sys_dict where id = #{id}
</select> <select id="selectBySysDict" resultType="tk.mybatis.web.model.SysDict">
select * from sys_dict
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="code != null and code != ''">
and code = #{code}
</if>
</where>
order by code, `value`
</select> <insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into sys_dict(code, name, value)
values (#{code}, #{name}, #{value})
</insert> <update id="updateById">
update sys_dict
set code = #{code},
name = #{name},
value = #{value}
where id = #{id}
</update> <delete id="deleteById">
delete from sys_dict where id = #{id}
</delete> </mapper>

这5个方法都是很基础的方法,下面(的博客文章)将在这5个接口的method 基础上,继续编写Service层的代码。

      

================

end

 

MyBatis从入门到精通(第9章):Spring集成MyBatis(中)的更多相关文章

  1. MyBatis从入门到精通(第5章):5.4 Example 介绍

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.Eclipse Version: 2019-12 M2 (4.14.0) MyBatis从入门到精通(第5章):MyBatis代码 ...

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

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

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

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

  4. MyBatis从入门到精通(第5章):MyBatis代码生成器

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.Eclipse Version: 2019-12 M2 (4.14.0) MyBatis从入门到精通(第5章):MyBatis代码 ...

  5. MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.1高级结果映射之一对一映射

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.2.4 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...

  6. MyBatis从入门到精通(第4章):MyBatis动态SQL【if、choose 和 where、set、trim】

    (第4章):MyBatis动态SQL[if.choose 和 where.set.trim] MyBatis 的强大特性之一便是它的动态 SQL.MyBatis 3.4.6版本采用了功能强大的OGNL ...

  7. MyBatis从入门到精通(第3章):MyBatis注解方式的基本使用

    MyBatis 注解方式就是将 SQL 语句直接写在DAO层的接口上. 在黑马录制的2018年双元视频课:\08 SSM整合案例[企业权限管理系统]\07.订单操作  有使用MyBatis注解进行多表 ...

  8. MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.2高级结果映射之一对多映射

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.3.1 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...

  9. MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】

    (第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...

随机推荐

  1. 055-for循环中break的使用

    <?php ;;$x++){ //省略表达式2的for循环将是无限循环 echo "$x<br />"; ){ break; //使用if语句控制退出无限循环 } ...

  2. 7. 单机版Redis的安装以及Redis生产环境启动方案

    安装单机版redis redis的生产环境启动方案redis cli的使用 1. 安装单机版redis 大家可以自己去官网下载,当然也可以用课程提供的压缩包 wget http://downloads ...

  3. 本地Redis服务配置

    本地Redis服务配置 要求:在虚拟机中启动redis服务,并要在windows物理机上取得链接 虚拟机安装略,(结果如下) windows工作机上装了Oracle VM VirtualBox,并在其 ...

  4. HDU 4921 Map DFS+状态压缩+乘法计数

    算最多十条链,能截取某前缀段,每种方案都可以算出一个权值,每种方案的概率都是总数分之一,问最后能构成的所有可能方案数. 对计数原理不太敏感,知道是DFS先把链求出来,但是想怎么统计方案的时候想了好久, ...

  5. 腾讯云服务器上搭建Jenkins配置邮箱通知

    1,Jenkins 点击 系统管理 2,点击系统管理 3,配置系统管理员邮件地址 5,配置 Extended E-main Notification,(用户名不需要邮箱后缀“@163.com”, SS ...

  6. JAVA的控制结构

    一.控制结构 1.控制结构概述 控制结构是控制程序如何运行的特殊的语句结构.控制结构可以分为:顺序控制结构,分支控制结构和循环控制结构. 2.顺序控制结构 除了分支控制结构和循环控制结构之外的语句都是 ...

  7. json字符串格式化显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Working Plan 优先队列+贪心

    题目链接:http://codeforces.com/gym/101987题目描述ICPC manager plans a new project which is to be carried out ...

  9. BZOJ 5059 前鬼后鬼的守护

    题解: 解法一:用函数斜率什么的,不会,留坑 解法二: 某一个序列都变成一个值那么中位数最优 加入一个元素,与前面那一段区间的中位数比较 x>=mid什么事也不做 x<mid合并两端区间 ...

  10. CocoaPods安装/卸载/初始化等常用操作

    CocoaPods的官网:https://cocoapods.org/,官方指导文档https://guides.cocoapods.org/ 1)ruby gem源更换国内源gems.ruby-ch ...