动态代理
代理模式的组成
作用:对真实角色功能的增强,真实角色和代理角色都是抽象角色的子类
- 抽象角色:定义了要实现的功能,通常使用接口。这个案例中就是UserMapper接口
- 真实角色:可以不存在的,这里没有
- 代理角色:也实现了接口中方法,使用动态代理来实现UserMapper接口,并且重写其中方法: findAllUsers()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ncqtCgcE-1592644423324)(F:/%E5%B0%B1%E4%B8%9A%E5%8A%9E%E4%BD%9C%E4%B8%9AjavaWeb/3_7%E5%85%A8%E5%9B%BD%E6%8E%88%E8%AF%BE/day25(MyBatis%E7%AC%AC2%E5%A4%A9)]/day25(MyBatis%E7%AC%AC2%E5%A4%A9)/%E8%AE%B2%E4%B9%89/assets/1554285221866.png)
动态代理的好处
- 接口的代理对象由程序在执行的过程中动态生成,不用我们自己去写一个类实现接口中所有的方法
- 可以动态生成任意接口的对象
Proxy类中的方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CftWzFgE-1592644423327)(F:/%E5%B0%B1%E4%B8%9A%E5%8A%9E%E4%BD%9C%E4%B8%9AjavaWeb/3_7%E5%85%A8%E5%9B%BD%E6%8E%88%E8%AF%BE/day25(MyBatis%E7%AC%AC2%E5%A4%A9)]/day25(MyBatis%E7%AC%AC2%E5%A4%A9)/%E8%AE%B2%E4%B9%89/assets/1557839380147-1589417530199.png)
InvocationHandler接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HCmpLefq-1592644423330)(F:/%E5%B0%B1%E4%B8%9A%E5%8A%9E%E4%BD%9C%E4%B8%9AjavaWeb/3_7%E5%85%A8%E5%9B%BD%E6%8E%88%E8%AF%BE/day25(MyBatis%E7%AC%AC2%E5%A4%A9)]/day25(MyBatis%E7%AC%AC2%E5%A4%A9)/%E8%AE%B2%E4%B9%89/assets/1557839397638.png)
核心配置文件:properties
作用:加载外部的属性文件,扩展名为.properties放在src目录下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/day25
jdbc.username=root
jdbc.password=root
核心配置文件:typeAliases
typeAliases作用
作用:给数据类型定义别名
在实体类映射文件中,编写SQL语句属性
resultType="com.itheima.entity.User" 能不能简化它的写法呢?可以的
可以在核心配置文件中使用typeAliaes来给实体类定义别名
在mybatis中已经定义很多别名,我们可以直接使用
内置别名
别名是小写的,以下类型可以直接使用
parameterType="java.lang.Integer" 换成 parameterType="int"
别名 | 真实类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
说明:
- 内置别名可以直接使用
- 别名不区分大小写
核心配置文件:mappers
方式一:加载单个映射文件mapper
方式二:包扫描加载映射文件package
<!-- 加载其它映射文件 -->
<mappers>
<!--
子元素:mapper
属性:
resource:加载类路径下指定的配置文件,注:分隔符是/,而不是点号
url: 读取指定路径下配置文件,或者网络的配置文件
<mapper url="file:///d:/UserMapper.xml"/>
class: 指定接口的完全限定名,用于注解的配置,不需要XML文件。
<mapper class="com.itheima.dao.UserMapper"/>
子元素:package
1. 指定扫描哪个包下所有的DAO接口,如果使用这种写法,接口名与配置文件名字要相同。
如:接口名UserMapper.java 配置文件名:UserMapper.xml
2. 接口与配置文件必须放在同一个包下
-->
<package name="com.itheima.dao"/>
小结
配置标签名称 | 功能 | 属性或子元素 |
---|---|---|
properties | 加载外部的配置文件 | 属性 resource:加载类路径下配置文件 属性 url:加载网络上或其它地址配置文件 子元素:property:在文档内部定义键和值, 同名的键会被外面的文件覆盖 |
typeAliases | 给实体类定义别名 | 子元素 typeAliase: 每一行定义一个类别名 子元素 package: 对整个包和子包定义别名,别名就是类名 |
定义键和值, 同名的键会被外面的文件覆盖 | ||
typeAliases | 给实体类定义别名 | 子元素 typeAliase: 每一行定义一个类别名 子元素 package: 对整个包和子包定义别名,别名就是类名 |
mappers | 加载实体类映射文件路径 | 子元素 mapper: 每一行加载一个外面的映射文件 子元素 package: 对整个包扫描,加载所有的映射文件 |