@Data
@NoArgsConstructor
@AllArgsConstructor
public class EmpModel {
private Integer id;
private String username;
private String password;
private String name;
private Short gender;
private String image;
private Short job;
private LocalDate entrydate;
private Integer deptId;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
@Mapper
public interface EmpDao {
}
根据主键id删除员工信息
SQL语句
delete from emp where id = 17;
接口方法
@Delete("delete from emp where id = #{id}")
void deleteEmp(Integer id);
测试
@SpringBootTest
class SpringbootWebCurdApplicationTests {
@Autowired
private EmpDao empDao;
@Test
public void deleteEmp(){
empDao.deleteEmp(17);
}
}
注意事项
日志输出
# 配置MyBatis日志,指定输入到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
预编译SQL
SQL注入
${...}
SQL语句
insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) values ('songyuanqiao','宋远桥',1,'1.jpg',2,'2012-10-09',2,'2022-10-01 10:00:00','2022-10-01
接口方法
@Insert("insert emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
" values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
void insertEmp(EmpModel emp);
新增(主键返回)
实现
//表示 需要获取返回回来的主键值, keyProperty 返回的值往那个字段里封装
@Options(useGeneratedKeys = true,keyProperty = "id")
@Insert("insert emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
" values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
void insertEmp(EmpModel emp);
SQL(根据ID更新员工信息)
update emp set username = 'songdaxia', 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=#{name},gender=#{gender},image=#{image},job=#{job},entrydate=#{entrydate},dept_id=#{deptId},update_time=#{updateTime} where id = #{id}")
void updateEmp(EmpModel emp);
SQL语句(根据ID查询)
select * from emp where id = 18;
接口方法
@Select("select * from emp where id = #{id}")
EmpModel getEmpById(Integer id);
发现问题
数据封装
解决问题方案一:起别名
@Select("select id, username, password, name, gender, image, job, entrydate," +
" dept_id deptID, create_time createTime, update_time updateTime from emp where id = #{id}")
EmpModel getEmpById(Integer id);
方案二:手动结果映射
@Results({
//column 表中字段,property 实体类映射属性
@Result(column = "dept_id",property = "deptId"),
@Result(column = "update_time",property = "updateTime"),
@Result(column = "create_time",property = "createTime")
})
@Select("select * from emp where id = #{id}")
EmpModel getEmpById(Integer id);
方案三:开启驼峰命名
#开启mybatis的驼峰命名自动映射开发
mybatis.configuration.map-underscore-to-camel-case=true
SQL(条件查询)
select * from emp where name like '%张%' and gender = 1 and entrydate between '2010-01-01' and '2020-01-01 ' order by update_time desc;
接口方法
@Select("select * from emp where name like '%${name}%' and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time DESC")
List<EmpModel> getEmpsByConditions(String name, Short gender, LocalDate begin,LocalDate end);
//根据MySQL concat拼接字符串函数来解决${name} 防止注入问题
@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time DESC")
List<EmpModel> getEmpsByConditions(String name, Short gender, LocalDate begin,LocalDate end);
规范
XML映射文件的namespace属性为Mapper/Dao接口全限定名一致
XML映射文件中sql语句的id与Mapper/Dao接口中的方法名一致,并保持返回类型一致
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mhn.dao.EmpDao">
<select id="list" resultType="com.mhn.model.EmpModel">
select * from emp where name like concat('%',#{name},'%') and
gender = #{gender} and entrydate between #{begin} and #{end} order by update_time DESC
</select>
</mapper>
@Mapper
public interface EmpDao {
public List<Emp> list (String name, Short gender , LocalDate begin , LocalDate end);
}
MybatisX是一款基于IDEA的快速开发Mybatis的插件,为效率
安装
使用MyBatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句
随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL
if
select id, username, password, name, gender, image, job,entrydate, dept_id, create_time, update_time
from emp
where
<if test="name != null">
name like concat('%',#{name},'%')
</if>
<if test="gender != null">
and gender = #{gender}
</if>
<if test="begin != null and end != null">
and entrydate between #{begin} and #{end}
</if>
遇见问题,如果name没有传送值,则预编译的sql会遇到 where 后直接跟and
where标签
select id, username, password, name, gender, image, job,entrydate, dept_id, create_time, update_time
from emp
<where>
<if test="name != null">
name like concat('%',#{name},'%')
</if>
<if test="gender != null">
and gender = #{gender}
</if>
<if test="begin != null and end != null">
and entrydate between #{begin} and #{end}
</if>
</where>
where 会灵活的删除后面多余的and或or,来防止问题的发生
<update id="update2">
update emp
<set>
<if test="username != null">username=#{username},</if>
<if test="name != null">name=#{name},</if>
<if test="gender != null">gender=#{gender},</if>
<if test="image != null">image=#{image},</if>
<if test="job != null">job=#{job},</if>
<if test="entrydate != null">entrydate=#{entrydate},</if>
<if test="deptId != null">dept_id=#{deptId},</if>
<if test="updateTime != null">update_time=#{updateTime}</if>
</set>
where id = #{id}
</update>
场景
SQL语句
delete from emp where id in(1,2,3);
接口方法
public void deleteByIds(List<Integer> ids);
XML映射问及那
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
<sql id="commonSelect">select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp</sql>
<select id="list" resultType="com.mhn.model.EmpModel">
<include refid="commonSelect"></include>
<where>
<if test="name != null">
name like concat('%',#{name},'%')
</if>
<if test="gender != null">
and gender = #{gender}
</if>
<if test="begin != null and end != null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time DESC
</select>