MyBatis基础

JDBC

概念

JDBC定义了一套标准接口,即访问数据库的通用API, 不同的数据库厂商根据各自数据库的特点去实现这些接口。

查询结果存放在ResultSet对象的一系列行中。

JDBC相关类与接口

驱动管理类 DriverManager

语句对象接口 Statement

连接接口 Connection

结果集接口 ResultSet

JDBC工作原理

  1. Class.forName() 加载驱动

  2.  DriverManager 获取Connection连接

        3. 创建Statement 执行SQL语句

        4. 返回ResultSet 查询结果

        5. 释放资源

JDBC的弊端

  1. 硬编码 SQL语句存在Java代码中,不 能很好的分离数据库语句和 Java语句,造成代码不易维护;

  2. 代码重复度高 大量的重复代码,以 ResultSet 为例,每次都需要重复解析结 果集;

  3. SQL参数固定 SQL语句的参数固定,使得SQL语句不 灵活,无法满足多变的场景。

  4. 底层技术 JDBC属于底层的技术,不支持 分布式,缓存等技术,对于复 杂场景的应对不好;

三层架构

ORM对象关系映射

⭐️⭐️⭐️概念

ORM 模型是数据库的表和简单 Java 对象(Plain Ordinary Java Object,简称 POJO)的映射关系模型,主 要解决数据库数据和 POJO 对象(简单的 Java 对象,实际就是 普通 JavaBeans)的相互映射。

类与数据库中表的映射;对象与表中记录的映射;类的属性与数据库中表的字段的映射。

  1. 类和表、字段和属性

  2. Java字段类型和数据库字段的映射

  3. java一条数据和数据库的映射

  4. Java中一堆数据和数据库的映射

常见的ORM模型

Hibernate

Hibernate 是一个 全自动 的ORM 模 型,Hibernate 可以自动生成 SQL 语 句,自动执行

MyBatis

是一款 半自动 的ORM 模型,它支持定 制化SQL、存储过程以及高级映射

⭐️⭐️⭐️Mybatis和hibernate 区别

  1. Hibernate是全自动化ORM; Mybatis是半自动化ORM。

  2. Hibernate简化dao层,不用考虑SQL语句的编写和结果映射,重点放在业务逻辑上; Mybatis需要手写SQL语句以及结果映射。

  3. Hibernate是一个重量级的框架,内部生成SQL语句,反射操作太多,导致性能下降; Mybatis是一个轻量级的框架,需要自己写sql语句,有较少的反射操作。

  4. 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:

  1. 当没有任何条件的时候,不会添加where关键字 有条件的时候,会添加一个where关键字

  2. 去掉where关键词后的第一个and

上处代码可写成:

choose 元素 (when,otherwise)

多条件分支判断,等 同于 java 的 switch.

  • choos标签相当于java中的 switch 结构

  • 条件有先后顺序,越优先越要写,一旦匹配到了,后面的条件将不会再执行

  • when是条件,自带break

  • otherwise是当所有的when都不执行,才会匹配

trim (where,set)

辅助元素,用于处理一些 SQL 拼接的问题

set标签

  1. 添加set关键词

  2. 去掉最后一个逗号

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 元素的功能 • 自定义一个上下文变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值