SpringBoot基础之集成MyBatis

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

前言

对于Java系中,最著名的ORM框架也就是Mybatis,JPA,Hibernate了,在面对领导开发快速迭代的场景想,大部分的项目都是基于SSM的,这个M也就是Mybatis.

Mybatis简单灵活从另一个角度就是需要自己写所有的代码(简单的可以使用代码生成器),Mybatis也有第三方的增强工具比如MybatisPlus,这个下次再说.

集成

Maven包引入

<!--mysql连接驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!--mybatis-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
复制代码

正常项目中都需要引入数据库连接池工具,来管理数据库连接,现在性能最好的一批是DruidHikariCP.Druid是阿里巴巴开源的工具,国内受众比较广,带sql监控.HikariCP是SpringBoot后来默认集成的工具,专注于连接池管理.无监控

HikariCP方式

springBoot默认的数据库连接池是HikariCP,无需再加其他配置

Druid方式

springBoot默认的数据库连接池是HikariCP, 而HikariCPspring-boot-starter-jdbc中,因此需要显示的定义出来spring-boot-starter-jdbc,然后排除HikariCP,再引入Druid.


<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-jdbc</artifactId>
     <exclusions>
       <!--排除HikariCP 连接池-->
         <exclusion>
             <groupId>com.zaxxer</groupId>
             <artifactId>HikariCP</artifactId>
         </exclusion>
     </exclusions>
</dependency>
<!--引入druid -->
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid-spring-boot-starter</artifactId>
     <version>1.1.14</version>
 </dependency>
复制代码

application.yml配置

数据库和连接池配置

HikariCP方式
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver #mysql 8.0
    url: jdbc:mysql:///zdc_test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: 123123
    type: com.zaxxer.hikari.HikariDataSource #当前使用的数据源 Hikari
    hikari:
      minimum-idle: 1 #	池中维护的最小空闲连接数 默认10 根据实际情况来
      maximum-pool-size: 10 # 池中最大连接数    根据实际情况来
      auto-commit: true  # 自动提交从池中返回的连接
      idle-timeout: 600000 # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
      max-lifetime: 1800000 # 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL
      connection-timeout: 30000   # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
      connection-test-query: select 1
      read-only: false      # 是否是只读
复制代码
Druid方式

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver #mysql 8.0
    url: jdbc:mysql:///zdc_test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: 123123
    type: com.alibaba.druid.pool.DruidDataSource #当前使用的数据源 druid
    druid:
      initial-size: 2 #初始化连接大小 根据实际情况来
      min-idle: 1 #	池中维护的最小空闲连接数 默认10 根据实际情况来
      max-active: 10 # 池中最大连接数    根据实际情况来
      default-auto-commit: true # 自动提交从池中返回的连接
      test-on-borrow: true #申请连接时执行validationQuery检测连接是否有效。
      max-evictable-idle-time-millis: 1800000 # 最大生存的时间毫秒
      min-evictable-idle-time-millis: 300000  #最小生存的时间毫秒
      validation-query: select 1
      default-read-only: false  # 是否只读
      aop-patterns: zdc.enterprise.service.impl.*.* # 监控切入点
      filter:               #过滤器配置
        stat:
          enabled: true
          merge-sql: true
          slow-sql-millis: 1
      stat-view-servlet:    # 监听配置
        enabled: true              # 是否启用监控
        url-pattern: /druid/*      #访问路径
        reset-enable: false
        login-username: 123123     #访问账号
        login-password: 123123
复制代码

其中此处代码就是配置Druid监控功能,项目启动之后直接访问/druid,输入账号密码后即可访问

 stat-view-servlet:    # 监听配置
        enabled: true              # 是否启用监控
        url-pattern: /druid/*      #访问路径
        reset-enable: false
        login-username: 123123     #访问账号
        login-password: 123123
复制代码

MyBatis配置

mybatis:
  mapper-locations: "classpath:/mappers/*Mapper.xml"
  type-aliases-package: zdc.enterprise.entity
  configuration:
    use-generated-keys: true
复制代码

mapper-locations: entity对应的xml文件的位置 type-aliases-package:entity包扫描位置

必要的注解配置

Application启动类上添加相关的注解

@ComponentScan({"zdc.enterprise.*"})
@EnableTransactionManagement
@MapperScan("zdc.enterprise.mapper") 
@SpringBootApplication
public class SpringBootEnterpriseApplication  {

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

复制代码

@EnableTransactionManagement是开启事务管理

@MapperScan是配置dao层接口文件的扫描路径,也就是和xml对应的XXMapper或者XXDao的路径

使用

项目目录结构

1637069297(1).png

(1) 在数据库中创建一个student

CREATE TABLE `student` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) DEFAULT NULL,
 `age` int(11) DEFAULT NULL,
 `birthdate` datetime DEFAULT NULL,
 `money` decimal(10,0) DEFAULT NULL,
 `info` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
复制代码

(2) 在entity包下创建Student.java

@Data
@NoArgsConstructor
public class Student {

    /**
     * id
     */
    private Long id;

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 出生日期
     */
    private LocalDate birthdate;

    /**
     * 零花钱
     */
    private BigDecimal money;

    /**
     * 其他信息
     */
    private String info;
}
复制代码

