动态代理
文章目录
前言
什么是三层架构
在项目开发中,遵循的一种形式模式.分为三层.
1)界面层:用来接收客 户端的输入,调用业务逻辑层进行功能处理,返回结果给客户端.过去的servlet就是界面层的功能.
2)业务逻辑层:用来进行整个项目的业务逻辑处理,向上为界面层提供处理结果,向下问数据访问层要数据.
3)数据访问层:专门用来进行数据库的增删改查操作,向上为业务逻辑层提供数据.
提示:以下是本篇文章正文内容,下面案例可供参考
一、Mybatis是什么?
1.1 Mybatis概念
MyBatis 本是 apache 的一个开源项目iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis 。2013 年 11 月迁移到 Github,最新版本是 MyBatis 3.5.7 ,其发布时间是 2021 年 4月 7日。
MyBatis完成数据访问层的优化.它专注于sql语句.简化了过去JDBC繁琐的访问机制.
1.2 Mybatis结构
该图来自动力节点
mybatis配置
1.SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
构造会话
2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
底层隐藏的实现
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
1.3 MyBatis对象分析
- Resources 类,顾名思义就是资源,用于读取资源文件。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。
- SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的 build() 方 法 。 由 于SqlSessionFactoryBuilder对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。所以,一般会将该 对象创建为一个方法内的局部对象,方法结束,对象销毁。
- SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用只需要一个该对象即可。创建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession() 方法。
A. openSession(true):创建一个有自动提交功能的 SqlSession
B. openSession(false):创建一个非自动提交功能的 SqlSession(手动提交)
C.openSession():同 openSession(false) - SqlSession 接口对象用于执行持久化操作。一个 SqlSession 对应着一次数据库会话,一次会话以SqlSession 对象的创建开始,以 SqlSession 对象的关闭结束。
SqlSession 接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()方法,将其关闭。再次需要会话,再次创建。 SqlSession 在方法内部创建,使用完毕后关闭。
二、动态代理
2.1 开发步骤
- 建表Users
- 新建maven工程,刷新可视化
- 修改目录
- 修改pom.xml文件,添加依赖
- 添加jdbc.propertis文件到resources目录下
- 添加SqlMapConfig.xml文件
- 添加实体类
- 添加mapper文件夹,新建UsersMapper接口
- 在mapper文件夹下,新建UsersMapper.xml文件,完成增删改查功能
- 添加测试类,测试功能
2.2 动态代理的实现规范
- UsersMapper.xml文件与UsersMapper.java的接口必须同一个目录下.(同一目录)
- UsersMapper.xml文件与UsersMapper.java的接口的文件名必须一致,后缀不管.(文件命名一致)
- UserMapper.xml文件中标签的id值与与UserMapper.java的接口中方法的名称完全一致.(id与接口方法一致)
- UserMapper.xml文件中标签的parameterType属性值与与UserMapper.java的接口中方法的参数类型完全一致.(parameterType表接口方法参数类型)
- UserMapper.xml文件中标签的resultType值与与UserMapper.java的接口中方法的返回值类型完全一致.(resultType表接口方法返回类型 增删改五返回值)
- UserMapper.xml文件中namespace属性必须是接口的完全限定名称com.bjpowernode.mapper.UsersMapper (实体类起别名可直接小写类名代替)
- 在SqlMapConfig.xml文件中注册mapper文件时,使用class=接口的完全限定名称com.bjpowernode.mapper.UsersMapper.
(1)目录结构
数据访问层接口 UsersMapper
/**
* 数据访问层接口
*/
public interface UsersMapper {
//查询所有用户信息
List<Users> getAll();
//更新操作
int update(Users users);
//给出列名列值 进行查找
List<Users> selectmore(
@Param("cn")
String Cname,
@Param("cv")
String Cvalue);
}
UsersMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
// 规范6 UserMapper.xml文件中namespace属性必须是接口的完全限定名称
<mapper namespace="com.bjpowernode.mapper.UsersMapper">
// 规范3 和 5 (id与接口方法一致) (resultType表接口方法返回类型 增删改五返回值)
<select id="getAll" resultType="users" >
select * from users;
</select>
<update id="update" parameterType="users">
// 返回主键标签
//Order:指定生成返回主键的时机,AFTER:先插入再返回主键
// BEFORE: 先生成再完成插入
// keyProperty: 生成的主键放入到对象的哪个属性中
<selectKey order="AFTER" keyProperty="id" resultType="int">
select LAST_INSERT_ID()
</selectKey>
update users
set username=#{userName},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id};
</update>
<!-- List<Users> selsectmore(String Cname,String Cvalue);-->
<select id="selectmore" resultType="users">
select *
from users
where ${cn} like concat('%',#{cv},'%')//模糊查询 concat函数
</select>
</mapper>
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--读取属性文件中数据库的配置-->
<properties resource="jdbc.properties"></properties>
<!--设置日志输出语句,显示相应操作的sql语名-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--MyBatis框架会自动为每个实体类起别名为类型的全小写或类名的大小写混合.推荐使用类名的全小写-->
<typeAliases>
<package name="com.bjpowernode.pojo"></package>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--在SqlMapConfig.xml文件中注册XXXMapper.xml-->
<mappers>
<package name="com.bjpowernode.mapper"></package>
</mappers>
</configuration>
2.3 #{}和${}
#{}是对非字符串拼接的参数的占位符
如果入参是简单数据类型,#{}里可以任意写,
但是如果入参是对象类型,则#{}里必须是对象的成员变量的名称,#{}可以有效防止sql注入。
$ {}主要是针对字符串拼接替换.
如果入参是基本数据类型,$ {}里必须是value,
但是如果入参是对象类型,则${}里必须是对象的成员变量的名称。
${}还可以替换列名和表名