Skip to main content

MyBatis

一款优秀的**持久层(dao)**框架,用于简化JDBC的开发

官网:https://mybatis.org/mybatis-3/zh/index.html

@Mapper  // 在运行时,会自动的生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理
public interface UserMapper {
// cha'x
@Select("select * from user")
public List<User> list();
}

Lombok

  • Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter等方法,并且可以自动化生成日志变量

    注解作用
    @Gertter/@Setter为所有的属性提供get/set方法
    @ToString会给类自动生成易阅读的toString方法
    @EqualsAndHashCode根据类所拥有的非静态字段自动重写equals方法和hashCode方法
    @Data提供了更综合的生成代码功能(@Getter+@Setter+@ToString+@EqualsAndHashCode)
    @NoArgsConstructor为实体类生成无参的构造器方法
    @AllArgsConstructor为实体类生成除了static修饰的字段之外带有各参数的构造器的方法

日志输出

  • 可以在application.properties中,打开mybatis的日志,并输出到控制台

    #指定mybatis输出日志的位置,输出控制台
    mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  • 预编译:性能更高,更安全(防止SQL注入)

    delete from emp where id = ?(占位符)
    1
    2
    3
    用上面三个数依次替换'?'

    #{……}:执行SQL时,会将#{……}替换成,生成预编译SQL,会自动设置参数值。在参数传递时使用。

    ${……}:拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入问题。在对表名、列表进行动态设置时使用。

删除操作

文件:mapper.EmpMapper(接口)

@Mapper
public interface EmpMapper {
// 根据ID删除数据
@Delete("delete from emp(表名) where id = #{id}")
public void delete(Integer id);
}

新增操作

主键返回

  • 在数据添加成功后,需要获取插入数据库数据的主键
@Mapper
public interface EmpMapper {
@Options(keyProperty="id", useGeneratedKeys = true) // 主键赋值给emp的id属性
@Insert("insert into emp(username, name, gender, image, job, ……)" + "values(#{username}, #{name}, #{gender}, #{image}…… )") // 写属性名,也就是pojo文件夹下的内容
public void insert(Emp emp);
}

更新操作

@Mapper
public interface EmpMapper {
@Update("update emp set username = #{username}, name = #{name}, gender = #{gender}, image = #{image} where id = #{id}") // 写属性名,也就是pojo文件夹下的内容
public void update(Emp emp);
}

查询操作

@Mapper
public interface EmpMapper {
@Select("select * from emp where id = #{id}") // 写属性名,也就是pojo文件夹下的内容
public Emp getById(Integer id);
}

数据封装

ID查询

  • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装,不一致则不会自动封装

    解决方案:
    一、给字段起别名,让别名与实体类属性名一致
    @Select("select id, username, ……, dept_id deptId, create_time createTime from emp where id = #{id}")
    --------------------------------------------
    二、通过@Results, @Result注解手动映射封装, 不常用
    @Results({
    @Result(colum = "dept_id", property = "deptId"),
    @Result(colum = "create_time", property = "createTime"),
    })
    @Select("select * from emp where id = #{id}")
    ---------------------------------------------
    三、开启mybatis的驼峰命名自动映射的开关
    @Select("select * from emp where id = #{id}")
    在application.yml文件中配置
    mybatis:
    configuration:
    map-underscore-to-camel-case: true

条件查询

@Select("select * from emp where name like '%${name}%' and gender=#{gender}……order by update_time desc")  // $有风险,存在sql注入问题
// name模糊匹配,通过'%……%'
@select("select * from emp where name like concat('%', #{name}, '%') and gender=#{gender}……order by update_time desc")
public List<Emp> list(String name, Short gender, ……);

XML映射文件

规范:

  • XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下。

  • XML映射文件的namespace属性为Mapper接口全限定名一致

  • XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致

    创建文件夹时如果是目录用 / 区分上下级,如果是包用 . 区分

    resultType:单条记录所封装的类型

动态SQL

随着用户的输入和外部条件的变化而变化的SQL语句

在…….xml文件中
<select id="list" resultType="com.happlay.pojo.Emp">
select id, username, password, name, gender…… from emp
<where>
<if test="name != null">
name like concat('%', #{name}, '%')
</if>
<if test="gender != null">
and gender = #{gender}
</if>
……
</where>
order by update_time desc
</select>

if标签

用于判断条件是否成立。使用test属性进行条件判断,如果为true,则拼接SQL语句

where标签

where元素只会在子元素有内容的情况下才会插入where子句。而且会自动去除子句开头的and或or

set标签

动态地在行首插入SET关键字,并会额外的删掉逗号

update emp set(这个东西变成标签) name = #{name} where ^

foreach标签

批量删除
delete from emp where id in (1, 2, 3);
<delete id="delete">
delete from emp where id in
<foreach collection="ids" item="id" separator=", " open="(" close=")">
#{id} // 结果是:(?, ?, ?)
</foreach>
</delete>
  • collection:遍历的集合
  • item:遍历出来的元素
  • separator:分隔符
  • open:遍历开始前拼接的SQL片段
  • close:遍历结束后拼接的SQL片段

sql标签&include标签

sql:定义可重用的SQL片段

include:通过属性refid,指定包含的sql片段

在xml文件中定义

同级
<sql id="commonSelect">
select id, username, password, name, gender……from emp
</sql>

<select id="list" resultType="com.happlay.pojo.Emp">
<!--select id, username, password, name, gender…… from emp-->
<include refid="commonSelect"/>
<where>
<if test="name != null">
name like concat('%', #{name}, '%')
</if>
<if test="gender != null">
and gender = #{gender}
</if>
……
</where>
order by update_time desc
</select>