目录
一、入门学习
1、什么是mybatis?
2、入门使用
3、配置SQL提示
4、数据库连接池
5、lombok
二、基础操作学习
1、删除
2、新增
3、更新
4、查询
三、XML配置文件
1、映射规范
2、示例代码展示
四、动态SQL
1、学习
2、学习
3、学习
4、学习
一、入门学习
1、什么是mybatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2、入门使用
mybatis可以在IDEA上使用,学习创建方式和额外的多项配置,引入SQL环境,每次创建mybatis项目后,都得进行一定的环境配置。
上面提供的图片是一个用户信息数据库连接创建的mybatis例子,而右边2中的数据库连接四要素则要在application.properties文件里添加。
3、配置SQL提示
在IDEA的使用中,我们编写Select、Update、Delete等SQL形式的注解时,里面的内容一般不会自动识别显现的,所以要配置SQL提示,能大幅提高代码编写效率。
而在初步配置SQL提示后,我们会发现已有select、update等功能词汇的提示,但涉及数据库信息的不会出现,这时就得引入数据库。
4、JDBC
JDBC是Java Database Connectivity的缩写,它是一组用于Java编程语言中连接和操作数据库的API。JDBC API定义了一组标准接口,使Java应用程序能够与任何关系型数据库进行交互,如Oracle、MySQL、PostgreSQL、Microsoft SQL Server等。
JDBC的作用是允许Java应用程序通过JDBC API与数据库进行通信,以实现对数据库的管理和查询。JDBC API支持创建连接、执行SQL语句、事务处理、元数据检索等操作,这些操作对于任何Java应用程序来说都是必要的。
通过选择各大厂商的JDBC库,可以获取实现数据库执行的各种jar包。
在了解JDBC的大致作用后,我们就该考虑JDBC的使用方法,接下来将给出一个图片比较JDBC的以前使用版本以及现在学习mybatis后使用的简易版本。
在上图中,右边的是繁杂版本,如果只是小型项目且修改内容少的话,确实可以胜用,但如果是大项目且要进行多次更迭的话,还是左边的更好。
4、数据库连接池
什么要用连接池:
对于一个简单的数据库引用,用于对数据库的访问不是很频繁,这种情况可以简单的在需要访问数据库时,创建一个链接,用完关闭它,这样做不会有太明显的性能上的开销。但是对于复杂的数据库引用,情况就截然不同了,频繁的建立、关闭连接,会极大的减低系统的性能,这是对于连接的使用造成系统性能的瓶颈。
连接池的作用:
连接池的作用是为了提高性能,避免重复多次的打开数据库连接而曹诚性能的下降和系统资源的浪费;连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建和销毁的过程。这样以提高系统的性能。
并且数据库选择的连接池有很多类型,比如IDEA默认的Hikari、阿里的Druid。
如果我们想切换依赖的数据库连接池,可以进行依赖添加。
5、lombok
Lombok是一个java库,可以自动插入到你的编辑器和构建工具中,让你的java变得更加简单。再也不用写其getter、setter、equals等方法,只需要一个注解,你的类就可以拥有一个功能齐全的javaBean。
因此我们引入了lombok之后,可以实现各种类的简易功能实现。
二、基础操作学习
1、删除
SQL语句代码:
delete from 表名 where 条件;
下面是一个删除表emq中指定id的信息例子:
delete from emq where id=1;
这是接口实现的方法:
//根据ID删除数据
@Delete("delete from emq where id=#{id}")
public void delete(Integer id);
//在test里的Java文件里实现运行
package com.itheima;
import com.itheima.mapper.EmpMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
@Autowired
private EmpMapper empMapper;
@Test
public void testDelete(){
empMapper.delete(1);
//System.out.println(id);
}
}
补充:
注:上面两种占位符的使用平时偏向于使用#,而$则很少使用,因为#具有更高的安全保护性,为预编译类型。
2、新增
后续的对比例子使用的是同一个表emq,在此展示新增用户信息的代码。
SQL方式:
-- 插入数据
insert into emq(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)
values ('Tom','汤姆',1,'1.jpg',1,'2005-01-01',1,now(),now());
接口实现方式:
//插入数据
@Insert("insert into emq(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 insert(Emp emp);
//想要实现此接口和上面的test里编写代码实现位置相同,后续填写即可
注意:在这上面我们不难发现有的变量名不完全一样,这是因为接口实现中,如果SQL形式里出现create_time这样的,对应的就得以驼峰命名法表示,结果为createTime。
补充:
上面的代码中还差主键返回的设置,因为在运行后现实的情况中无法确认主键的值,所以要有主键返回。
代码展示:
//插入数据
@Options(useGeneratedKeys = true,keyProperty = "id")//获取返回的主键
@Insert("insert into emq(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 insert(Emp emp);
3、更新
SQL方法:
-- 更新数据
update emq set username='',name='',gender='',image='',
job='',entrydate='',dept_id='',update_time='' where id='';
接口实现方法:
//更新员工信息
@Update("update emq set username=#{username},name=#{name},gender=#{gender},image=#{image},\n" +
" job=#{job},entrydate=#{entrydate},dept_id=#{deptId},update_time=#{updateTime} where id=#{id};")
public void update();
4、查询
根据ID查询员工信息
SQL方法:
-- 查询员工信息
select *
from emq where id='';
接口实现方法一:
//根据id查询员工
//原始代码
@Select("select *\n" +
"from emq where id=#id;")
public Emp getById(Integer id);
//出现问题:有的返回内容为null,因为存在dept_id和deptId不同的字段
在得到的结果上出现了问题,那么我们来解决。
接口实现方法二:
//根据id查询员工
//方法一:给字段起别名,让别名与实体类属性一致
@Select("select id, username, password, name, gender, image, job, entrydate, " +
"dept_id deptId, create_time createTime, update_time updateTime\n" +
"from emq where id=#id;")
public Emp getById(Integer id);
接口实现方法三:
//根据id查询员工
//方法二:通过Results,@Result注解手动映射封装
@Results({Selec
@Result(column = "dept_id",property = "deptId"),
@Result(column = "create_time",property = "createTime"),
@Result(column = "update_time",property = "updateTime")
})
@Select("select *\n" +
"from emq where id=#id;")
public Emp getById(Integer id);
接口实现方法四:开启mybatis的驼峰命名自动映射开关
在application.properties里添加 mybatis.configuration.map-underscore-to-camel-case=true
补充:多重条件查询
方式一:
SQL:
-- 条件查询员工
select *
from emq where name like '%张%' and gender=1 and entrydate between '2010-01-01' and '2020-01-01' order by update_time desc ;
接口实现:
//条件查询员工
@Select("select *\n" +
"from emq 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, LocalDateTime begin,LocalDateTime end);
但是上面的接口实现方式存在安全问题,在此就要使用concat了。
方式二:
SQL:
-- 条件查询员工
select *
from emq where name like concat('%','张','%') and gender=1 and entrydate between '2010-01-01' and '2020-01-01' order by update_time desc ;
接口实现:
进行安全改造
@Select("select *\n" +
"from emq 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, LocalDateTime begin,LocalDateTime end);
三、XML配置文件
1、映射规范
2、示例代码展示
EmpMapper.xml代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
<sql id="commonSelect">
select id, username, password, name, gender, image, job, entrydate, dept_id ,create_time ,update_time
from emq;
</sql>
<update id="update2">
update emq
<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="dept_id != null">dept_id=#{deptId},</if>
<if test="update_time != null">update_time=#{updateTime}</if>
</set>
where id = #{id};
</update>
<!-- collection: 遍历的集合-->
<!-- item: 遍历出来的元素-->
<!-- separator: 分隔符-->
<!-- open: 遍历开始前拼接的SQL片段-->
<!-- close:遍历结束后拼接的SQL片段-->
<delete id="deleteById">
delete
from emq where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
<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>
</mapper>
四、动态SQL
1、<if>学习
<if>代表的就是SQL里的if作用
示例代码:
<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>
2、<update>学习
<update>的作用相当于SQL里的update
代码示例:
<update id="update2">
update emq
<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="dept_id != null">dept_id=#{deptId},</if>
<if test="update_time != null">update_time=#{updateTime}</if>
</set>
where id = #{id};
</update>
3、<foreach>学习
<foreach>在动态SQL里与in结合使用
代码示例:
<!-- collection: 遍历的集合-->
<!-- item: 遍历出来的元素-->
<!-- separator: 分隔符-->
<!-- open: 遍历开始前拼接的SQL片段-->
<!-- close:遍历结束后拼接的SQL片段-->
<delete id="deleteById">
delete
from emq where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
4、<sql> <include>学习
作用:
<sql>封装SQL语句简写select 和 insert语句, <include>根据id在查询和新增语句中调用<sql>标签中的语句。
<sql>标签中的id 唯一对应<include>标签中的refid。
代码展示:
<sql id="commonSelect">
select id, username, password, name, gender, image, job, entrydate, dept_id ,create_time ,update_time
from emq;
</sql>
<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>
上面提供的代码便是一个基础的使用方法