目录一、JDBC底层基础技术什么是JDBC什么是预编译预编译SQL什么是SQL注入二、Mybatis什么是Mybatis?三、JDBC VS Mybatis四、数据库连接池五、基于Mybatis的增删改查Mybatis中 #{….}和${….}的区别XML映射配置一、JDBC底层基础技术1、什么是JDBCJDBCJava DataBase Connectivityjava数据库连接是使用Java语言操作关系型数据库的一套API规范而MyBatis、MyBatisPlus、Hibernate、SpringData JPA等框架是基于JDBC的高级封装都可以用于操作数据库。各个关系型数据库厂商会基于这套规范去实现这套接口提供数据库驱动jar包具体实现。而我们想要操作数据库需要引入对应的jar包对数据库进行操作我们只需要基于JDBC接口去操作数据库而实际上真正执行的是驱动jar包里的实现类2、JDBC的入门程序创建一个普通的maven项目不用springBoot→引入mysql的jar包依赖→准备数据库表user→编写JDBC程序操作数据库dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version/version /dependency3、JDBC的执行流程注册驱动→获取连接→获取SQL语句的执行对象→执行SQL语句→释放资源//注册驱动(告诉要使用哪一套jdbc的实现) Class.forName(com.mysql.cj.jdbc.Driver);//mysql驱动类的全类名 //获取连接(连接mysql数据库) String urljdbc:mysql://localhost:3306/数据库名; String username; String password; Connection connectionDriverManager.getConnection(url,username,password); //获取sql语句执行对象 Statement statementconnection.createStatement(); //执行sql int rowsAffectedstatement.executeUpdate(update user set age25 where id1); //DML语句,操作语句返回影响的记录数 //释放资源 statement.close(); connection.close();4、JDBC执行DQL查询语句时会涉及到预编译SQLPreparedStatement什么是预编译就是查询语句中没有把参数值写死而是使用一个问好 作为占位符。动态传参它在获取SQL语句执行对象时获取的是PreparedStatement对象而不是普通的Statement对象。PreparedStatement是Statement的一个子接口它继承了Statement//注册驱动、获取连接都是一样的 //预编译sql语句 String sqlselect id,username,password,name,age from user where username? and password?; //获取sql语句执行对象 PreparedStatement statementconnection.preparedStatement(sql); //为占位符赋值 statement.setString(1,daqiao); //执行操作,ResultSet对象用于封装查询的返回结果 ResultSet rsstatement.executeQuery(); //处理结果集,把数据封装到User对象 while(rs.next()){ User usernew User( rs.getInt(id), //rs.getXxx(列名); Xxx是对应的数据类型 rs.getString(username), rs.getInt(age) ); System.out.println(user); //Lombok的Data自动生成的toString方法 }预编译SQL优势一可以防止SQL注入更安全什么是SQL注入SQL注入通过控制输入来修改已经写好的sql语句以达到执行代码对服务器进行攻击在不知道账号名和密码的情况下也能登录成功例如进行登录操作登录操作的实质是查询数据库中有没有这个人 select count(*) from emp where username and password;静态sql是把传入的参数值直接拼接在sql语句中的引号里面拼接好之后再发送给数据库动态sql预编译SQL用一个作为占位符会把带有占位符的sql语句和传入的参数一起传给数据库一个占位符对应一个参数优势二性能更高SQL语句的在Mysql的执行流程SQL语法检查→优化SQL→编译SQL并加入到缓存下次再执行SQL语句时会先看缓存里面有没有如果没有再从头开始检查→优化→编译→执行→执行SQL二、Mybatis什么是Mybatis?它是一个持久层框架用于简化JDBC的开发底层是对JDBC的封装入门程序使用Mybatis查询所有用户数据1、创建SpringBoot工程引入Mybatis依赖2、创建数据库表User、实体类User3、配置Mybatis在application.properties中数据库连接信息4、编写Mybatis持久层接口Mapper public interface UserMapper { Select(select * from user) public ListUser findAll(); }加上Mapper注解就意味着应用程序在运行时会自动创建UserMapper接口的实现类对象(基于动态代理技术创建出来的代理对象),并且会自动将代理对象(实现类)交给SpringIOC容器管理成为bean对象//SpringBoot测试方法 SpringBootTest class SpringbootMybatisQuickatartApplicationTests { Autowired private userMapper userMapper; Test public void testFindAll() { ListUser userListuserMapper.findAll(); userList.forEach(System.out::println); } }加上SpringBoot单元测试注解意味着当测试类中的测试方法运行时会启动springboot项目就会创建IOC容器如果想要容器里哪个bean就直接注入该对象注意测试类必须和启动类在同一包下辅助配置配置mybatis的日志输出//在application.properties里面配置 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl三、JDBC VS Mybatis四、数据库连接池数据库连接池是一个容器负责分配、管理数据库连接。数据库连接池的作用它允许应用程序重复使用一个现有的数据库连接资源重用而不是重新建立一个。提升系统响应速度不用每次都创建连接并释放连接它会释放空闲时间超过最大空闲时间的连接来避免因为没有释放连接而引起的数据库连接遗漏问题。空闲状态是指客户端占着连接但没有操作数据库且不归还给连接池所有的数据库连接池都会实现DataSource接口springboot默认使用的数据库连接池HiKari使用Druid连接池1、在pom.xml中引入依赖!--Druid连接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.27/version /dependency2、application.properties配置数据库连接池信息#配置数据库连接信息 spring.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.datasource.urljdbc:mysql://localhost:3306/web01 spring.datasource.usernameroot spring.datasource.passwordpassword spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver五、基于Mybatis的增删改查1、根据 Id 删除用户信息//userMapper接口 //预编译sql不把sql语句写死 Delete(delete from user where id#{id}) public void deleteById(int id);//在测试方法中返回值是影响的行数 Test public void testDeleteById() { int iuserMapper.deleteById(1); //i是影响的行数 }Mybatis中 #{….}和${….}的区别#{….}是占位符。执行时会将#{….}替换为 生成预编译SQL。安全、性能高常用于参数传递${….}是拼接符。直接把参数拼接在SQL语句中存在SQL注入问题。不安全性能低常用于表名、字段名动态设置时使用。2、添加一个用户因为添加的信息比较多所以通常将信息封装给一个对象把对象传进去//注意#{}里面传递的是对象的属性名 Insert(insert into user(username,password,name,age) values(#{username},#{password},#{name},#{age})) public void addUser(User user);Test public void testInsert() { User usernew User(1,admin,123456,张三,18); userMapper.addUser(user); }3、根据Id更新用户信息Update(update user set username#{username},password#{password},name#{name},age#{age} where id#{id}) public void updateUser(User user);4、根据用户名和密码查询用户信息Select(select * from user where username#{username} and password#{password}) public User findByUsernameAndPassword(Param(username) String username,Param(password) String password);如果方法中传入多个参数需要用Param(…..)注解给形参取名字说明基于官方骨架创建的SpringBoot项目中Param注解可省略Test public void testFindByUsernameAndPassword() { User useruserMapper.findByUsernameAndPassword(admin,123456); System.out.println(user); }在Mybatis中既可以通过注解配置SQL语句也可以通过XML配置文件配置SQL语句简单的增删改查功能使用注解的方式如果实现复杂的SQL功能建议使用XML配置文件XML映射配置1、XML映射文件的名称与mapper接口名称一致并且将XML映射文件和Mapper接口放置同一包下同包同名2、XML映射文件的namespace属性为Mapper接口全限定名一致3、XML映射文件中sql语句的id与Mapper接口中的方法名一致并且返回值类型一致。resultType对应单条记录的全类名//XML配置文件的头信息 ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespaceorg.example.mapper.userMapper select idfindAll resultTypeorg.example.pojo.User select id, username, password, name, age from user /select /mapper如果没有把XML文件放在指定的路径下可以在application.properties里面指定XML映射配置文件的位置#指定XML映射配置文件的位置 mybatis.mapper-locationsclasspath:mapper/*.xml
1. 什么是BFF?为什么需要它?BFF(Backends For Frontends)直译就是"为前端服务的后端"。这个概念最早由ThoughtWorks的Sam Newman在2015年提出,核心思想是为每种类型的前端提供专属的后端服务。想象一下餐厅里…