【Mybatis】增删改查CRUD快速入门

增删改查

@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中,"<"符号会被解析为标签开始,所以需要使用实体编码

&lt;
&le;
&eq;
&ne;
&ge;
&gt;

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值