1、什么是Mybatis
Mybatis是一款优秀的持久层框架,用于简化JDBC开发
Mybatis本是Apache的一个开源项目iBatis,2010年这个项目由apache sfotware foundation 迁移到了google code,并且改名为Mybatis。2013年11月迁移到Github
官网:
https://mybatis.org/mybatis-3/zh/index.html
2、Mybatis入门
快速入门
使用Mybatis查询所有用户数据
步骤:
1.准备工作(创建springboot工程、数据库表user、实体类User)
package com.example.pojo;
public class User {
private Integer id;
private String name;
private String age;
private String gender;
public User(){
}
public User(Integer id, String name, String age, String gender, String phone) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age='" + age + '\'' +
", gender='" + gender + '\'' +
", phone='" + phone + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
private String phone;
}
2.引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)
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=20031003
3.编写SQL语句(注解/XML)
@Mapper // 在运行时,会自动生成该接口的实现类对象(代理对象),并且将该都西昂交给IOC容器管理
public interface UserMapper {
// 查询全部用户信息
@Select("select * from user")
public List<User> list();
}
4.单元测试
@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testListUser(){
List<User> userList = userMapper.list();
userList.stream().forEach(user -> {
System.out.println(user);
});
}
}
配置SQL提示
默认在mybatis中编写SQL语句是不是别的。可以做如下配置
产生原因:Idea和数据库没有建立连接,不识别表信息
解决方式:在idea中配置MySQL数据库连接
JDBC介绍
JDBC:
(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API
本质:
sun公司官方定义的一套操作所有关系型数据库的规范,即接口、、
哥哥数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
数据库连接池
数据库连接池
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
优势
资源重用
提升系统响应速度
避免数据库连接遗漏
标准接口:
DataSource
官方(sun)提供的数据库连接池接口,由第三方组织实现此接口
功能:获取连接
Connection getConnection() throws SQLException;
Druid(德鲁伊)
Druid连接池是阿里巴巴开源的数据库连接池项目
功能强大,性能优秀,是Java语言最好的数据库连接池之一
Hikari(追光者)
springboot默认的连接池
切换Druid数据库连接池
官方地址:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
方法一:
<dependency>
<groupld>com.alibaba</groupld>
<artifactld>druid-spring-boot-starter</artifactld>
<version>1.2.8</version>
</dependency>
方法二:
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.druid.username=root
spring.datasource.druid.password=20031003
lombok
Lombok是一个使用的Java类库,能通过注解的形式自动生成构造器,getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发,提高效率。
3、Mybatis基础增删改查
删除
SQL语句
delete from emp where id = 17;
接口方法
@Delete("delete from emp where id = #{id}")
public void delete(Integer id);
注意:如果mapper接口方法形参只有一个普通类型的参数,#{...}里面的属性名可以随便写,如:#{id}、#{value}
日志输出
在application.properties中,打开mybatis的日志,并指定输出到控制台
#配置mybatis的日志,指定输出到控制台 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
预编译SQL
优势
性能更高
更安全(防止SQL注入)
SQL注入:是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法
参数占位符
新增
SQL语句
insert into emp(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 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语句
接口方法
@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);
查询
SQL语句
SELECT * from emp where id =20;
接口方法
@Select("select * from emp where id =#{id}")
public Emp getById(Integer id);
数据封装
实体类属性名和数据库查询返回的字段名一致,mybatis会自动封装
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装
解决方案
起别名:在SQL语句中,对不一样的列名起别名,别名和实体类shu'xing'm给一样
手动结果映射:通过@Results及@Result进行手动结果映射
开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则
条件查询
SQL语句
接口方法
不是预编译的sql,性能低,不安全,存在sql注入问题
解决方法:用concat
@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(@Param("name") String name, @Param("gender") Short gender, @Param("begin") LocalDate begin, @Param("end") LocalDate end);
参数名说明
在springboot的2.x版本
在springboot的1.x版本/单独使用mybatis
XML映射文件
规范
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
XML映射文件的namespace属性为Mapper接口全限定名一致。
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
MybatisX
一款基于IDEA的快速开发Mybatis的插件,为效率而生
注意:
使用Mybatis的注解,主要是完成一些简单的增删改查功能,如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。
4、Mybatis动态SQL
随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL
<if>
<if>:用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL
<where>:where元素只会在子元素有内容的情况下才插入where自居,而且会自动去除子句开头的and或or
<set>:动态地在行首插入set关键字,并会删掉额外的逗号(用在update语句中)
<foreach>
SQL语句
接口方法
XML映射文件
<sql><include>
<sql>:定义可重用的SQL片段
<include>:通过属性refid,指定包含的sql片段