开启mybatis日志打印:
输入mybatislog就会自动提示前半部分
输入std会提示下半部分 这里代表输出到控制台
在配置文件中写入
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
执行SQL增删改语句,回自动返回受影响的行数
参数占位符:
#{···}
执行SQL时,会将 #{···} 替换为 ? ,生成预编译SQL, 会自动设置参数值
使用时机 : 参数传递 , 都使用 #{···}
${···}
拼接SQL. 直接将参数拼接在 SQL 语句中 , 存在 SQL 注入问题
使用时机 : 如果对表名 , 列表进行动态设置时使用.
根据主键删除:
//EmpMapper 接口
@Mapper
public interface EmpMapper {
//删除的SQL语句 delete from Emp where id = #{id}
@Delete("delete from Emp where id = #{id}")
//获取id
public Integer deleteById(Integer id);
}
//测试类
@SpringBootTest
class MybatisApplicationTests {
@Autowired //对象注入
private EmpMapper empmapper;
@Test
void contextLoads() {
//增删改语句执行后,会返回受影响的行数
System.out.println(empmapper.deleteById(16));
}
}
注意事项:如果mapper接口方法形参只有一个普通类型的参数,#{···} 里面的属性名可以随便写
新增:
//EmpMapper 接口
@Mapper
public interface EmpMapper {
@Insert("insert into emp\n" +
"(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)\n" +
"values (#{username},#{name},#{gender}," +
"#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
public void insertByEmp(Emp emp);
}
//测试类
@SpringBootTest
class MybatisApplicationTests {
@Autowired //对象注入
private EmpMapper empmapper;
@Test
void insertInto() {
//模拟前端
Emp emp = new Emp();
emp.setUsername("tom1");
emp.setName("汤姆");
emp.setGender((short) 1);
emp.setImage("1.jpg");
emp.setJob((short) 2);
emp.setEntrydate(LocalDate.of(2002, 1, 7));
emp.setDeptId(1);
emp.setCreateTime(now());
emp.setUpdateTime(now());
empmapper.insertByEmp(emp);
}
注意事项:
1.values其中的变量名都与对象属性相对应
2.数据库的列名以下划线(_)分隔而对象属性以小驼峰命名,在对应时注意修改
新增(主键返回)
方法一 : @Options注解
useGeneratedKeys = true 返回主键开关
keyProperty = "id" 将主键赋值给对象属性(id)
描述:在数据添加成功后,需要获取插入数据库数据的主键.
如:添加套餐数据时,还需要维护套餐菜品关系数据 (在套餐表新建套餐时 , 菜品表的外键也要对应该套餐表的主键, 我们如何在新建套餐时,在菜品表获取该套餐主键并填写呢)
//useGeneratedKeys = true 返回主键开关
//keyProperty = "id" 将主键赋值给对象属性(id)
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into emp\n" +
"(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)\n" +
"values (#{username},#{name},#{gender}," +
"#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
public void insertByEmp(Emp emp);
@Options 的作用
操作过程
方法二:xml写法 和option注解的用法一致
#useGeneratedKeys 返回主键开关
#keyProperty 主键赋值字段
<insert id="addFlavors" useGeneratedKeys="true" keyProperty="id" >
@Insert("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>
更新:
SQL语句(根据ID更新员工信息)
update emp set username = 'arui',name ='阿瑞',gender = 1 , image = '1.jpg' , job = 2 , entrydate = '2012-01-01',dept_id = 2 , update_time = '2022-10-01 12:12:12'
where id = 19;
接口方法:
@Update("update emp set username = #{username},name =#{username},gender = #{gender} , image = #{image} , job = #{job} , entrydate = #{entrydate},dept_id = #{deptId} , update_time = #{updateTime} where id = #{id};")
public void updateById(Emp emp);
条件查询:
接口方法:
public List<Emp> selectConditions(String name, Short gender, LocalDate begin, LocalDate end);
映射语句:
<select id="selectConditions" resultType="com.example.mybatis.pojo.Emp"> select * from emp where name like concat('%', #{name}, '%') and gender = #{gender} and entrydate between #{begin} and #{end}; </select>
注意事项:
姓名模糊查询的条件
不能写为 name like '%#{name}%' 在字符串内当字符串处理, 无法获取数值
应该使用concat字符串拼接函数name like concat('%', #{name}, '%')在获取值后进行拼接
不要忘记resultType指定返回对象的全限定名(包名+类名)