SpringBoot整合mybatis使用

1. 引入依赖

引入springweb、mybatis、lombok、mysql、page-helper、druid连接池、(mybatis generator)依赖

2.在application.yml中添加相关配置

spring:
  datasource:
    name: mybatis_test
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123654
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5                                       # 初始化大小
      min-idle: 10                                          # 最小连接数
      max-active: 20                                        # 最大连接数
      max-wait: 60000                                       # 获取连接时的最大等待时间
      min-evictable-idle-time-millis: 300000                # 一个连接在池中最小生存的时间,单位是毫秒
      time-between-eviction-runs-millis: 60000              # 多久才进行一次检测需要关闭的空闲连接,单位是毫秒
      filters: stat                                         # 配置扩展插件:stat-监控统计,log4j-日志,wall-防火墙(防止SQL注入),去掉后,监控界面的sql无法统计   ,wall
      validation-query: SELECT 1                            # 检测连接是否有效的 SQL语句,为空时以下三个配置均无效
      test-on-borrow: true                                  # 申请连接时执行validationQuery检测连接是否有效,默认true,开启后会降低性能
      test-on-return: true                                  # 归还连接时执行validationQuery检测连接是否有效,默认false,开启后会降低性能
      test-while-idle: true                                 # 申请连接时如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效,默认false,建议开启,不影响性能
      stat-view-servlet:
        enabled: true                                       # 是否开启 StatViewServlet
        allow: 127.0.0.1                                    # 访问监控页面 白名单,默认127.0.0.1
        deny: 192.168.56.1                                  # 访问监控页面 黑名单
        login-username: admin                               # 访问监控页面 登陆账号
        login-password: admin                               # 访问监控页面 登陆密码
      filter:
        stat:
          enabled: true                                     # 是否开启 FilterStat,默认true
          log-slow-sql: true                                # 是否开启 慢SQL 记录,默认false
          slow-sql-millis: 5000                             # 慢 SQL 的标准,默认 3000,单位:毫秒
          merge-sql: false                                  # 合并多个连接池的监控数据,默认false

mybatis:
  #标注mybatis配置文件的位置
  config-location: classpath:mybatis-config.xml
  #标注待解析的mapper的xml文件位置
  mapper-locations: classpath:mapper/*.xml



#开启连接池日志记录
logging:
  level:
    org:
      apache:
        tomcat:
          jdbc:
            pool:
              ConnectionPool=DEBUG:

3.配置mybatis-config.xml

详细配置可参考mybatis中配置文件mybatisconfig详解---[纯笔记]_CodeMartain的博客-CSDN博客

<?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>
        <!-- #开启mybatis驼峰式命名规则自动转换 -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>
</configuration>

4.(可选)配置mybatis代码生成器

(1)配置generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 为模型生成序列化方法-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
        <!-- 为生成的Java模型创建一个toString方法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
        <!--可以自定义生成model的代码注释-->
<!--        todo : 换成自己的类路径-->
        <commentGenerator type="com.example.mybatisdemo.mbg.CommentGenerator">
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        <!--配置数据库连接-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai&amp;useSSL=false"
                        userId="root"
                        password="123654">
            <!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
            <property name="nullCatalogMeansCurrent" value="true" />
        </jdbcConnection>
<!--        todo: 把所有路径换成自己的路径-->
        <!--指定生成model的路径-->
        <javaModelGenerator targetPackage="com.example.mybatisdemo.mbg.model" targetProject="mybatis-demo\src\main\java"/>
        <!--指定生成mapper.xml的路径-->
        <sqlMapGenerator targetPackage="com.example.mybatisdemo.mbg.mapper" targetProject="mybatis-demo\src\main\resources"/>
        <!--指定生成mapper接口的的路径-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mybatisdemo.mbg.mapper"
                             targetProject="mybatis-demo\src\main\java"/>
<!--        todo:设置生成表名-->
        <!--生成全部表tableName设为%-->
        <table tableName="user">
        </table>
    </context>
</generatorConfiguration>

(2)编写Generaotor代码

package com.example.mybatisdemo.mbg;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
 * 用于生产MBG的代码
 * Created by macro on 2018/4/26.
 */
