在Mybatis初期 需要配置实体类、 配置映射文件 、DAO层代码等一大堆配置. 当然Mybatis 为了解决这些弊端开发了generator 可以根据数据库-数据表自动生成实体类、配置文件和dao层代码,减轻了一部分开发量. MyBatis还提供了注解的方式,适用于小型项目,不用在写配置文件,但是需要在注解上写SQL语句不利于管理. Spring Boot 化繁为简提供了mybatis-spring-boot-starter 可以轻松配置上手.

mybatis-spring-boot-starter 是Mybatis 整合Spring Boot的一套解决方案. 官方的:MyBatis Spring-Boot-Starter will help you use MyBatis with Spring Boot. 官方地址

  1. 首先构建一个Spring Web的Spring Boot项目. 在pom文件中,引入mybatis-spring-boot-starter 依赖包括mysql驱动.spring-boot-starter-web 引入的spring-mvc的依赖实现restful.

    1. <!-- mybatis整合springboot的依赖 -->
    2. <dependency>
    3. <groupId>org.mybatis.spring.boot</groupId>
    4. <artifactId>mybatis-spring-boot-starter</artifactId>
    5. <version>2.1.0</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>org.springframework.boot</groupId>
    9. <artifactId>spring-boot-starter-web</artifactId>
    10. </dependency>
    11. <!-- 引入mysql驱动依赖 -->
    12. <dependency>
    13. <groupId>mysql</groupId>
    14. <artifactId>mysql-connector-java</artifactId>
    15. <version>8.0.19</version>
    16. </dependency>
  2. 在application.yml中配置,端口信息 数据源信息以及mybatis的配置(配置pojo实体类所在的包路径)

  1. server:
  2. port: 8089
  3. tomcat:
  4. uri-encoding: UTF-8
  5. spring:
  6. datasource:
  7. driver-class-name: com.mysql.jdbc.Driver
  8. url: jdbc:mysql://localhost:3306/foodie-shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
  9. username: root
  10. password: root
  11. mybatis:
  12. type-aliases-package: com.prim.demo.t_spring_boot_mybatis.pojo #配置pojo所在包的路径

Spring Boot 会自动加载spring.datasource.* 的数据源配置,并且会自动注入到SqlSessionFactory中.

如果你还不理解,看一看原始的MyBatis加载配置操作,通过SqlSessionFactoryBuilder加载配置,Spring Boot帮助我们大大简化了操作,只需要关注配置文件的维护,Spring Boot内部已经自动加载注入到SqlSessionFactory中了.

  1. private static SqlSessionFactory sqlSessionFactory = null;
  2. static {
  3. try {
  4. //加载xml配置文件
  5. Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
  6. //得到SqlSessionFactory
  7. sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. throw new ExceptionInInitializerError(e);
  11. }
  12. }
  13. public static SqlSession openSession(){
  14. return sqlSessionFactory.openSession();
  15. }
  16. /**
  17. * 设置SQL是否自动提交事务,一般对于数据库的写操作:插入 更新 删除 都需要手动提交事务来保证数据的完整性
  18. * @param isAutoCommit
  19. * @return
  20. */
  21. public static SqlSession openSession(boolean isAutoCommit){
  22. //默认情况下自动提交事务
  23. //false 关闭自动提交 需要手动提交事务
  24. return sqlSessionFactory.openSession(isAutoCommit);
  25. }
  26. public static void closeSession(SqlSession sqlSession){
  27. if (sqlSession != null){
  28. sqlSession.close();
  29. }
  30. }

在启动类中添加对Mapper包的扫描注解@MapperScan

  1. @SpringBootApplication
  2. @MapperScan(basePackages = "com.prim.demo.t_spring_boot_mybatis.mapper")
  3. //扫描mapper 或者在每个Mapper类上加入@Mapper注解不推荐这样使用推荐直接配置包名
  4. public class TSpringBootMybatisApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(TSpringBootMybatisApplication.class, args);
  7. }
  8. }

通过配置mapper包,SpringBoot 会自动将mapper注入到SqlSession中,并且我们在使用时可直接获得实体对象调用.类似原始的方法:

  1. <!-- 采用注解方式 两种方式为了更好的进行维护建议采用package的方式 -->
  2. <mappers>
  3. <!-- <mapper class="com.prim.dao.GoodsDAO"/>-->
  4. <package name="com.prim.dao"/>
  5. </mappers>
  6. public void selectDao(){
  7. SqlSession sqlSession = null;
  8. try {
  9. sqlSession = com.prim.utils.MyBatisUtils.openSession();
  10. GoodsDAO mapper = sqlSession.getMapper(GoodsDAO.class);
  11. List<Goods> list = mapper.selectPriceRange(100, 500, 20);
  12. System.out.println(list.size());
  13. }catch (Exception e){
  14. e.printStackTrace();
  15. }finally {
  16. com.prim.utils.MyBatisUtils.closeSession(sqlSession);
  17. }
  18. }

在Spring Boot中将这些操作,全部在内部处理了,只需通过注入Mapper即可使用.

