MyBatis持久层框架
javaEE三层架构:表现层、业务层、持久层
框架 持久层框架
半成品软件 对jdbc的封装 简化了数据库操作编码
作用:
- 开发效率高 (jdbc) 企业基本不会使用原生的jdbc
- 使用框架开发的 代码 扩展性,灵活性更强
MyBatis快速入门 案例
解决的问题:
- 代码繁琐
- 手动的设置参数
- 手动封装结果跟数据
- sql语句 字符串 写死在了代码当中 字面值 ---- 扩展性灵活性比较差 耦合度比较高
- 硬编码 字面值 - - - 写出来的功能相对来说灵活性就比较差 消耗大量的精力
硬编码的文件全部放在配置文件中
使用反射,自动进行参数的配置,结果集的封装
重点:在配置文件中写sql语句
编写入门案例
-
数据库:
-
数据表:
-
创建maven项目
-
导入jar包
- mybatis框架 jdbc mysql-conector-java
- 单元测试jar包
- 入门案例
-
mybatis实现crud操作
-
1.配置文件:mybatis的核心文件:数据库的连接信息
-
mybatis的SQL语句的配置文件:sql语句
编码:
sqlSessionFactoryBuild
sqlSessionFactory
sqlSession
crud方法
工厂设计模式/构建者设计模式:
- 工厂帮助创建对象(创建对象的操作比较繁琐)
- 解耦的作用
sql语句改变了 只需要修改配置文件 密码也是 硬编码 namespace , id 这块还是硬编码
不需要封装成Java实体对象 set get 也不需要了
基于动态代理 来实现 现在还是调用的会话对象来实现的增删改查
基于代理的开发模式
- 创建mapper接口 定义crud操作数据库的各个方法
- 创建和mapper接口同名称同位置的mapper文件,在配置文件中编写sql语句
- 编码:获取Mapper接口的代理对象,调用mapper接口中定义的方法
规则
-
Mapper配置文件的namespace需要和Mapper接口进行绑定:
namespace设置成接口的全路径:包名称+接口名称
-
mapper接口的方法名称需要和sql标签的id进行绑定:
mapper接口方法名称 和sql标签的id保持一致
mapper接口方法的返回值类型和参数类型 和 sql标签中定义的类类型
-
- 动态代理开发模式
- jdk:特点
- 被代理对象 代理对象 实现了用一个接口
- cglib
- 被代理对象 和 代理对象 是继承 (子父类) 的关系
底层 会生成 一个代理对象 实现 了 接口 重写 里面呢实现类 重写 了jdbc的代码 配置文件的里面的 跟当前方法同名的sql语句 mybatis 帮我们们定义了许多
核心配置文件:
- enviroment 环境标签
- mappers 代理标签
注意: 收到dtd文件的约束
使用外部配置文件
<perso
注意:
Mapper接口和Mapper映射文件:
- 同名称,同位置(target/classes/。。。)
- namespace设置成接口的全路径(包名称+接口名称)
- 接口方法的跟返回值类型/参数 映射文件中的
再来说下参数占位符
- #{}:会将其替换为?。为了防止sql注入的问题,将来自动设置参数值,底层使用的是pareperstatement
- ${}:拼sql。会存在sql注入的问题/,底层使用多个是statement
- 使用时机:
- 参数传递的时候:#{}
- 表名或者列名不固定的情况下:${} 会存在sql注入问题
参数类型:parameterType:可以省略,可以用来设置参数类型
特殊字符处理:
- 转义字符:< 特殊字符比较少的时候使用
- CDTA区:<![CDATA[.........<........]]>: CD 提示
条件表达式?like 模糊查询 select * from tb_brand where status = ? company_name like ? and brand_name like ? -------> 返回一个List集合
如何连接?
步骤:
- 编写接口方法:Mapper接口
- 参数:所有查询条件
- 结果:List
- 编写SQL语句:SQL映射文件
- 执行方法,测试
连接数据库的操作的步骤 编辑数据源
MybatisX 插件
保持一致