public class Generator {
    public static void main(String[] args) throws Exception {
        //MBG 执行过程中的警告信息
        List<String> warnings = new ArrayList<String>();
        //当生成的代码重复时,覆盖原代码
        boolean overwrite = true;
        //读取我们的 MBG 配置文件
        InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();

        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        //创建 MBG
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        //执行生成代码
        myBatisGenerator.generate(null);
        //输出警告信息
        for (String warning : warnings) {
            System.out.println(warning);
        }
    }
}

(3)编写CommentGennerator

package com.example.mybatisdemo.mbg;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;

import java.util.Properties;

/**
 * 自定义注释生成器
 * Created by macro on 2018/4/26.
 */
public class CommentGenerator extends DefaultCommentGenerator {
    private boolean addRemarkComments = false;

    /**
     * 设置用户配置的参数
     */
    @Override
    public void addConfigurationProperties(Properties properties) {
        super.addConfigurationProperties(properties);
        this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
    }

    /**
     * 给字段添加注释
     */
    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable,
                                IntrospectedColumn introspectedColumn) {
        String remarks = introspectedColumn.getRemarks();
        //根据参数和备注信息判断是否添加备注信息
        if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
            addFieldJavaDoc(field, remarks);
        }
    }

    /**
     * 给model的字段添加注释
     */
    private void addFieldJavaDoc(Field field, String remarks) {
        //文档注释开始
        field.addJavaDocLine("/**");
        //获取数据库字段的备注信息
        String[] remarkLines = remarks.split(System.getProperty("line.separator"));
        for (String remarkLine : remarkLines) {
            field.addJavaDocLine(" * " + remarkLine);
        }
        addJavadocTag(field, false);
        field.addJavaDocLine(" */");
    }

}

(4)运行Generator.main

5.自定义测试类、准备数据库表项、添加mapperScan

6.基于注解的增删改查

 SQL语句的占位符:

当使用select  where like时,单引号内不能出现#{},此时可以使用concat函数解决。

(1)Insert

定义Mapper接口,实现类由框架生成。

test:

(2)两种Select

1. 使用别名和ResultType

 

 2.使用ResultMap

 ResultMap可以复用

(3)Delete

 (4)Update

7.通过XML映射文件进行操作

 resultMap详解:

[MyBatis]-resultMap结果映射集详解_MarchZhen的博客-CSDN博客

xml映射文档:

mybatis – MyBatis 3 | XML 映射器

1.创建书表和作者表,一个作者对应多本书。

  

 

 创建相应的Entity、mapper、mapper.xml(略)

新增书本、查询书本示例:

1.BookMapper中新增方法

 

2.编写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.example.mybatisdemo.dao.BookMapper">


