Spring实战 - 整合MyBatis

  • 环境: MacOS + IntelliJ IDEA 2019.3.1 (Ultimate Edition)

基于Spring实战 - 整合Spring MVC,整合MyBatis

1、在pom.xml中配置MyBatis依赖

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql-connector-java.version}</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>${mybatis-spring.version}</version>
    </dependency>

2、在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>
    <!-- 打印 SQL 语句 -->
    <setting name="logImpl" value="STDOUT_LOGGING" />
    <!-- 使全局的映射器启用或禁用缓存。 -->
    <setting name="cacheEnabled" value="false"/>
    <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
    <setting name="aggressiveLazyLoading" value="true"/>
    <!-- 是否允许单条 SQL 返回多个数据集 (取决于驱动的兼容性) default:true -->
    <setting name="multipleResultSetsEnabled" value="true"/>
    <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
    <setting name="useColumnLabel" value="true"/>
    <!-- 允许 JDBC 生成主键。需要驱动器支持。如果设为了 true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false  -->
    <setting name="useGeneratedKeys" value="false"/>
    <!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不映射 PARTIAL:部分 FULL:全部  -->
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
    <setting name="defaultExecutorType" value="SIMPLE"/>
    <!-- 使用驼峰命名法转换字段。 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
    <setting name="localCacheScope" value="SESSION"/>
    <!-- 设置 JDBC 类型为空时,某些驱动程序 要指定值, default:OTHER,插入空值时不需要指定类型 -->
    <setting name="jdbcTypeForNull" value="NULL"/>
  </settings>
</configuration>

3、在resources下创建spring-context-mybatis.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"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  <!-- 配置 SqlSession -->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <!-- 用于配置对应实体类所在的包,多个 package 之间可以用 ',' 号分割 -->
    <property name="typeAliasesPackage" value="com.coding.cats.domain"/>
    <!-- 用于配置对象关系映射配置文件所在目录 -->
    <property name="mapperLocations" value="classpath:/mapper/**/*.xml"/>
    <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
  </bean>
  <!-- 扫描 Mapper -->
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.coding.cats.admin.dao" />
  </bean>
</beans>

至此,已完成MyBatis 整合,接下来验证一下,MyBatis 是否整合成功。

1 、在pom.xml中增加spring-test 和junit 依赖

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>

2、根据数据库中表内容创建实体类TbUser

package com.coding.cats.domain;

import java.io.Serializable;
import java.util.Date;

/**
 * @author 码出高薪
 * @Desc. 实体类TbUser
 * @date 2020/1/15 14:56
 */

public class TbUser implements Serializable {
  private Long id;
  private String username;
  private String password;
  private String phone;
  private String email;
  private Date created;
  private Date updated;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public String getPhone() {
    return phone;
  }

  public void setPhone(String phone) {
    this.phone = phone;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public Date getCreated() {
    return created;
  }

  public void setCreated(Date created) {
    this.created = created;
  }

  public Date getUpdated() {
    return updated;
  }

  public void setUpdated(Date updated) {
    this.updated = updated;
  }

  @Override
  public String toString() {
    return "TbUser{" +
        "id=" + id +
        ", username='" + username + '\'' +
        ", password='" + password + '\'' +
        ", phone='" + phone + '\'' +
        ", email='" + email + '\'' +
        ", created=" + created +
        ", updated=" + updated +
        '}';
  }
}

2、在Dao目录下创建TbUserDao接口

package com.coding.cats.admin.dao;

import com.coding.cats.domain.TbUser;
import java.util.List;
import org.springframework.stereotype.Repository;

/**
 * @author 码出高薪
 * @Desc. 定义数据访问层接口
 * @date 2020/1/15 15:05
 */

@Repository
public interface TbUserDao {

  /**
   * 查询所有用户信息
   * @return TbUser列表信息
   */
  List<TbUser> getAllUserInfo();
}

3、在Service 目录下创建TbUserService接口

package com.coding.cats.admin.service;

import com.coding.cats.admin.dao.TbUserDao;
import com.coding.cats.domain.TbUser;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @author 码出高薪
 * @Desc. 定义业务逻辑层接口
 * @date 2020/1/15 15:10
 */
public interface TbUserService {
  /**
   * 选择所有用户信息
   * @return List<TbUser> 用户信息列表
   */
  List<TbUser> selectAllUserInfo();
}

4、在Service/impl目录下创建TbUserServiceImpl

package com.coding.cats.admin.service.impl;

import com.coding.cats.admin.dao.TbUserDao;
import com.coding.cats.admin.service.TbUserService;
import com.coding.cats.domain.TbUser;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @author 码出高薪
 * @Desc. 实现业务逻辑
 * @date 2020/1/15 15:16
 */

public class TbUserServiceImpl implements TbUserService {

  @Autowired
  private TbUserDao tbUserDao;

  public List<TbUser> selectAllUserInfo() {
    return tbUserDao.getAllUserInfo();
  }
}

5、在resources/mapper目录下创建tbUserMapper.xml,其中select id 名称要与TbUserDao中的接口名一一对应。

<?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="com.coding.cats.admin.dao.TbUserDao">
  <select id="getAllUserInfo" resultType="TbUser">
    SELECT
        a.id,
        a.username,
        a.phone,
        a.email,
        a.created,
        a.updated
    FROM
        tb_user AS a
  </select>
</mapper>

6、在src/test/java目录下创建包名
选择java->New->Package->com.coding.cats.admin.service.test

7、在com.coding.cats.admin.service.test包名下,创建TblUserServiceTest

package com.coding.cats.admin.service.test;

import com.coding.cats.admin.service.TblUserService;
import com.coding.cats.domain.TblUser;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author 码出高薪
 * @Desc. 测试TblUserService
 * @date 2020/1/15 15:41
 */

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-context","classpath:spring-context-druid",
"classpath:spring-context-mybatis"})
public class TblUserServiceTest {

  @Autowired
  private TblUserService tblUserService;

  @Test
  public void testSelectAllUserInfo(){

    List<TblUser> tblUsers = tblUserService.selectAllUserInfo();
    for(TblUser tblUser : tblUsers){
      System.out.println(tblUser.getUsername());
    }
  }
}

运行结果:

==>  Preparing: SELECT a.id, a.username, a.password, a.phone, a.email, a.created, a.updated FROM tb_user AS a 
==> Parameters: 
<==    Columns: id, username, password, phone, email, created, updated
<==        Row: 1, Jack, 123, 123, 123@qq.com, 2020-01-15 15:48:14.0, 2020-01-15 15:48:16.0
<==        Row: 2, 张三, 234, 234, 234@qq.com, 2020-01-15 15:49:33.0, 2020-01-15 15:49:35.0
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4816278d]
Jack
张三

由此可见, MyBatis 整合成功。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容