JavaWeb-Mybatis

什么是Mybatis?

数据层又叫做持久层

MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。

Mybatis入门

mybatis快速入门

使用Mybatis查询所有用户数据

image-20240307163841670

Mapper层:mybatis的接口层。加mapper注释,数据访问层dao层的接口,

要执行语句那句select语句时,只需要使用list方法,就会默认的调用这个语句,sql语句的访问结果就会默认的封装到这个方法里

step1:准备数据库

运行sql语句创建数据库

step2:创建springboot项目,点上mybatis之类的tool

step3:连接数据库

image-20240307171742192

step4:创建实体类pojo

可以直接用mybatis-generator生成

image-20240307173829357

step5:创建mapper接口层

@Mapper//在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.ljy.demo5.mapper;

import com.ljy.demo5.Pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper//在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理
public interface UserMapper {
//查询全部的用户信息

@Select("select * from user")
public List<User> list();
}

image-20240307173836328

step6:测试

在test项目里测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@SpringBootTest//springboot整合单元测试的注解
class Demo5ApplicationTests {


@Autowired
private UserMapper userMapper;

@Test
public void testListUser(){
List<User> list = userMapper.list();
list.stream().forEach(user -> {
System.out.println(user);
});
}

}

输出结果

image-20240307173935097

JDBC介绍

java database connectivity,就是使用java语言操作关系型数据库的一套API,这是一套规范,sun公司提供的

各个厂商提供jdbc的实现,这个叫做jdbc的驱动、数据库的驱动

image-20240307174626361

image-20240307175035561

数据库连接池

数据库连接池是一个容器,负责分配、管理数据库连接(connection)

它允许应用程序重复使用一个现有的数据库连接,而不是再重新创建一个新的

释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏。

image-20240307175453352

image-20240307175644217

image-20240307175738544

切换Druid数据库连接池

image-20240307175836059

1
2
3
4
5
6
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
pom.xml
1
2
3
4
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=1234

小结

1.数据库连接池

l是一个容器,负责分配、管理数据库连接(Connection)

l优势:资源复用、提升系统响应速度

l接口:DataSource

l产品:C3P0、DBCP、Druid、Hikari

Lombok

Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。

image-20240307180112001

注解 作用
@Getter/@Setter 为所有的属性提供get/set方法
@ToString 会给类自动生成易阅读的 toString 方法
@EqualsAndHashCode 根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法
@Data 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode)
@NoArgsConstructor 为实体类生成无参的构造器方法
@AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方法。

Lombok会在编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件(idea自带)。

Mybatis基础增删改查

准备

按照之前的准备

image-20240307201152408

删除

按照ID删除数据

@Delete注释

占位符 #{id}

1
2
@Delete("delete from emp where id = #{id}")
public void delete(Integer id);
1
2
3
4
5
6
7
8
@Mapper
public interface EmpMapper {

@Delete("delete from emp where id = #{id}")
public int delete(Integer id);


}

日志

image-20240307202608039

image-20240307202628672

预编译sql语句

  • 性能更高
  • 更安全(防止SQL注入)

image-20240307202803149

SQL注入

通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

image-20240307203932583

image-20240307204228284

插入

1
2
3
4
//新增员工
@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);
1
2
3
4
5
6
7
@Test
public void testInsert(){
Emp emp = new Emp();
emp.setUsername("Tom");
emp.setName("汤姆");

}

主键返回@Options(keyProperty=”id”)

描述:在数据添加成功后,需要获取插入数据库数据的主键。如:添加套餐数据时,还需要维护套餐菜品关系表数据。

image-20240307205557662

更新(修改)

1
2
3
4
//更新员工
@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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
public void testUpdate(){
//构造员工对象
Emp emp = new Emp();
emp.setId(18);
emp.setUsername("Tom1");
emp.setName("汤姆1");
emp.setImage("1.jpg");
emp.setGender((short)1);
emp.setJob((short)1);
emp.setEntrydate(LocalDate.of(2000,1,1));
emp.setUpdateTime(LocalDateTime.now());
emp.setDeptId(1);

//执行更新员工操作
empMapper.update(emp);
}

查询

1
2
3
@Select("select * from emp where id = #{id}")
public Emp getById(Integer id);

1
2
3
4
5
@Test
public void testGetById(){
Emp emp = empMapper.getById(18);
System.out.println(emp);
}

image-20240307210950229

数据封装

image-20240307211215522

解决一

image-20240307213019502

1
2
3
4
//方案三: 开启mybatis的驼峰命名自动映射开关 --- a_cloumn ------> aColumn
//根据ID查询员工
@Select("select * from emp where id = #{id}")
public Emp getById(Integer id);

MybatisXML映射文件

image-20240307215655415

xml映射文件

Mybatis动态SQL

随着用户的输入或者外部的变化而变化SQL语句,我们称为动态SQL

if

1
2
3
<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。

<where>:where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR。

image-20240308165208370

foreach

Springboot案例

image-20240309135242851

image-20240309135953209

image-20240309140016098

image-20240309140549167

分页参数

文件上传

表单项

文件上传