目录
一、Mybatis入门
1.JDBC
2.数据库连接池
3.lombok
二、基础操作
1.删除
根据主键删除
日志输出
预编译SQL
2.新增
新增(主键返回)
3.更新
4.查询
根据ID查询
数据封装
三、映射文件
四、动态SQL
:用于判断条件是否成立
:where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND或OR
案例:完善更新员工功能
:动态的在行首插入SET关键字,并会删掉额外的逗号
sql片段
一、Mybatis入门
1.JDBC
- JDBC:(Java DataBase Connectivity),就是Java语言操作关系型数据库的一套API
2.数据库连接池
- 数据库连接池是个容器,负责分配,管理数据库连接
- 允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
标准接口:DataSource
- 官方sun提供的数据库连接池接口,由第三方组织实现
常见产品
- Druid:阿里巴巴开源
- Hikari(Springboot默认)
3.lombok
二、基础操作
1.删除
-
根据主键删除
//根据ID删除数据@Delete("delete from mybatis.emp where id = #{id}")public void delete(Integer id);
// public int delete(Integer id);
-
日志输出
-
预编译SQL
优势:性能高 安全性好(防止SQL注入)
SQL注入:是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法
2.新增
//新增员工@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);
新增(主键返回)
- 描述:在数据添加成功后,需要获取插入数据库数据的主键。
- 如:添加套餐数据时,还需要维护套餐菜品关系表数据
- 实现
//获取返回的主键
@Options(useGeneratedKeys = true,keyProperty = "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);
3.更新
- SQL语句
update emp set username = '',name = '',gender = '',image = '',job = '',entrydate = '',dept_id = '',update_time = '' where id = 1;
- 接口方法
//更新员工@Update("update emp set username = #{username},name = #{name},gender = #{gender},image = #{image},job = #{job},entrydate = #{entrydate},dept_id = #{deptId},\n" +" update_time = #{updateTime} where id = #{id}")public void update(Emp emp);
4.查询
根据ID查询
- SQL语句
select * from emp where id = 20
- 接口方法
//根据ID查询员工@Select("select * from emp where id = #{id}")public Emp getById(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}")
// public Emp getById(Integer id);//方案二:通过@Results,@Result注解手动映射封装
// @Results({
// @Result(column = "dept_id",property = "deptId"),
// @Result(column = "create_time",property = "createTime"),
// @Result(column = "update_time",property = "updateTime")
// })
// @Select("select * from emp where id = #{id}")
// public Emp getById(Integer id);//最简单:开启Mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true
- 条件查询
SQL语句
-- 根据条件查询
select * from emp where name like concat('%','张','%') 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 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);
三、映射文件
1.XML映射文件
四、动态SQL
-
<if>:用于判断条件是否成立
-
<where>:where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND或OR
<!--resultType: 单条记录封装的类型--><select id="list" resultType="com.itheima.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>
案例:完善更新员工功能
- 需求:动态更新员工信息,如果更新时传递有值,则更新;如果更新时没有传递值,则不更新
<!-- 动态更新员工--><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>
-
<set>:动态的在行首插入SET关键字,并会删掉额外的逗号
-
<foreach>
<!--批量删除员工 (18,19,20)--><!--collection: 遍历的集合item: 遍历出来的元素separator: 分隔符open: 遍历开始前拼接的SQL片段close: 遍历结束后拼接的SQL片段#{id}:每次遍历出来的元素--><delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>
-
sql片段