(3) controllerservice没啥可写的

(4) 在Mapper层创建StudentMapper.java接口类

public interface StudentMapper {
    /***
     * 根据参量查询student
     * @param studentDto
     * @return
     */
    List<Student> getStudentByParams(StudentDto studentDto);

    /***
     * 分页查询
     * @param studentDto
     * @return
     */
    List<Student> getStudentPage(StudentDto studentDto, Page page);

    /***
     * 分页查询总数
     * @param studentDto
     * @return
     */
    Long getStudentPageCount(StudentDto studentDto);

    /***
     * 新增student
     * @param student
     * @return
     */
    Long saveStudent(Student student);

    /***
     * 根据id更新student
     * @param student
     * @return
     */
    int updateStudentById(Student student);

    /***
     * 根据id删除tudent
     * @param id
     * @return
     */
    int deleteStudentById(Long id);
}
复制代码

(5)在resourcesmappers文件下创建StudentMapper.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="zdc.enterprise.mapper.StudentMapper">

    <resultMap type="zdc.enterprise.entity.Student" id="BaseResultMap">
        <result column="id" property="id" />
        <result column="name" property="name" />
        <result column="age" property="age" />
        <result column="birthdate" property="birthdate" />
        <result column="money" property="money" />
        <result column="info" property="info" />
    </resultMap>

    <sql id="Base_Column_List">
            `id` ,
            `name` ,
            `age` ,
            `birthdate` ,
            `money` ,
            `info`
    </sql>

    <!-- 列表查询 -->
    <select id="getStudentByParams" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"></include>
        FROM student
        WHERE 1=1
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="name != null and name != ''">
            AND name like  concat('%' , #{name} ,'%')
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
        <if test="birthdate != null">
            AND birthdate = #{birthdate}
        </if>
        <if test="money != null">
            AND money = #{money}
        </if>
        <if test="info != null and info != ''">
            AND info like concat('%' , #{info} ,'%')  /*请根据情况去判断是= 还是like 并删掉此句*/
        </if>
    </select>

    <select id="getStudentPage" resultType="zdc.enterprise.entity.Student">

        SELECT
        <include refid="Base_Column_List"></include>
        FROM student
        WHERE 1=1
        <if test="studentDto.id != null">
            AND id = #{studentDto.id}
        </if>
        <if test="studentDto.name != null and studentDto.name != ''">
            AND name like  concat('%' , #{studentDto.name} ,'%')
        </if>
        <if test="studentDto.age != null">
            AND age = #{studentDto.age}
        </if>
        <if test="studentDto.birthdate != null">
            AND birthdate = #{studentDto.birthdate}
        </if>
        <if test="studentDto.money != null">
            AND money = #{studentDto.money}
        </if>
        <if test="studentDto.info != null and studentDto.info != ''">
            AND info like concat('%' , #{studentDto.info} ,'%')
        </if>
        <if test="page.fenye != null and page.fenye  ">
            limit #{page.start} ,#{page.size}
        </if>
    </select>

    <select id="getStudentPageCount" resultType="java.lang.Long">

        SELECT
             count(1) as count
        FROM student
        WHERE 1=1
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="name != null and name != ''">
            AND name like concat('%' , #{name} ,'%')
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
        <if test="birthdate != null">
            AND birthdate = #{birthdate}
        </if>
        <if test="money != null">
            AND money = #{money}
        </if>
        <if test="info != null and info != ''">
            AND info like concat('%' , #{info} ,'%')
        </if>
    </select>

    <update id="updateStudentById">
       UPDATE  `student` SET
               `name`=#{name},
               `age`=#{age},
               `birthdate`=#{birthdate},
               `money`=#{money},
               `info`=#{info}
         where
         id =#{id}
    </update>


    <!--  请根据此方法,书写自己的update方法,不可以直接使用-->
    <insert id="saveStudent"  keyProperty="id">
        INSERT INTO `student` (
          `name`,
          `age`,
          `birthdate`,
          `money`,
          `info`
        ) values (
           #{name},
           #{age},
           #{birthdate},
           #{money},
           #{info}
        )
    </insert>

    <delete id="deleteStudentById">
        DELETE from student where id = #{id}
    </delete>

</mapper>

复制代码

备注

根据项目需要权衡是否移动要使用原生的MyBatis

在使用MyBatis的时候一定要配合代码生成器使用,网上很多开源的代码生成器,也可以自己写代码模版

如果想更方便的话就配合MyBatisPlus使用吧

Guess you like

Origin juejin.im/post/7031164490972397582