Mybatis日常使用技巧

81 阅读3分钟

83277761big_fbb65450b83942893727aa962c01a8e7.png

时至今日,Mybatis已经成为我们持久层解决方案中的重要伴侣,如何优雅的使用它呢,我们一起讨论吧❤️

Mybatis初体验

  • 本文以SpringBoot中使用Mybatis为例,介绍一些本人使用过程中的方式方法
  • 引入依赖
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
  • 添加mapper文件的配置
mybatis:
# 配置mapper的扫描,找到所有的mapper.xml映射文件
    mapperLocations: classpath:mapper/**/*.xml
  • 添加包扫描
//在配置类上添加注解,basePackage为你的dao接口的包路径
@MapperScan(basePackages = {"com.xxx"})
  • 这样配置就搞定了,接下来就是写我们的Dao接口 和对应的sql方法
@Repository
public interface HelloWord{
    //方法的名字 对应xml中的id 返回值 对应xml中的resultType,参数类型对应 xml中的 parameterType
    Person selectById(Long id);
}
<?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="注意这里是上面dao接口的全类名">
    <select id="selectById" resultType="com.xxx.Person" parameterType="long">
        xxx
    </select>
</mapper>
  • 到此 初体验搞定,下面介绍一些使用上的小方式

Mybatis使用

  • 传入一个参数时可以直接取 :根据上面示例,取值:#{id}
  • 传入一个参数时在if语句中取值:
<if test="_parameter != null and _parameter != '' ">
    xxx
</if>
  • 传入多个参数时 Mybatis会对参数进行封装成一个map
    • 其中的key 是 param1...paramN value是传入的具体参数值
    • public void selectNameById(String id , String name) --> #{param1} #{param2}
    • 可以通过加注解的方式自定义key:public void selectNameById(@param("aa")String id , String name) --> #{aa} #{param2}
  • 可以通过bind标签绑定一些参数(模糊查询组装数据的时候 通常使用)
<bind name="_name" value=" '%' + name+ '%' " /> 
  • 抽取sql片段 进行复用
<sql id="">
    ... 
</sql> 

<!--在sql语句中引用用标签,还可以在该标签中添加<propert> 可以在sql片段中引用-->
<sql id=""> 
    ...a,b,c,${name} 
</sql>

<include id="">
    <propert name="name" value="aaa"></propert> 
</include>
  • 单条数据映射成map
//其中 String 为单条记录对应的字段,Object为单条记录对应的值
dao:public map<String,Object> get(String id);
  • 多条记录映射成map
//其中 String 是每条记录的主键,Object是每条记录映射的对象
//需要在dao的方法上面加一个注解 声明哪个字段映射成map的key(示例是主键id)
    @MapKey("id") 
dao:public map<String,Object> get(String id);
  • 使用resultMap 自定义结果集时 遇到级联属性 可以使用(一条sql语句同时查询并映射)
<resultMap type="" id=""> 
    <id column="" property=""/> 
    <result column="" property=""/> 
    <association property="" javaType=""> 
        <id column="" property=""/> 
        <result column="" property=""/> 
    </association> 
</resultMap>
  • resultMap可以进行分步查询(适用场景 假如级联的属性查出多条,可以映射成集合)
<resultMap type="" id=""> 
    <id column="id" property="lm_id"/> 
    <result column="" property="" /> 
    <collection property="" select="Dao.TextDao.query2" column="villageid"> 
        <id column="id" property="id" /> 
        <result column="" property="s" /> 
    </collection> 
</resultMap>
  • 如果返回的时间尾部有个.0,那么就用:DATE_FORMAT(r.begin_time,'%Y-%m-%d %H:%i:%s')

Mybatis标签使用

  • where 可以去除最前面的and
  • set 可以去除最后面的逗号
  • trim 主要功能是可以在Trim包含的内容前加上某些前缀(prefix),也可以在Trim包含的内容之后加上某些后缀(suffix)还可以把Trim包含内容的首部的某些内容忽略掉(prefixOverrides) ,也可以把Trim包含的内容的尾部的某些内容忽略掉(suffixOverrides)
  • choose 这一套组合类似 if-else if-else ,when相当于if,otherwise相当于else,就是说when只能进一个。
<choose>
    <when test=""></when>
    <otherwise></otherwise>
</choose>

以上就是我平时工作中用到的方法,其实配置啊方法啊有很多,但是常用的也就那么几个。欢迎讨论🔥