zoukankan      html  css  js  c++  java
  • 6、Spring Boot 2.x 集成 MyBatis

    1.6 Spring Boot 2.x 集成 MyBatis

    简介

    • 详细介绍如何在Spring Boot中整合MyBatis,并通过注解方式实现映射。
    • 完整源码:

    1.6.1 创建 spring-boot-mybatis 项目

    • pom文件如下
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.hw</groupId>
        <artifactId>spring-boot-mybatis</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>spring-boot-mybatis</name>
        <description>Demo project for Spring Boot MyBatis</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.0.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    
    

    这里不引入spring-boot-starter-jdbc依赖,是由于mybatis-spring-boot-starter中已经包含了此依赖

    • application.yml 配置数据库连接
    spring:
      datasource:
        username: root
        url: jdbc:mysql://localhost:3306/test
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    • 创建user表
    CREATE TABLE `user` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    

    1.6.2 使用MyBatis注解方式

    因为最初设计时,MyBatis 是一个 XML 驱动的框架。配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的。而到了 MyBatis 3,就有新选择了。MyBatis 3 构建在全面且强大的基于 Java 语言的配置 API 之上。这个配置 API 是基于 XML 的 MyBatis 配置的基础,也是新的基于注解配置的基础。注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。

    1.6.2.1 User实体类
    package com.hw.springbootmybatis.entity;
    
    /**
     * @Description TODO
     * @Author hw
     * @Date 2018/11/19 1:10
     * @Version 1.0
     */
    public class User {
    
        private Long id;
        private String name;
        private Integer age;
    
       // get set 方法
    }
    
    
    1.6.2.2 创建User映射的操作UserMapper
    package com.hw.springbootmybatis.mapper;
    
    import com.hw.springbootmybatis.entity.User;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    
    /**
     * @Description TODO
     * @Author hw
     * @Date 2018/11/19 1:14
     * @Version 1.0
     */
    @Mapper
    public interface UserMapper {
    
        @Select("SELECT * FROM USER WHERE NAME = #{name}")
        User findByName(@Param("name") String name);
    
        @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
        int insert(@Param("name") String name, @Param("age") Integer age);
    
    }
    
    
    

    1.6.2.3 创建单元测试

    package com.hw.springbootmybatis;
    
    import com.hw.springbootmybatis.entity.User;
    import com.hw.springbootmybatis.mapper.UserMapper;
    import org.junit.Assert;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.annotation.Rollback;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringBootMybatisApplicationTests {
    
        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void contextLoads() {
        }
    
    
        @Test
        @Rollback
        public void findByName() throws Exception {
            userMapper.insert("AAA", 20);
            User u = userMapper.findByName("AAA");
            Assert.assertEquals(20, u.getAge().intValue());
        }
    
    }
    
    

    1.6.2.4 源码地址

    注解方式源码

    不幸的是,Java 注解的的表达力和灵活性十分有限。尽管很多时间都花在调查、设计和试验上,最强大的 MyBatis 映射并不能用注解来构建——并不是在开玩笑,的确是这样。比方说,C#属性就没有这些限制,因此 MyBatis.NET 将会比 XML 有更丰富的选择。也就是说,基于 Java 注解的配置离不开它的特性。

    1.6.3 使用MyBatis XML方式

    1.6.3.1 yml文件:
    
    spring:
      datasource:
        username: root
        url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=GMT%2B8
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    
    mybatis:
      config-location: classpath:mybatis-config.xml
      mapper-locations: classpath:mapper/*.xml
      type-aliases-package: com.hw.springbootmybatisxml.entity
    
    1.6.3.2 创建配置文件mybatis-config.xml

    在resource目录下创建config目录并创建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="callSettersOnNulls" value="true"/>
            <setting name="cacheEnabled" value="true"/>
            <setting name="lazyLoadingEnabled" value="true"/>
            <setting name="aggressiveLazyLoading" value="true"/>
            <setting name="multipleResultSetsEnabled" value="true"/>
            <setting name="useColumnLabel" value="true"/>
            <setting name="useGeneratedKeys" value="false"/>
            <setting name="autoMappingBehavior" value="PARTIAL"/>
            <setting name="defaultExecutorType" value="SIMPLE"/>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
            <setting name="localCacheScope" value="SESSION"/>
            <setting name="jdbcTypeForNull" value="NULL"/>
        </settings>
    
        <typeAliases>
            <typeAlias alias="Integer" type="java.lang.Integer" />
            <typeAlias alias="Long" type="java.lang.Long" />
            <typeAlias alias="HashMap" type="java.util.HashMap" />
            <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
            <typeAlias alias="ArrayList" type="java.util.ArrayList" />
            <typeAlias alias="LinkedList" type="java.util.LinkedList" />
        </typeAliases>
    </configuration>
    
    
    1.6.3.3 在resource创建 mapper/userMapper.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="com.hw.springbootmybatisxml.mapper.UserMapper">
        <resultMap id="BaseResultMap" type="com.hw.springbootmybatisxml.entity.User">
            <id column="id" property="id" jdbcType="NUMERIC"/>
            <result column="name" property="name" jdbcType="VARCHAR"/>
            <result column="age" property="age" jdbcType="NUMERIC"/>
        </resultMap>
    
        <sql id="Base_Column_List">
            id, name, age
        </sql>
    
        <select id="findByName" parameterType="java.lang.String" resultMap="BaseResultMap">
            SELECT
            <include refid="Base_Column_List"/>
            FROM user
            WHERE name = #{name}
        </select>
    
    <!--如果涉及多个类型那就必须去掉parameterType;
    第二个是#{id}...及后面的参数写法也是错误的,
    因为在MyBatis3中不会识别这样的参数,所以应该改成#{arg0},{arg1}这样的形式。-->
        <insert id="insert">
           INSERT INTO
           		user
           		(name,age)
           	VALUES
           		(#{arg0}, #{arg1})
        </insert>
    
    
    </mapper>
    
    1.6.3.4 User实体类
    package com.hw.springbootmybatisxml.entity;
    
    /**
     * @Description TODO
     * @Author hw
     * @Date 2018/11/19 1:10
     * @Version 1.0
     */
    public class User {
    
        private Long id;
        private String name;
        private Integer age;
    
       // get set 方法
    }
    
    
    1.6.3.5 创建User映射的操作UserMapper
    package com.hw.springbootmybatisxml.mapper;
    
    import com.hw.springbootmybatisxml.entity.User;
    import org.apache.ibatis.annotations.Mapper;
    
    /**
     * @Description TODO
     * @Author hw
     * @Date 2018/11/19 1:36
     * @Version 1.0
     */
    @Mapper
    public interface UserMapper {
    
        User findByName(String name);
    
        void insert(String name,int age);
    
    }
    
    
    1.6.3.6 创建测试类
    package com.hw.springbootmybatisxml;
    
    import com.hw.springbootmybatisxml.entity.User;
    import com.hw.springbootmybatisxml.mapper.UserMapper;
    import org.junit.Assert;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.annotation.Rollback;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringBootMybatisXmlApplicationTests {
    
        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void contextLoads() {
        }
    
    
        @Test
        @Rollback
        public void findByName() throws Exception {
            userMapper.insert("ccc", 20);
            User u = userMapper.findByName("ccc");
            Assert.assertEquals(20, u.getAge().intValue());
        }
    
    }
    
    
    1.6.3.7 源码

    xml方式源码

  • 相关阅读:
    Java.Io 初步了解
    Java 对象序列化与反序列化
    Java
    Java
    Java
    实现文件拷贝
    Java
    Java 国际化标准程序实现
    【C#】分享带等待窗体的任务执行器一枚
    解决64位Windows2003程序字体很小的问题
  • 原文地址:https://www.cnblogs.com/Grand-Jon/p/9986267.html
Copyright © 2011-2022 走看看