Mybatis介绍、配置以及规范
MyBatis 本质上是作为 Java 类与数据库之间的映射框架。
所谓框架本质上是为解决某一类问题而提供的一套预先设计的解决方案,我们只需要在其中填充业务代码。Maven不属于框架,因为其只是规范了项目的文件结构以及依赖管理,并没有Java代码的基础结构。而Mybatis框架是简化了 Java 应用程序与数据库之间的交互,让我们专注于业务逻辑,而不是两者之间复杂的交互。
上图就是配置了Mybatis后,然后就可以直接在Mapper接口的方法上添加sql语句,将java方法映射到MySQL中,也就是通过java方法做到对数据库的操作。
如果要写比较复杂的SQL语句,比如要用动态SQL,在注解中就无法写,需要写在XML文件中。
规范:
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
- XML映射文件的namespace属性与Mapper接口全限定名一致。
- XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
实体类属性名与数据项名称不一致
如在上图中在xml文件中添加了两者的映射关系,若sql语句在Mapper接口中写的,也可在其中添加,如下图
也可直接在sql语句中添加别名,开启驼峰映射(只能映射实体类 属性小驼峰 与数据项中使用 _ 拼接的)
Mapper增删改查
// 增
@Options(keyProperty = "id", useGeneratedKeys = true)
@Insert("insert into user values (null,#{name},#{age},#{gender},#{phone})")
void save(User user);
// 修改
@Update("update user set name=#{name}, age=#{age}, gender=#{gender}, phone=#{phone} where id=#{id}")
void update(User user);
// 删除
@Delete("delete from user where id=#{id}")
void delete(Integer id);
新增中的Options注解:
- useGeneratedKeys=true 告诉mybatis,当执行完保存操作之后,需要将数据库中新增记录的主键查询回来。
- keyProperty = "id" 查询回来的主键值需要封装到方法参数对象的那个属性上。
// @Select("select * from emp where name like '%${name}%'
// and gender = #{gender} and entrydate between #{begin} and #{end}")
@Select("select * from emp where name like concat('%',#{name},'%')
and gender = #{gender} and entrydate between #{begin} and #{end}")
List<Emp> findList(@Param("name") String name, @Param("gender") Short gender,
@Param("begin") LocalDate begin, @Param("end") LocalDate end);
注:
- 当有方法有多个参数时需要添加@Param注解,用于声明参数在#{}中的名字。也就是说给参数分别绑定一个名字,以便sql语句正确识别参数,否则会给参数默认名称arg1,arg2...
- 模糊查询两种方式,如上代码,建议用 concat('%',#{name},'%'),而不是'%${name}%'
动态sql
根据客户端需求,自动拼接语句,当<if>不成立,则会去掉, <where>会去掉多余的and,<set>会去掉多余的逗号。
<foreach>一般用于批量删除操作。代码如下
其中属性:
- collection:集合名称
- item:集合遍历出来的元素/项
- separator:每一次遍历使用的分隔符
- open:遍历开始前拼接的片段
- close:遍历结束后拼接的片段
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>