<!--    插入并返回自增主键-->
    <insert id="insertBook" parameterType="com.example.mybatisdemo.entity.Book" useGeneratedKeys="true" keyProperty="id" keyColumn="book_id">
        insert into test.book(book_id, name, author_id) VALUES (#{id},#{name},#{authorId})
    </insert>

    <resultMap id="bookMap" type="com.example.mybatisdemo.entity.Book">
        <id property="id" column="book_id"/>
        <result property="name" column="name"/>
        <result property="authorId" column="author_id"/>
    </resultMap>
    <select id="selectBook" resultMap="bookMap">
        select *
        from test.book
        where book_id=#{id}
    </select>

</mapper>

级联映射

现在假设我们有个需求:根据作者查询书本信息

1.在Entity中新增对象

 2.根据作者查询书本信息:

(1)使用嵌套关联查询

在BookMapper.xml中新增根据作者ID查询的语句,在Bookmapper接口中新增对应的函数

<select id="selectBookByAuthor" resultMap="bookMap">
        select *
        from test.book
        where author_id=#{id}
    </select>

编写AuthorMapper:

<?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.example.mybatisdemo.dao.AuthorMapper">
    <resultMap id="AuthorAndBookMap" type="com.example.mybatisdemo.entity.Author">
        <id column="author_id" property="id"/>
        <result column="name" property="name"/>
<!--        collection里面的column值为嵌套查询的条件,fetchType开启延迟加载-->
        <collection property="books" column="author_id" fetchType="lazy"
                    ofType="com.example.mybatisdemo.entity.Book"
                    select="com.example.mybatisdemo.dao.BookMapper.selectBookByAuthor"/>
    </resultMap>
    <select id="selectAuthorAndBooks" resultMap="AuthorAndBookMap">
        select *
        from test.author
        where author_id=#{id}
    </select>
</mapper>

 

 可以看到开启延迟加载的情况下只加载了前面的sql语句。

 分步查询虽然有一定的好处,但是可能产生N+1问题。

N+1问题:

要解决N+1问题,可以使用嵌套结果映射

(2)使用嵌套结果映射

 <resultMap id="AuthorAndBookMap2" type="com.example.mybatisdemo.entity.Author">
        <id column="author_id" property="id"/>
        <result column="name" property="name"/>
        <collection property="books"
                    ofType="com.example.mybatisdemo.entity.Book">
            <id column="book_id" property="id"/>
<!--  在mybatis的嵌套中,如果内层对象和外层对象重名,内层对象会被外层对象覆盖。因此需要更名-->
            <result column="bookname" property="name"/>
        </collection>
    </resultMap>

    <select id="selectAuthorAndBooks2" resultMap="AuthorAndBookMap2">
        select a.author_id,a.name,b.book_id,b.name AS bookname
        from test.author as a left join test.book as b on a.author_id=b.author_id
    </select>

动态SQL

动态SQL可以动态指定查询条件的数量。

if标签:如果条件成立则拼接

 where标签:用于查询,只会在子元素有内容的情况下才插入where,而且会自动去除子句开头的AND 和OR

set标签:用于动态更新,可以去除语句后面的逗号

 for each标签:可以用在对集合进行遍历(尤其是在构建 IN 条件语句的时候)

示例:批量查询书本。

声明函数:

#collection=参数的类型,item=每次循环取出的参数的名字
            #open=开始时拼接字段
            #separator=中间分割时的拼接字段
            #nullable:参数是否允许为空
            #可选:index、close等
<select id="selectBooksByName" resultMap = "bookMap">
        select *
        from test.book
        <where>
            <foreach collection="list" item="name"
                     open ="name like"
                     separator="or name like"
                     nullable="false">
            concat('%',#{name},'%')
            </foreach>
        </where>
</select>

测试:

SQL标签和include 标签

8.分页插件

官方文档

https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
整合MyBatisSpringBoot可以让我们更加方便地使用MyBatis进行数据库操作,下面是使用Java SpringBoot整合MyBatis的步骤: 1.在pom.xml文件中添加MyBatisMyBatis-Spring的依赖项: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> ``` 2.创建一个application.properties文件来配置数据库连接信息: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 3.创建一个Mapper接口,用于定义SQL语句的执行方法: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User getUserById(Integer id); } ``` 4.创建一个Service层,调用Mapper中的方法: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public User getUserById(Integer id) { return userMapper.getUserById(id); } } ``` 5.在SpringBoot的启动类中添加@MapperScan注解,用于扫描Mapper接口: ```java @SpringBootApplication @MapperScan("com.example.demo.mapper") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 6.使用@Service注解将Service层添加到Spring容器中: ```java @Service public class UserService { // ... } ``` 现在,你已经成功地使用Java SpringBoot整合MyBatis。在Controller层中,你可以使用@Autowired注解将Service层注入到Controller中,然后调用Service层中的方法来完成数据库操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值