资讯专栏INFORMATION COLUMN

Spring Boot [集成-MyBatis]

XBaron / 2964人阅读

摘要:通过配置文件通过配置导入指定的使用的方式属性的同学也可以通过配置通过配置先配置文件使用的方式再配置注意中对象需要添加托管给方能正常使用。建议与任选其一,建议使用通过注解的方式使用,当然如果习惯配置的方式也可以使用。

导读:

在上篇文章中我们介绍了spring-data-jpa的一些常用方法,在这篇文章中我们在介绍关于mybatis与Spring Boot 的集成,及一些常用方法

集成:

这里有两种方式,一种是常规的Spring 应用的集成方式,一种就是Spring Boot 的应用的集成方式,本篇文章所使用的方式为第二种:(想了解第一种的同学可以点击我)

1.添加pom依赖:

    org.mybatis.spring.boot
    mybatis-spring-boot-starter
    1.2.0
2.两种集成方式 a.通过注解:

1).包扫描:

@SpringBootApplication
@MapperScan("cn.sunxyz.mapper")
public class SpringBootMybatisApplication {

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

2).注解声明:

@Mapper
public interface UserMapper {
}

二者任选其一即可,建议使用包扫描的方式。

b.通过配置文件

1).通过yml配置

spring:
  datasource:
    ##导入指定的sql
    schema: import.sql
    url: jdbc:mysql://localhost:3306/spring-boot?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    platform: mysql
#使用 yml的方式
mybatis:
  type-aliases-package: cn.sunxyz.domain
  mapper-locations: ["mapper/UserMapper.xml"]

属性mybatis.xml的同学也可以通过xml配置
2).通过xml配置
<1>.先配置yml文件

#使用 xml的方式
mybatis:
  config-location: mybatis-config.xml

<2>.再配置mybatis-config.xml




    
        
    
    
       
        
    

注意:b.1,b.2中 XXXMapper对象需要添加@Mapper托管给Spring Boot方能正常使用。
建议:a与b任选其一,建议使用a.通过注解 的方式使用,当然如果习惯xml配置的方式也可以使用xml。

使用: 两种sql查询的方式:

(也许称为三种会更好些)
实体类对象

public class User {

    private Integer id;

    private String name;

    private String password;
     
    /**省略set/get**/   
}    
a.注解

1).普通查询(简单查询):

@Mapper
public interface UserMapper {

    // 获取主键
    @Insert("INSERT INTO user(name,password) VALUES (#{name}, #{password}) ")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    int delete(@Param("id") Integer id);

    @Update("UPDATE user SET name = #{name}, password = #{password} WHERE id = #{id}")
    int update(User user);

    @Select("SELECT id, name, password FROM user WHERE id = #{id}")
    @Results(id = "userMap", value = { @Result(column = "id", property = "id", javaType = Integer.class),
            @Result(column = "name", property = "name", javaType = String.class),
            @Result(column = "password", property = "password", javaType = String.class) })
    User findById(Integer id);

    @Select("SELECT * FROM user")
    @ResultMap("userMap")
    List fingAll();
}

2).复杂查询(动态sql):

mappper对象:

@Mapper
public interface UserMapper {

    // 动态生成sql
    @SelectProvider(type = UserMapperProvider.class, method = "findByNameLike")
    List findByNameLike(String name);

    //多参使用map
    @SelectProvider(type = UserMapperProvider.class, method = "findByNameAndPassword")
    List findByNameAndPassword(String name, String password);

    @InsertProvider(type = UserMapperProvider.class, method = "insert")
    int insertUser(User user);

    @DeleteProvider(type = UserMapperProvider.class, method = "delete")
    int deleteUser(Integer id);
}

mappperProvider对象:

public class UserMapperProvider {

    // 动态生成sql
    public String findByName(String name) {
        String sql = "SELECT * FROM user";
        if (StringUtils.isEmpty(name)) {
            return sql;
        }
        sql += " WHERE name LIKE "%" + name + "%"";
        return sql;
    }

    // 使用工具类来准备相同的 SQL 语句
    public String findByNameLike(String name) {
        return new SQL() {
            {
                SELECT("id, name, password");
                FROM("user");
                WHERE("name LIKE "%" + name + "%"");
            }
        }.toString();
    }

    public String findByNameAndPassword(Map map) {

        String name = (String) map.get("param1");
        String password = (String) map.get("param2");

        return new SQL() {
            {
                SELECT("id, name, password");
                FROM("user");
                WHERE("name = " + name);
                AND();
                WHERE("password = " + password);
            }
        }.toString();

    }

