springboot整合mybatis入门

Posted 好大的月亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot整合mybatis入门相关的知识,希望对你有一定的参考价值。

先上依赖

<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<!--        mybatis启动包-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>


<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!--        数据库驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<!--        数据库连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

yml中配置

主要看mysql连接配置和mybatis的配置,这里的druid对于demo案例来说没啥作用

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf-8
    username: root
    password: 10086
    druid:
      #2.连接池配置
      #初始化连接池的连接数量 大小,最小,最大
      initial-size: 5
      min-idle: 5
      max-active: 20
      #配置获取连接等待超时的时间
      max-wait: 60000
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 30000
      validation-query: SELECT 1 FROM DUAL
      test-while-idle: true
      test-on-borrow: true
      test-on-return: false
      # 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filter:
        stat:
          merge-sql: true
          slow-sql-millis: 5000
      #3.基础监控配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        #设置不统计哪些URL
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        session-stat-enable: true
        session-stat-max-count: 100
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: true
        #设置监控页面的登录名和密码
        login-username: admin
        login-password: admin
        allow: 127.0.0.1
        #deny: 192.168.1.100

mybatis:
  type-aliases-package: com.felix.event.entity  #  让mybatis自己把这个包下的实体类起个别名,不用每次在用它的时候起包名的前缀
  mapper-locations: classpath:mapper/*.xml #让mapper.xml文件可以被扫描到

定义实体类

package com.felix.event.entity;

import lombok.Data;

@Data
public class User {

    private Long id;

    private String name;

    private Integer age;

    private String address;

    private String phone;

}

定义mapper接口

**需要使用@Mapper注解,不然SpringBoot无法扫描**
或者不写mapper注解,在启动类上写上mapper包路径扫描mapper

package com.felix.event.mapper;

import com.felix.event.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {

    void insertUser(User user);

}

定义mapper的xml文件

一般mapper的xml格式:

  • doctype:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  • 使用mapper标签包含:
<mapper namespace="com.pro.dao.UserDao"></mapper>

实际demo

<?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.felix.event.mapper.UserMapper">

    <!--mybatis:
    type-aliases-package: com.felix.event.entity
    因为之前在yml中设置了包名下的实体类让mybatis自动以 小写字母开头的类名为别名,所以 parameterType 这里可以不用写类名全路径-->
    <insert id="insertUser" parameterType="user">
        insert into user(name,age) values (#{name},#{age})
    </insert>
    
</mapper>

开始写点增删改查业务

mvc直接套,在m和c之间service搞起来

package com.felix.event.service;


import com.felix.event.entity.User;

public interface UserService {

    void addUser(User user);
}

这里用autowired肯定会爆红,可以用J2EE的@Resource默认byName注入

package com.felix.event.service.impl;

import com.felix.event.entity.User;
import com.felix.event.mapper.UserMapper;
import com.felix.event.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;


    @Override
    public void addUser(User user) {
        this.userMapper.insertUser(user);
    }
}

启动类加上MapperScan扫描到mybatis的mapper接口

package com.felix.event;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
@MapperScan("com.felix.event.mapper")
public class EventApplication {

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

}

上面有几个要注意的点

1.mapper.xml文件中的namespace中需要与使用@Mapper的接口对应
2.UserMapper.xml文件名称必须与使用@Mapper的接口一致
3.标签中的id必须与@Mapper的接口中的方法名一致,且参数一致

mapper文件中select标签demo

<select
id="selectPerson" //唯一标识sql语句,与接口中方法名一致。
parameterType="int"//入参类型
resultType="hashmap"//期望返回类型的类名或别名,集合时,应该是集合可以包含的类型,而不能是集合本身
resultMap="personResultMap"//引用resultMap标签定义
flushCache="false"//设置为true,清空缓存
useCache="true"//使用cache:本条结果将被缓存
timeout="10000"
fetchSize="256"
statementType="PREPARED"//Statement,PreparedStatement 或 CallableStatement。 默认值:PREPARED
resultSetType="FORWARD_ONLY">//FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE 中的一种。默认是不设置(驱动自行处理)。

定义一个基础column,提供给其他select引入使用

  <sql id="Base_Column_List">
    id, shop_id, shop_member_id, name, gender
  </sql>

  <select id="selectByExample" parameterType="com.xxx.xxx.xxxIntention" resultMap="BaseResultMap">
    select
    <if test="distinct">
      distinct
    </if>
    <include refid="Base_Column_List" />
    from shop_member_intention
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>

使用for循环填充条件
传入的参数是一个Map,在foreach标签里可以直接拿这个参数的key去做判断,可以少写一步mapgetKey

<select id="countByShopIds" parameterType="java.util.Map" resultType="com.xxx.xxx.xxx.xxxIntentionCountVO">
  select shop_id as shopId, count(1) as `count` from xxx
  where is_deleted=0
  <if test="shopIds != null and !shopIds.isEmpty()">
    and shop_id IN
    <foreach collection="shopIds" index="index" item="shopId" open="(" separator=","
             close=")">
      #{shopId}
    </foreach>
  </if>
  group by shop_id
</select>

使用大于等于小于等于这些符号的时候,在xml里是需要转义符号的,或者直接用代码块
原符号 < <= > >= & ' "
替换符号 &lt; &lt;= &gt; &gt;= &amp; &apos; &quot;

但是这样写起来麻烦,看起来也没有符号清楚直接,所以可以使用CDATA代码块,设定里面的块级代码无需转义

    <![CDATA[
    AND gmt_create >=#{beginTime}
    ]]>
     <![CDATA[
    AND gmt_create <=#{endTime}
    ]]>

以上是关于springboot整合mybatis入门的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 整合 MyBatis-Plus 入门体验

springboot整合mybatis入门

mybatis-plus整合springboot入门

mybatis-plus整合springboot入门

SpringBoot入门08-整合Mabatis

SpringBoot基础入门