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 整合成功。

posted @ 2020-01-15 17:27  小黑开发  阅读(139)  评论(0编辑  收藏  举报