一、根据主键删除
eg:
EmpMapper接口
@Mapper
public interface EmpMapper {
@Delete("delete from tb_emp where id=#{id}")
public void Delete(Integer id);
}
【注】#{...}里面的属性名可以随便写,但,建议与形参名一致,增强可读性。
test测试:
@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private EmpMapper empMapper;
@Test
public void testDelete(){
empMapper.Delete(4);
}
}
删除(预编译SQL)
可以再application.properties中,打开mybatis的日志,并指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
通过预编译的SQL可以防止SQL注入问题,更加安全
参数占位符
eg:
二、新增
EmpMapper:
@Insert("insert into tb_emp (username, create_time, update_time, name, gender, image, job, entrydate, dept_id) " +
"values (#{username},#{createTime},#{updateTime},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId});")
public void insert(Emp emp);
testInsert:
@Test
public void testInsert(){
Emp emp = new Emp();
emp.setCreateTime(LocalDateTime.now());
emp.setImage("1.jpg");
emp.setJob((Integer) 1);
emp.setGender((Integer) 1);
emp.setName("汤姆");
emp.setDeptId(1);
emp.setUsername("Tom");
emp.setEntrydate(LocalDate.of(2000,1,1));
emp.setUpdateTime(LocalDateTime.now());
empMapper.insert(emp);
新增且 获取返回的主键:
EmpMapper:
三、更新
Mapper:
//更新
@Update("update tb_emp set username=#{username},name=#{name},gender=#{gender},image=#{image}," +
"job=#{job},entrydate=#{entraydate},dept_id=#{deptId},update_time=#{updateTime} where id=#{id}")
public void update(Emp emp);
四、查询
Mapper:
//查询
@Select("select * from tb_emp where id=#{id}")
public Emp getById(Integer id);
【注】 实体类属性名 和 数据库表查询返回的字段名一致,mybatis自动封装。
如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装
因此,查询的结果中,有null值
数据库表查询返回的字段名一致
解决方案:
(1)给字段起别名,让别名与实体类属性名一致
@Select("select id, username, create_time createTime, update_time updateTime, password, name, gender, image, job, entrydate, dept_id deptId " +
"from tb_emp where id=#{id}")
public Emp getById(Integer id);
输出结果:已封装进去!!!!
(2)@Result、@Results注解手动映射封装
Mapper:
@Results({
@Result(column ="dept_id" ,property = "deptId"),
@Result(column ="create_time" ,property = "createTime"),
@Result(column ="update_time" ,property = "updateTime")
})
@Select("select * from tb_emp where id=#{id};")
public Emp getById(Integer id)
(3)开启Mybatis的驼峰命名自动映射开关------a_column---->aColumn(常用)
在resource的application.properties中加上
#驼峰命名自动映射开关 mybatis.configuration.map-underscore-to-camel-case=true
那么, Mapper就可以写成:(最初的样子)
@Select("select *from tb_emp where id=#{id}")
public Emp getById(Integer id);
五、条件查询
Mapper:【注】模糊查询用${} 。
Mapper:使用concat的另一种写法:
输出结果:
六、通过XML映射文件配置SQL语句(很重要!!!)
1、XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
2、XML映射文件的namespace属性为Mapper接口全限定名一致
3、XML映射文件中sql语句的id与Mapper接口中方法名一致,并保持返回类型一致
eg:
在resources下创建包:
在mybatis中文网中找下面这段,并复制到XML映射文件
完善XML文件:
mapper接口:
七、动态SQL
随着用户的输入或外部条件的变化而变化的sql语句,称之为动态SQL
<if>用于判断条件是否成立,如果条件为true,则拼接SQL。
形式:<if test="name != null">...<if>
eg:
<select id="list" resultType="com.example.pojo.Emp">
select * from tb_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>
order by update_time desc
</select>
<where>where元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句开头的AND或OR
<set>动态地在行首插入SET关键字,并会删除额外的逗号。(由于update语句中)
<foreach>用于遍历
eg:SQL语句:delete from tb_emp where id in (1,2,3);
接口方法:public void deleteById(List<Integer> ids);
XML映射文件:
<!-- connection :遍历的集合
item:遍历出来的元素
separate:分隔符
open:遍历开始前拼接的SQL片段
close:遍历结束后拼接的SQL片段
-->
<delete id="deleteById">
delete from tb_emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
<include> and <sql> :
<sql id="CommonSelect">
select id,username,passward,name,gender,image,job,entrydate,dept_id,create_time,update_time
from tb_emp
</sql>
<select id="list" resultType="com.example.pojo.Emp">
<include refid="CommonSelect"/>
<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>