Mapper类,通过注解的方式输入SQL语句

  1. public interface StuMapper {
  2. @Insert("INSERT INTO stu(name,age) VALUES(#{name},#{age})")
  3. void save(Stu stu);
  4. @Update("UPDATE stu SET name=#{name},age=#{age} where id=#{id}")
  5. void update(Stu stu);
  6. @Results(id = "resultMap", value = {
  7. @Result(property = "id", column = "id", id = true),
  8. @Result(property = "name", column = "name"),
  9. @Result(property = "age", column = "age")
  10. })
  11. @Select("SELECT * FROM stu WHERE id=#{id}")
  12. Stu selectOne(int id);
  13. @ResultMap("resultMap")
  14. @Select("SELECT * FROM stu")
  15. List<Stu> selectAll();
  16. @Delete("DELETE FROM stu WHERE id=#{id}")
  17. void delete(int id);
  18. }
  • @Select 查询类的注解,所有的查询操作
  • @Results 修饰返回的结果集,关联实体类属性和数据库中的字段,可通过设置id,其他方法的查询结果集可以复用
  • @Insert 插入数据操作
  • @Update 修改数据操作
  • @Delete 删除数据操作

注意:一定要使用#符号不要使用\(符号,因为\)符号有SQL注入攻击的漏洞

$符号类似:SELECT * FROM stu WHERE id=’id’

构建业务成Service,@Service 注入业务类,通过@Autowired注入mapper对象

  1. @Service
  2. public class StuServiceImpl implements StuService {
  3. @Autowired
  4. private StuMapper stuMapper;
  5. @Override
  6. public void save() {
  7. Stu stu = new Stu();
  8. stu.setName("test-1");
  9. stu.setAge(32);
  10. stuMapper.save(stu);
  11. }
  12. @Override
  13. public void update(int id) {
  14. Stu stu = new Stu();
  15. stu.setId(id);
  16. stu.setName("update-1");
  17. stu.setAge(28);
  18. stuMapper.update(stu);
  19. }
  20. @Override
  21. public void delete(int id) {
  22. stuMapper.delete(id);
  23. }
  24. @Override
  25. public Stu getOne(int id) {
  26. return stuMapper.selectOne(id);
  27. }
  28. @Override
  29. public List<Stu> getAll() {
  30. return stuMapper.selectAll();
  31. }
  32. }

在api层也就是controller层使用

  1. @RestController
  2. public class TestController {
  3. @Autowired
  4. private StuService stuService;
  5. @GetMapping("/getStu")
  6. public Object getStu(int id) {
  7. return stuService.getOne(id);
  8. }
  9. @PostMapping("/add")
  10. public Object addStu() {
  11. stuService.save();
  12. return "保存 ok";
  13. }
  14. @PostMapping("/update")
  15. public Object updateStu(int id) {
  16. stuService.update(id);
  17. return "更新 ok";
  18. }
  19. @PostMapping("/delete")
  20. public Object deleteStu(int id) {
  21. stuService.delete(id);
  22. return "删除 ok";
  23. }
  24. }

通过XML的方式,不需要在Java类中通过注解写SQL语句,而是和Java代码分离,通过XML的方式映射文件,mapper只需要定义空方法即可

  1. 配置mybatis的xml方式 在application.yml中配置映射文件路径和mybatis的配置文件路径,Spring Boot会自动装配这些配置
  1. mybatis:
  2. type-aliases-package: com.prim.demo.t_spring_boot_mybatis.pojo #配置pojo所在包的路径
  3. mapper-locations: classpath:mapper/*.xml #映射文件的路径
  4. config-location: classpath:mybatis/mybatis-config.xml #mybatis配置文
  1. 配置映射文件 其实就是将注解中的SQL移到映射文件中


    insert into stu(name, age)
    values (#{name}, #{age})

    update stu
    set name=#{name},
    age=#{age}
    where id = #{id}

    delete
    from stu
    where id = #{id}

    select *
    from stu

    SELECT *
    FROM stu
    WHERE id = #{id}

mybatis-config.xml 配置,主要配置了一些基础的信息,比如类名的简化等,这样在映射文件中的parameterType=”java.lang.Integer” 不用这样写了 直接写parameterType=”Integer”

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!-- mybatis 的文档约束 -->
  3. <!DOCTYPE configuration
  4. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  5. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  6. <configuration>
  7. <typeAliases>
  8. <typeAlias alias="Integer" type="java.lang.Integer"/>
  9. <typeAlias alias="Long" type="java.lang.Long"/>
  10. <typeAlias alias="HashMap" type="java.util.HashMap"/>
  11. <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
  12. <typeAlias alias="ArrayList" type="java.util.ArrayList"/>
  13. <typeAlias alias="LinkedList" type="java.util.LinkedList"/>
  14. </typeAliases>
  15. </configuration>

Mapper层的代码方法名只要和映射文件中的id一一对应即可

  1. public interface StuMapper {
  2. void save(Stu stu);
  3. void update(Stu stu);
  4. Stu selectOne(int id);
  5. List<Stu> selectAll();
  6. void delete(int id);
  7. }

至于service层和controller层的代码不用修改.

如何选择呢?

一般在项目中,注解方式适合简单快速的项目.xml方式更加适合大型项目方便管理.实际项目中根据实际情况来选择.

示例代码

版权声明:本文为jakeprim原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jakeprim/p/12560158.html