SpringBoot整合MyBatis

23
五月
2021
   1、Hibernate 特点就是所有的 Sql 都用 Java 代码来生成,不用跳出程序去写(看) Sql ,有着编程的完整性,发展到最顶端就是 Spring Data Jpa 这种模式了,基本上根据方法名就可以生成对应的 Sql 了。
   2、Mybatis 初期使用比较麻烦,需要各种配置文件、实体类、Dao 层映射关联、还有一大推其它配置。当然 Mybatis 也发现了这种弊端,初期开发了generator可以根据表结果自动生产实体类、配置文件和 Dao 层代码,可以减轻一部分开发量;后期也进行了大量的优化可以使用注解了,自动管理 Dao 层和配置文件等,发展到最顶端就是今天要讲的这种模式了,mybatis-spring-boot-starter 就是 Spring Boot+ Mybatis 可以完全注解不用配置文件,也可以简单配置轻松上手。
   3、现在想想 Spring Boot 就是牛逼呀,任何东西只要关联到 Spring Boot 都是——————化繁为简。       

SpringBoot组件starter命名规则:
SpringBoot官方的Starter: spring-boot-starter-*
第三方Starter: *-spring-boot-starter

一、注解版开发模式

1、引入依赖

<!--引入mybatis-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<!--引入MySQL驱动包-->
<dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
</dependency>
<!--引入druid数据源-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.14</version>
</dependency>

2、application.properties添加相关配置

spring.datasource.url=jdbc:mysql://localhost:3306/spring60
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

SpringBoot启动会自动加载spring.datasource.*属性配置,数据源就会自动注入到SqlSessionFactory中,SqlSessionFactory会自动注入到Mapper中。
在启动类中添加对mapper包扫描@MapperScan

@SpringBootApplication
@MapperScan("com.neo.mapper")
public class MybatisAnnotationApplication {

	public static void main(String[] args) {
		SpringApplication.run(MybatisAnnotationApplication.class, args);
	}
}

也可以直接在Mapper类上面添加注解@Mapper,建议使用上面包扫描注解方式,不然每个mapper加个注解也是非常麻烦的。

@Mapper指定这是一个操作数据库的mapper
@MapperScan包扫描,批量扫描所有的Mapper接口

3、开发Mapper
这一步是最关键的一块,Sql生产都在这里。

public interface UserMapper {
	
	@Select("SELECT * FROM users")
	@Results({
		@Result(property = "userSex",  column = "user_sex", javaType = UserSexEnum.class),
		@Result(property = "nickName", column = "nick_name")
	})
	List<UserEntity> getAll();
	
	@Select("SELECT * FROM users WHERE id = #{id}")
	@Results({
		@Result(property = "userSex",  column = "user_sex", javaType = UserSexEnum.class),
		@Result(property = "nickName", column = "nick_name")
	})
	UserEntity getOne(Long id);

	@Options(useGeneratedKeys = true,keyProperty = "id")//设置主键自增,插入成功后id会重新封装进对象中;keyProperty 标识哪个属性是主键。
	@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})")
	void insert(UserEntity user);

	@Update("UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}")
	void update(UserEntity user);

	@Delete("DELETE FROM users WHERE id =#{id}")
	void delete(Long id);

}
@Select是查询类的注解,所有的查询均使用这个。
@Result修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。
@Insert插入数据库使用,直接传入实例类会自动解析属性到对应的值。
@Update负责修改,也可以直接传入对象。
@delete负责删除。

更多属性参考了解这里
4、使用
完成相关Mapper层开发,使用时当作普通的类注入Controller层即可。

@RestController
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @RequestMapping("/user/{id}")
    public User getUesr(@PathVariable("id") Long id){
        return userMapper.getOne(id);
    }
}

注解版直接使用相关注解即可,MyBatis为我们自动做了配置相关源码均在org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
5、开启驼峰命名

方式1: 自定义MyBatis的配置规则,给容器中添加一个ConfigurationCustomizer即通过向spring容器中注入org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer的方法设置mybatis参数

package com.example.springboot_demo.config;

import org.apache.ibatis.session.Configuration;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;

@org.springframework.context.annotation.Configuration
public class MyBatisConfig {
    
    @Bean
    public ConfigurationCustomizer configurationCustomizer(){
        return new ConfigurationCustomizer() {
            @Override
            public void customize(Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);//开启驼峰命名法
            }
        };
    }
}

在这里插入图片描述
在这里插入图片描述

方式2: 在application.properties配置文件中添加如下配置

mybatis.configuration.map-underscore-to-camel-case=true

二、配置文件开发模式

不管是注解版还是配置版都需要先使用@Mapper@MapperScan将接口扫描装配到容器中。接口层只需要定义空方法,系统会自动根据方法名在映射文件中找对应的 Sql
1、依赖同注解版

2、application.properties添加相关配置

同上增添以下两项即可:
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

指定了Mybatis基础配置文件和实体类映射文件的地址。
3、创建mybatis-config.xml

-------------------------------------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="mapUnderscoreToCamelCase:" value="true"/><!--开启驼峰命名-->
    </settings>
    <typeAliases>
        <package name="cn.clboy.springbootmybatis.model"/>
    </typeAliases>
</configuration>

4、创建mapper接口

public interface EmployeeMapper {

    List<Employee> selectAll();

    int save(Employee employee);
}

5、编写mapper.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">
//namespace:Mapper接口--->绑定Xml
<mapper namespace="cn.clboy.springbootmybatis.mapper.EmployeeMapper">
    <select id="selectAll" resultType="employee">
        SELECT * FROM employee
    </select>
    <insert id="save" parameterType="employee" useGeneratedKeys="true" keyProperty="id">
       INSERT INTO employee(lastName,email,gender,d_id) VALUES (#{lastName},#{email},#{gender},#{d_id})
    </insert>
</mapper>

6、创建controller

@RestController
public class EmployeeController {

    @Autowired
    private EmployeeMapper employeeMapper;

    @RequestMapping("/emp/list")
    public List<Employee> getALl() {
        return employeeMapper.selectAll();
    }

    @RequestMapping("/emp/{id}")
    public Employee save(Employee employee) {
        employeeMapper.save(employee);
        return employee;
    }
}

三、注解、配置混合使用

  • 简单方法直接注解方式
  • 复杂方法编写mapper.xml进行绑定映射
@Mapper
public interface CityMapper {

    @Select("select * from city where id=#{id}")
    public City getById(Long id);

    public void insert(City city);

}

参考:
http://www.ityouknow.com/springboot/2016/11/06/spring-boot-mybatis.html
https://www.yuque.com/atguigu/springboot/aob431#Xcd1B

TAG

网友评论

共有访客发表了评论
请登录后再发布评论,和谐社会,请文明发言,谢谢合作! 立即登录 注册会员