MyBatis笔记
开发模式
-
纯jsp开发 视图和逻辑混全在一起了
-
jsp+javabean jsp视图技术显示内容 javabean 封装了逻辑
-
MVC 设计模式
M: model 业务层 专注于业务逻辑
V: view 视图层 展示数据: jsp freemarker Thymeleaf (不存在了…)
C: controller 控制层 接收用户请求 ,调用业务逻辑,根据业务逻辑返回的结果,跳转到相应的视图
Dao: 数据访问层 数据持久层
持久层
jdbc: java database connection
查询用户:
- 加载驱动 Class.forName(“com.mysql.cj.jdbc.Driver”)
- 获取连接 Connection conn=DriverManager.getConnection(url,username,password)
- 定义 select 查询语句
- 创建语句对象 Statement stat=conn.createStatement(sql)
- 执行查询 ResultSet rs=stat.executeQuery()
- 将ResultSet转换成List集合
- 释放资源(关闭连接 关闭结果集…)
Spring : JdbcTemplate
ssh: spring struts1© hibernate
ORM: object relation mapping 对象关系 映射
hibernate 是完全的ORM持久层技术
设计数据模型:
Student类: id name age …
映射文件: Student.xml
Student类对应数据库中哪个表
属性id------------对应数据库中字段名
依次类推…
创建Student类对象,直接使用hibernate的api save(student)
hql语句: hibernate query language
sql: 结构化查询语言
缺点:
- 如果应用中用到了大量的数据库本身的函数
- 有大量的数据统计
ssi: ibatis
mybatis
半自动的ORM框架
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
高级映射(重点)
特点:
-
自已编写sql
-
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
-
sql实现
-
xml映射 官方推荐的
html hyper text markup language 超文本标记语言
xml : 可扩展的标记语语言 描述数据 soa
<student idcard="4102000"> <name>张三</name> <age>20</age> </student>
dtd : 文档验证格式
schema 验证的
-
注解 的形式 如@Select(“select …”) 简单 (了解)
-
解析dtd
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
ELEMENT 代表的是元素
configuration 元素名称 () 代表的是configuration元素下允许出现的子元素有哪些
()里的元素出现的顺序不允许打乱 ,元素定义的顺序必须安排声明的顺序来定义
元素限定符:
- ? 代表的是前面的元素最多可以出现1次
- * 代表前面的元素可以出现任意次
- + 代表前面的元素最少出现1次
<!ELEMENT properties (property*)>
<!ATTLIST properties
resource CDATA #IMPLIED
url CDATA #IMPLIED
>
properties元素下可以出现任意 个property子元素
ATTLIST 属性列表 CDATA character data 字符数据
映射器
映射器是一些绑定映射语句的接口
作用域对象
-
SqlSession
- 执行crud操作的
- SqlSession 的实例不是线程安全的,因此是不能被共享的
- 它是轻量级的 它的获取和关闭 不耗费资源 随时打开和关闭
- 它的作用域 方法作用域
- 它是由SqlSessionFactory 类创建的
-
SqlSessionFactory
- 它是用来创建SqlSession 的
- 它是重量级的,整个应用中只存在一个实例 ,不要频繁的创建和销毁
- 一个SqlSessionFactory 实例对应一个数据库
- 最佳应用是单例模式
-
SqlSessionFactoryBuilder
- 使用创建者模式 来创建SqlSessionFactory 的
- 创建好SqlSessionFactory实例,就可以销毁
命名 空间
命名解析:
- 全限定名 com.by.mapper.UserMapper.queryById
- 短名称 queryById 要求这个名称全局唯一
单例模式
在整个应用中,只有一个实例。
满足的条件:
- 构造方法私有化 为了避免在外部通过new创建对象
- 提供一个静态方法,用于返回本类的一个实例
- 在类的内部,声明一个本类的实例,如果实现为null,则创建,否则直接返回
实现方式:
-
饱汉式
类的实例只有在调用时才会创建
-
饿汉式
在类加载的时候直接创建
核心配置
属性配置
${属性名} 引用对应变量的值
注意:
- properties 的属性resource可以指定properties格式 的配置文件
- property子元素也可以定义属性
- 上面两种方式 属性定义会合并 ,如果存在冲突,properties配置文件中指定的配置优先级高
默认值(了解):
-
启用
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 启用默认值特性 -->
-
使用 ${属性名:默认值} :后面的是默认值 如下默认为admin
<property name="username" value="${username:admin}"/>
修改默认分隔符:
<property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="@"/> <!-- 修改默认值的分隔符 -->
settings
全局配置,输出sql的配置
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
别名(掌握)
<!--类型别名-->
<typeAliases>
<!--一个一个的指定 bean的别名 一般是设置为类的首字母小写
<typeAlias type="com.by.bean.User" alias="user"/>-->
<!--统一解决方案 指定包名 该包下的类 默认生成别名 别名为类的首字母小写 如下:说明com.by.bean包下所有的类生成别名-->
<package name="com.by.bean"/>
</typeAliases>
内置别名:
- java中基本数据类别的别名 前面加上下划线 如 byte 的别名是_byte
- java中基本类型的包装类 别名是类名首字母小写 如 Long 的别名是long
- Map的别名是map
- 其它支持的类型 别名 全部是小写…
类型处理器
设置数据库表时,设计一个逻辑删除字段 isdel 1 代表删除 0代表未删除
bit: 0 1
回想:jdbc中的语句对象有几种:
- Statement
- PreparedStatement 预编译
- CallableStatement 用于调用存储过程的
类型处理器注册:
-
xml配置
<typeHandler handler="com.by.handler.BitTypeHandler" javaType="java.lang.Boolean" jdbcType="BIT" />
-
注解
- 在类型处理器的类上增加一个
@MappedTypes
注解指定与其关联的 Java 类型列表。 如果在javaType
属性中也同时指定,则注解上的配置将被忽略。 - 在类型处理器的类上增加一个
@MappedJdbcTypes
注解指定与其关联的 JDBC 类型列表。 如果在jdbcType
属性中也同时指定,则注解上的配置将被忽略。
- 在类型处理器的类上增加一个
映射器mappers(掌握)
- 使用resource指定相对于类路径的资源引用
直接指定类路径即可,映射器接口与xml映射文件 可以不在同一目录,如
<mapper resource="mybatis/UserMapper.xml"/>
- 直接指定映射器接口
<!--直接指定接口 要求 mapper.xml文件与mapper接口在同一目录下--> <mapper class="com.by.mapper.UserMapper"></mapper>
- 直接指定包名
<!--直接指定包名 要求 mapper.xml文件与mapper接口在同一目录下--> <package name="com.by.mapper"/>
自定义MyBatis
MyBatis运行原理图
MyBatis的核心对象
运行原理步骤图解及流程解析
- Resources
加载配置文件,有一种是使用类加载进行加载,我们通过这个类的类加载器进行资源的加载。
-
List item
-
SqlSessionFactoryBuilder
构建SqlSessionFactory工厂对象需要的对象。采用了构建者模式,屏蔽了对象构建的细节。
- SqlSessionFactory
创建SqlSession对象所用。使用工厂模式创建,目的就是解耦合。
- SqlSession
创建代理对象,使用了代理模式。
- Executor
操作数据库
- MappedStatement
存储SQL语句、参数、输出结果类型