Mybatis介绍
MyBatis 是一个基于 Java 的持久层(数据访问层)框架,它允许开发者使用 SQL 语句来操作数据库,同时提供了一些高级特性来简化数据库访问和对象关系映射(ORM)。同时起到了简化JDBC(JDBC(Java Database Connectivity)是一种用于执行 SQL 语句的 Java API,可以为多种关系数据库提供统一访问)开发的作用
Mybatis入门
使用mybatis查询所有用户的数据
利用java语句编写查询语句然后传送给服务器的数据库获取数据。
需要在Spring的application.properties中进行配置
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=123456
利用下图注解@Mapper,表示当前是访问mybatis的接口,此时框架会自动执行sql语句。并将sql语句封装到当前方法中。
创建项目时记得勾选mybatis的框架和mysql的驱动
可以看到SpringBoot自动帮我们引入了以下的依赖,包括
mybatis,mysql,和mybatis的启动测试依赖
编写用户类
对应数据库表单进行用户类的编写
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String 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 Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Short getGender() {
return gender;
}
public void setGender(Short gender) {
this.gender = gender;
}
}
编写mabatis操作的接口
//在运行时会自动生成该接口的实现类对象,并交给IOC容器进行管理
@Mapper
public interface UserMapper {
@Select("select * from User")
public List<User> getUserList();
//查询全部用户信息
}
编写测试
@SpringBootTest //springboot整合单元测试的注解
class MybatisPro1ApplicationTests {
@Autowired //依赖注入注解
private UserMapper mapper; //自动成为IOC容器的bean,根据依赖注入的方式
@Test //表示一个单元测试,不加该注解springboot会找不到这个单元测试
public void test(){
List<User> l = mapper.getUserList(); //获取用户的集合元素
l.stream()
.forEach(System.out::println); //用Stream进行输出
}
}
执行单元测试的结果:
成功查询到提前的数据库中插入的数据
记得定义toString方法,不然似乎会输出当前对象的地址
配置Sql提示
由于IDEA不会识别sql语句的语法错误,所以即便写错了也不会报错
1.选择切换数据源到mysql
2.配置mysql数据库的连接
JDBC
原始的JDBC
从链接池中获取连接,避免频繁的获取和释放,实现了连接的复用
数据库连接池
如果没有数据库连接池:
每一次都要开启一个连接,用完之后立刻关闭
用的时候从连接池中取用,用完之后归还给连接池。如果客户端获取了连接但是一致处于空闲状态,如果空闲时间超过了数据库中的预设时间,那么连接池会强制连接的归还。
可以发现在查询的过程中,实际上是利用了Hikari连接池
查出来数据编程null是因为刚刚把查询语句改成了select name
切换连接池的方法:
1.引入起步依赖
2.完成properties的配置
第二种方法:
小结
lombok
硬写实体类会导致代码的臃肿,可以直接利用lombok的注解进行缩减
常见的注解
引入依赖见 lombok学习
原理:在程序编译的时候,根据注解生成相应的方法
Mybatis基础操作
利用mybatis完成数据库的增删改查
预编译sql
sql注入
登录实际上就是查询操作
如果count(*)的结果大于0,那么就登陆成功了
输入如下错误的密码和账号也能登陆成功?
实际上通过注入完成了以下的sql语句,此语句判断永远为真,所以用户最终可以登录成功
通过预编译sql可以解决这个问题:
此外,可以通过如下方法查看mybatis语句执行的sql语句
把整个字符串作为一个参数传递给了password
参数占位符:
区别:
删除操作
其中#{}是mybatis提供的占位符,用于获取被注释的方法所传递的参数
@Delete("delete from emp where emp.id = #{id}")
public Emp deleteEmpById(int id);
查询
查询完成后,我们发现有三个字符值没有封装
原因:
**方法一:**给字段起别名,让其与类中的属性一致
方法二通过mybatis的注解进行手动的映射和封装
方案三开启mybatis的驼峰命名自动映射开关
条件查询
错误 #{}不能写在‘ ’内,所以需要使用${}
解决方法二:利用函数concat(),直接对% 和 所传递的参数进行拼接
第一种方法不安全,存在sql注入问题
增加
直接传递一个类对象,然后对各个属性进行传递
新增(主键返回)
实现:
修改
一点小拓展:
xml映射文件
记得创建包时,使用‘/’而非.进行分隔
这里记得也要使用全类名
mybatis定位的方式:
插件:
装了插件之后,直接Alt+enter 好像也可以直接生成xml映射文件,这里因为创建过了所以提示没有给出来。
动态SQL
<if>
标签
如果满足条件,就将对应的语句拼接到对应sql语句的后面
<where>
标签
根据对应的条件判断是否需要生成 where 或者 是否需要去除语句前面的 and 或者 or
forEach
标签
forEach的五个属性:
总结:
<sql> <include>
如果写成这样,代码块过于臃肿,难以维护。
利用<sql>
标签进行sql片段的抽取,并进行id的指定
根据对应的id,使用<include>
标签进行引用