    public String update(User user) {
        return new SQL() {
            {

                if (!StringUtils.isEmpty(user.getId())) {
                    UPDATE("user");
                    if (!StringUtils.isEmpty(user.getName())) {
                        SET("name = #{name}");
                    }
                    if (user.getPassword() != null) {
                        SET("password = #{password}");
                    }
                    WHERE("id = #{id}");
                }
            }
        }.toString();
    }

    public String insert(User user) {
        return new SQL() {
            {
                INSERT_INTO("user");
                VALUES("name", "#{name}");
                VALUES("password", "#{password}");

            }
        }.toString();
    }

    public String delete(Integer id) {
        return new SQL() {
            {
                DELETE_FROM("user");
                WHERE("id = #{id}");
            }
        }.toString();
    }

}
b).xml的方式:

3.xml配置方式:
mapper对象:

@Mapper
public interface UserMapper {

    int insertUserXml(User user);
    
}  

mapper.xml文件:


        


    
   
       
   
  
混合:

4).注解/xml 混合
这两种方式可以配合使用比如:

@Mapper
public interface UserMapper {

    int insertUserXml(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    int delete(@Param("id") Integer id);
}   

省略mapper.xml文件
建议: 一般情况下不建议用混合,如果有简单的查询和复杂的查询,建议1).普通查询(简单查询) 与 3.xml配置方式 进行混合查询

分页: 使用PageHelper:

添加pom依赖:


    com.github.pagehelper
    pagehelper
    4.1.0

添加配置:

@Configuration
public class MyBatisConfiguration {
   
    @Bean
    public PageHelper pageHelper() {
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
        p.setProperty("offsetAsPageNum", "true");
        p.setProperty("rowBoundsWithCount", "true");
        p.setProperty("reasonable", "true");
        pageHelper.setProperties(p);
        return pageHelper;
    }
   
}

使用:

    public void contextLoads() {
        PageHelper.startPage(1,2);//无法与 注解生成动态sql同步使用
        List users = userMapper.fingAll();
//        List users = userMapper.findByNameLike("user");
        logger.info(users.toString());
    }

坑: 在使用2).复杂查询(动态sql) 进行查询时会出现异常,如果你正打算使用PageHelper一定要多加留意。

结语:

拖了好久终于又开动了,这篇文章中还有许多内容没有讲到,MyBatis中还有很多东西与细节需要留意,如果在开发中不会有太多的负责查询建议使用Spring Data JPA 。

参考资料:

Spring Boot整合MyBatis
第五章 springboot + mybatis
SpringBoot集成mybatis 推荐里面有一些关于MyBatis内容的扩展
Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】

学习资料:

官方文档
MyBatis入门学习教程(推荐)
Mybatis操作MySql数据库
mybaits学习文档(推荐参考后面的注解文档)

彩蛋
之前写的一个例子 spring-boot-mybatis

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66887.html

相关文章

  • Spring Boot2(一):使用Spring Boot2集成Mybatis基础搭建

    摘要:主要有两种解决方案,一种是使用注解解决一切问题,一种是简化后的老传统。新建项目默认为,直接改为,另外新增一个用户不同环境使用不同的配置文件用。配置指定配置文件为配置开启驼峰命名转换,如。 仓库地址:spring-boot-learning欢迎star、fork,给作者一些鼓励 前言 Mybatis 初期使用比较麻烦,需要各种配置文件、实体类、Dao 层映射关联、还有一大推其它配置。my...

    TANKING 评论0 收藏0
  • spring boot - 收藏集 - 掘金

    摘要:引入了新的环境和概要信息,是一种更揭秘与实战六消息队列篇掘金本文,讲解如何集成,实现消息队列。博客地址揭秘与实战二数据缓存篇掘金本文,讲解如何集成,实现缓存。 Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 健康监控 - 掘金Health 信息是从 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...

    rollback 评论0 收藏0
  • Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制

    摘要:本文章的源码再文章末尾什么是查询缓存有一级缓存和二级缓存。默认开启一级缓存。证明了一级缓存只是在数据库会话内部共享的。但是,整合到中后,一级缓存就会被关闭。根据时间表比如没有刷新间隔缓存不会以任何时间顺序来刷新。 仓库地址:spring-boot-learning欢迎star、fork,给作者一些鼓励 学习SpringBoot集成Mybatis的第二章,了解到Mybatis自带的缓存机...

    mikasa 评论0 收藏0
  • Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制

    摘要:本文章的源码再文章末尾什么是查询缓存有一级缓存和二级缓存。默认开启一级缓存。证明了一级缓存只是在数据库会话内部共享的。但是,整合到中后,一级缓存就会被关闭。根据时间表比如没有刷新间隔缓存不会以任何时间顺序来刷新。 仓库地址:spring-boot-learning欢迎star、fork,给作者一些鼓励 学习SpringBoot集成Mybatis的第二章,了解到Mybatis自带的缓存机...

    NSFish 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<