spring boot学习(03):Spring Boot整合mybatis

参考:
感谢csdn两位作者:纯洁的微笑,为何咬着牙
纯洁的微笑: springboot(六):如何优雅的使用mybatis
为何咬着牙: Spring boot Mybatis 整合(完整版)

前言

开发中一定会涉及连接并操作数据的操作,也就是数据持久层。常用的的ORM框架有两个,一个是Hibernate,基本不用写sql语句,另外一种是mybatis,以动态sql见长,可以使用一些复杂的sql语句。两者各有特点,这里介绍两种方式spring boot整合mybatis。

mybatis的几个重要概念

Mapper 配置: Mapper 配置可以使用基于 XML 的 Mapper 配置文件来实现,也可以使用基于 Java 注解的 MyBatis 注解来实现,甚至可以直接使用 MyBatis 提供的 API 来实现。

Mapper 接口: Mapper 接口是指自行定义的一个数据操做接口,类似于通常所说的 DAO 接口。早期的 Mapper 接口需要自定义去实现,现在 MyBatis 会自动为 Mapper 接口创建动态代理对象。Mapper 接口的方法通常与 Mapper 配置文件中的 select、insert、update、delete 等 XML 结点存在一一对应关系。

Executor: MyBatis 中所有的 Mapper 语句的执行都是通过 Executor 进行的,Executor 是 MyBatis 的一个核心接口。

SqlSession: SqlSession 是 MyBatis 的关键对象,是执行持久化操作的独享,类似于 JDBC 中的 Connection,SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的方法,它的底层封装了 JDBC 连接,可以用 SqlSession 实例来直接执行被映射的 SQL 语句。

SqlSessionFactory: SqlSessionFactory 是 MyBatis 的关键对象,它是单个数据库映射关系经过编译后的内存镜像。SqlSessionFactory 对象的实例可以通过 SqlSessionFactoryBuilder 对象类获得,而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出。

mybatis的工作流程:
这里写图片描述

MyBatis-Spring-Boot-Starter

MyBatis-Spring-Boot-Starter 是 MyBatis 帮助我们快速集成 Spring Boot 提供的一个组件包。

使用这个组件可以做到以下几点:

  • 构建独立的应用
  • 几乎可以零配置
  • 需要很少的 XML 配置

spring boot提供了两中集成mybatis的方式:XML和注解版(无xml)

第一种:传统XML

添加mybatis-spring-boot-starter依赖

application.properties添加相关配置

mybatis.config-locations=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.neo.entity

spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = root

分别说一说含义:
* mybatis.config-locations:配置 mybatis-config.xml 路径,mybatis-config.xml 中配置 MyBatis 基础属性。
* mybatis.mapper-locations:配置 Mapper 对应的 XML 文件路径
* mybatis.type-aliases-package:配置项目中实体类包路径
* spring.datasource.*:数据源配置

Spring Boot 启动时数据源会自动注入到 SqlSessionFactory 中,使用 SqlSessionFactory 构建 SqlSessionFactory,再自动注入到 Mapper 中,最后我们直接使用 Mapper 即可。

启动类设置

在启动类中添加对 Mapper 包扫描@MapperScan,Spring Boot 启动的时候会自动加载包路径下的 Mapper。

@MapperScan("com.neo.mapper")

开发属性

mybatis的公共属性

mybatis-config.xml,主要配置常用的 typeAliases,设置类型别名为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

<configuration>
    <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>

这样在使用 Mapper.xml 的时候,需要引入可以直接这样写:

resultType="Integer" 
//或者
parameterType="Long

添加User的映射文件

(1)指明对应文件的 Mapper 类地址:

<mapper namespace="com.neo.mapper.UserMapper" >

(2)配置表结构和类的对应关系:

<resultMap id="BaseResultMap" type="com.neo.entity.UserEntity" >
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="userName" property="userName" jdbcType="VARCHAR" />
    <result column="passWord" property="passWord" jdbcType="VARCHAR" />
    <result column="user_sex" property="userSex" javaType="com.neo.enums.UserSexEnum"/>
    <result column="nick_name" property="nickName" jdbcType="VARCHAR" />
</resultMap>

(3)写具体的 SQL 语句,比如这样:

<select id="getAll" resultMap="BaseResultMap"  >
   SELECT 
   *
   FROM users
</select>
<select id="getOne" parameterType="Long" resultMap="BaseResultMap" >
    SELECT 
   <include refid="Base_Column_List" />
   FROM users
   WHERE id = #{id}
</select>

<insert id="insert" parameterType="com.neo.entity.UserEntity" >
   INSERT INTO 
           users
           (userName,passWord,user_sex) 
       VALUES
           (#{userName}, #{passWord}, #{userSex})
</insert>

<update id="update" parameterType="com.neo.entity.UserEntity" >
   UPDATE 
           users 
   SET 
       <if test="userName != null">userName = #{userName},</if>
       <if test="passWord != null">passWord = #{passWord},</if>
       nick_name = #{nickName}
   WHERE 
           id = #{id}
</update>

<delete id="delete" parameterType="Long" >
   DELETE FROM
            users 
   WHERE 
            id =#{id}
</delete>

MyBatisXML 有一个特点是可以复用 XML,比如公用的一些 XML 片段可以提取出来,在其他 SQL 中去引用,如:

<sql id="Base_Column_List" >
    id, userName, passWord, user_sex, nick_name
</sql>

<select id="getAll" resultMap="BaseResultMap"  >
   SELECT 
   <include refid="Base_Column_List" />
   FROM users
</select>  

编写 Dao 层的代码

public interface UserMapper {

    List<UserEntity> getAll();

    UserEntity getOne(Long id);

    void insert(UserEntity user);

    void update(UserEntity user);

    void delete(Long id);
}
注意:这里的方法名需要和 XML 配置中的 id 属性一致,不然会找不到方法去对应执行的 SQL。

然后就可以测试使用了

如果使用的是 Idea,自动注入时经常会报“could not autowire”,Eclipse 却没有问题,其实代码是正确的,这是 Idea 的误报。可以选择降低 Autowired 检测的级别,不要提示就好。

单击 File | Settings | Editor | Inspections 命令,使用搜索功能找到 Autowiring for Bean Class 选项,将 Severity 的级别由之前的 error 改成 warning 即可。

@Test
public void testUser()  {
    //增加
    userMapper.insert(new UserEntity("aa", "a123456", UserSexEnum.MAN));
    //删除
    int count=userMapper.delete(29l);
    //修改
    userMapper.update(user);
    //查询
    List<UserEntity> users = userMapper.getAll();
    UserEntity user = userMapper.getOne(1l);
}

猜你喜欢

转载自blog.csdn.net/weixin_41555736/article/details/80840632
今日推荐