Mybatis操作
准备
准备数据库表
emp
创建一个新的
springboot
工程,选择引入对应的起步依赖(
mybatis
、
mysql
驱动、
lombok
)
application.properties
中引入数据库连接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc.mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=1234
创建对应的实体类
Emp
(实体类属性采用驼峰命名)
@Data
public class Emp{
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
接口
EmpMapper
@Mapper
public interface EmpMapper{
}
删除
根据主键删除
SQL语句:
delete from emp where id = 17;
接口方法:
@Delete("delete from emp where id = #{id}")
public void delete(Integer id);
注意:
如果mapper接口方法形参只有一个普通类型的参数,#{…} 里面的属性名可以随便写,如:#{id}、#{value}。
日志输出
#指定mybatis输出日志的位置,输出控制台
mybatis.configuration.log-impl=org.appche.ibatis.logging.stdout.StdOutImpl
可以在
application.properties
中,打开
mybatis
的日志,并指定输出到控制台。
预编译SQL
优势
性能更高
更安全
(
防止
SQL
注入
)
SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。
参数占位符
插入(新增)
SQL语句:
insert into emp(username, name, gender,image,job,entrydate,dept_id,create_time,update_time)
values('lingting','聆听',1,'',2,'2010-01-01',2,'2020-01-01 12:00:00','2020-01-01 12:00:00');
接口方法:
@Insert("insert into emp(username,name,gender,image,job,entrydate,dept_id,create_time,update_time)" +
"values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{dept_id},#{create_time},#{update_time})")
public void insert(Emp emp);
主键返回
@Options(keyProperty = "id", useGeneratedKeys = true)
@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);
更新
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}")
public void update(Emp emp);
查询
根据ID查询
SQL语句
select * from emp where id = 19;
接口方法
@Select("select * from emp where id = #{id}")
public Emp getById(Integer id);
数据封装
实体类属性名 和 数据库表查询返回的字段名一致,
mybatis
会自动封装。
如果
实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装。
起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。
@Select("select id, username, password, name, gender, image, job, entrydate, dept_id deptId, create_time createTime, update_time updateTime from emp where id = #{id} ")
public Emp getById(Integer id);
手动结果映射:通过 @Results及@Result 进行手动结果映射。
@Select("select * from emp where id = #{id}")
@Results({
@Result(column = "dept_id", property = "deptId"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime")
})
public Emp getById(Integer id);
开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射。
#开启驼峰命名自动映射,即从数据库字段名 a_column 映射到Java 属性名 aColumn。
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")
public List<Emp> list(String name, Short gender , LocalDate begin , LocalDate end);
// 推荐
@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> list(String name, Short gender , LocalDate begin , LocalDate end);
XML映射文件
1.
XML
映射文件的名称与
Mapper
接口名称一致,并且将
XML
映射文件和
Mapper
接口放置在相同包下
(同包同名)
。
2.
XML
映射文件的
namespace
属性为
Mapper
接口全限定名一致。
3.
XML
映射文件中
sql
语句的
id
与
Mapper
接口中的方法名一致,并保持返回类型一致。
<mapper namespace="Mapper接口全限定名">
<select id="abc" resultType="com.itheima.pojo.Emp">
select * from emp where name like concat('%',#{name},'%') and gender = #{gender}
and entrydate between #{begin} and #{end} order by update_time desc
</select>
</mapper>
动态SQL
随着输入或外部条件的变化而变化的SQL语句,我们称为 动态SQL。
•<if>
<if>
:
用于判断条件是否成立
。
使用
test
属性进行条件判断,如果条件为
true
,则拼接
SQL
。
<where>
:
where
元素只会在子元素有内容的情况下才插入
where
子句。而且会自动去除子句的开头的
AND
或
OR
。
<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》
<set>:动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)
•<foreach>
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><include>
<
sql
>
:
定义可重用的
SQL
片
段。
<include>
:
通过属性
refid
,指定包含的
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"/>