增删改查
删
@Delete("delete from emp where id = #{id}")
public void delete(Integer id);
// void 改为 int可以返回成功删除的条数
// #{}将替换为?,生成预编译sql,自动设置参数值:适用于参数传递
// ${}直接将参数拼接在sql语句中,存在sql注入问题:适用于对表名,列表进行动态设置时
增
@Options(useGeneratedKeys = true, keyProperty = "id")
// 返回insert的id值
@Insert("INSERT INTO emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
public void insert(Emp emp);
// emp类中对应的下划线命名改为驼峰命名:dept_id->deptId
更通用的注解:@SelectKey
用法:
属性 | 描述 |
---|---|
keyProperty | 表示查询结果赋值给代码中的哪个对象 |
keyColumn | 表示将查询结果赋值给数据库表中哪一列 |
resultType | 填入 keyProperty 的 Java 类型 |
before | 可以设置为 true 或false。要运行的SQL语句。before=true表示插入之前进行查询,可以将查询结果赋给keyProperty和keyColumn,赋给keyColumn相当于更改数据库。before=false表示先插入,再查询,这时只能将结果赋给keyProperty。注意:使用MySQL的last_insert_id()函数时,before必为false,也就是说必须先插入然后执行last_insert_id()才能获得刚刚插入数据的ID |
statementType | 要运行的SQL语句,它的返回值通过resultType来指定 |
例如:
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = false, resultType = Integer.class)
改
@Update("update emp set username=#{username},name=#{name},gender=#{gender},image=#{image},job=#{job},entrydate=#{entrydate},dept_id=#{deptId},create_time=#{createTime},update_time=#{updateTime} where id=#{id}")
void update(Emp emp);
查
@Select("select * from emp where id = #{id}")
Emp selects(Integer id);
// 因为有些是驼峰命名,有些是下划线命名导致返回值为null:
// 1.在sql语句中如:select user_name userName
// 2.在application.properties中加入
// mybatis.configuration.map-underscore-to-camel-case=true
// 将自动映射为驼峰命名
如使用模糊查询:select * from emp where name like ‘张’时:
使用selecy * from emp where name like concat(’%‘,#{name},’%')
ps: %#{name}%不可取,%${name}%存在sql注入问题
映射XML
Emp selects(Integer 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="com.example.mapper.EmpMapper">
<select id="selects" resultType="com.example.pojo.Emp">
select * from emp where id = #{id}
</select>
</mapper>
//映射
规范:
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
XML映射文件的namespace属性为Mapper接口全限定名一致。
XML映射文件中sql语句的id与Mapper 接口中的方法名一致,并保持返回类型一致
update时用<set></set>
条件语句用<where></where>
<if test="username !=null">username=#{username},</if>
foreach用
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
<!--
collection:遍历的集合
item:遍历出的元素
separator:分隔符
open:遍历开始前拼接的sql片段
close:遍历结束后拼接的sql片段
-->
提高代码复用:
<sql id="commonSelect">
select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp
</sql>
引用:
<include refid="commonSelect"/>
注意事项
在xml中,"<"符号会被解析为标签开始,所以需要使用实体编码
<
≤
&eq;
≠
≥
>
lt:less than 小于
le:less than or equal to 小于等于
eq:equal to 等于
ne:not equal to 不等于
ge:greater than or equal to 大于
等于gt:greater than 大于
一些bug(可能)
在xml中一起用时再用order by emp desc limit 1,1时limit报错"Unable to resolve table ‘LIMIT’",但不影响正常运行(可能为idea的bug)
技巧
获取插入语句的id
xml:
<insert id="insertDish" parameterType="com.sky.entity.Dish" useGeneratedKeys="true" keyProperty="id">
insert into dish(name, category_id, price, image, description, status, create_time, update_time, create_user,
update_user)
values (#{name}, #{categoryId}, #{price}, #{image}, #{description}, #{status}, #{createTime}, #{updateTime},
#{createUser}, #{updateUser})
</insert>
java:
dishMapper.insertDish(dish);
Long dishId = dish.getId();