JDBC
概念
JDBC定义了一套标准接口,即访问数据库的通用API, 不同的数据库厂商根据各自数据库的特点去实现这些接口。
查询结果存放在ResultSet对象的一系列行中。
JDBC相关类与接口
驱动管理类 DriverManager
语句对象接口 Statement
连接接口 Connection
结果集接口 ResultSet
JDBC工作原理
-
Class.forName() 加载驱动
-
DriverManager 获取Connection连接
3. 创建Statement 执行SQL语句
4. 返回ResultSet 查询结果
5. 释放资源
JDBC的弊端
-
硬编码 SQL语句存在Java代码中,不 能很好的分离数据库语句和 Java语句,造成代码不易维护;
-
代码重复度高 大量的重复代码,以 ResultSet 为例,每次都需要重复解析结 果集;
-
SQL参数固定 SQL语句的参数固定,使得SQL语句不 灵活,无法满足多变的场景。
-
底层技术 JDBC属于底层的技术,不支持 分布式,缓存等技术,对于复 杂场景的应对不好;
三层架构
ORM对象关系映射
⭐️⭐️⭐️概念
ORM 模型是数据库的表和简单 Java 对象(Plain Ordinary Java Object,简称 POJO)的映射关系模型,主 要解决数据库数据和 POJO 对象(简单的 Java 对象,实际就是 普通 JavaBeans)的相互映射。
类与数据库中表的映射;对象与表中记录的映射;类的属性与数据库中表的字段的映射。
-
类和表、字段和属性
-
Java字段类型和数据库字段的映射
-
java一条数据和数据库的映射
-
Java中一堆数据和数据库的映射
常见的ORM模型
Hibernate
Hibernate 是一个 全自动 的ORM 模 型,Hibernate 可以自动生成 SQL 语 句,自动执行
MyBatis
是一款 半自动 的ORM 模型,它支持定 制化SQL、存储过程以及高级映射
⭐️⭐️⭐️Mybatis和hibernate 区别
-
Hibernate是全自动化ORM; Mybatis是半自动化ORM。
-
Hibernate简化dao层,不用考虑SQL语句的编写和结果映射,重点放在业务逻辑上; Mybatis需要手写SQL语句以及结果映射。
-
Hibernate是一个重量级的框架,内部生成SQL语句,反射操作太多,导致性能下降; Mybatis是一个轻量级的框架,需要自己写sql语句,有较少的反射操作。
-
Hibernate 不方便做SQL优化,遇到较复杂的SQL语句需要绕过框架实现复杂, 对多字段的结构进行部分映射困难;
Mybatis 不仅可以做SQL优化还可以SQL与Java分离,还可以自行编写映射关系, 复杂的SQL语句Mybatis效率更高
Mybatis优势: 可以进行更细致的SQL优化;容易掌握 Hibernate优势; dao层开发比mybatis简单,mybatis需要维护SQL和结果映射 hibernate数据库移植性好
mybatis 解决了jdbc 的问题
1.数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。 解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。 解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。 解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象 解析比较方便。 解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型
Mybatis概念
MyBatis是一款ORM模型,支持定制化SQL、存储过程以及高级映射。可以使用简单的 XML 或注解来配置和映射 原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
半自动化 支持定制化SQL、存储过程以及高级映射;
集成方便 不仅方便 Spring 等 JavaEE 框架的集成,还与其他 ORM 模型集成也很方便
MyBatis 的优势
简单易学,灵活度高,功能完整;
MyBatis 的生命周期
SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession,SQL Mapper;
Mybatis配置
MyBatis 动态代理和映射器
动态SQL
定义
根据不同条件拼接 SQL 语句,实现对数据库更准确的操作。
解决了:动态sql解决的是根据用户的条件不同而对sql进行的改变
实现方式
映射器配置文件或者注解
⭐️⭐️⭐️常用的动态SQL
if元素
判断语句,单条件分支判断
where:
-
当没有任何条件的时候,不会添加where关键字 有条件的时候,会添加一个where关键字
-
去掉where关键词后的第一个and
上处代码可写成:
choose 元素 (when,otherwise)
多条件分支判断,等 同于 java 的 switch.
-
choos标签相当于java中的 switch 结构
-
条件有先后顺序,越优先越要写,一旦匹配到了,后面的条件将不会再执行
-
when是条件,自带break
-
otherwise是当所有的when都不执行,才会匹配
trim (where,set)
辅助元素,用于处理一些 SQL 拼接的问题
set标签
-
添加set关键词
-
去掉最后一个逗号
foreach元素
循环语句,在 in 语 句等列举条件常用
item 循环中的当前元素;
index 当前循环元素的位置下标;
collection 方法传递的参数,一个数组或者集合;
open 以什么符号开始将这些集合元素包装 起来;
close 以什么符号结束将这些集合元素包装 起来;
separator 各个元素的间隔符号
⭐️⭐️⭐️foreach 一次添加多条数据
//foreach一次添加多条数据 public int addStudentList(List<Student> list);
// Student stu1 = new Student(); // stu1.setBirthday(new Date()); // stu1.setClassid(5); // stu1.setSname("刘备"); // stu1.setSsex("男"); // // Student stu2 = new Student(); // stu2.setBirthday(new Date()); // stu2.setClassid(6); // stu2.setSname("关羽"); // stu2.setSsex("男"); // // List<Student> ss = new ArrayList<Student>(); // ss.add(stu1); // ss.add(stu2); // int ret = isd.addStudentList(ss); // if(ret == 3){ // sqlSession.commit(); // }else{ // sqlSession.rollback(); // } // System.out.println("受影响行数"+ret);
⭐️⭐️⭐️bind元素
自定义上下文变量, 传递参数.
name 自定义变量的变量名
value 自定义变量的变量值
parameter 传递进来的参数
模糊查询
(1)方案一 concat 推荐 select * from where sname like concat('%',#{v},'%') (2)方案二 业务层解决模糊符号 不推荐 select * from student where sname like #{v} (3)方案三 sql语法 select * from student where sname like "%"#{v}"%" (4)方案四 ${} 不推荐 select * from student where sname like '%${v}%' (5)方案五 bind标签 用来定义变量 <bind name="keyn" value="'%'+_parameter+'%'"/> select * from student where sname like #{keyn}
⭐️⭐️⭐️
1.bind元素是干什么的?
-----自定义上下文变量,传递参数的
2.#{}和${}的区别?
#{} 预处理sql语句 ?占位 preparedstatment 进行防止sql注入 ${} 字符串的替换 不能防止sql注入
3.常见的动态sql标签及其作用?
• if 元素的常用功能 进行单条件分支判断;
• choose ( when、otherwise ) 元素的功能 进行多条件分支判断;
• trim ( where 、set ) 元素的功能 辅助元素,用于处理一些 SQL 拼接问题;
• foreach 元素的功能 • 在 in 语句等列举条件时使用,循环获取列举的条件;
• bind 元素的功能 • 自定义一个上下文变量