- 🧛♂️个人主页:杯咖啡
- 💡进步是今天的活动,明天的保证!
- ✨目前正在学习:SSM框架,算法刷题
- 👉本文收录专栏:SSM框架解析
- 🙌牛客网,刷算法过面试的神级网站,用牛客你也牛。 👉免费注册和我一起学习刷题👈
- 🐳希望大家多多支持🥰一起进步呀!
- 😎The man who fears losing has already lost.
怕输的人已经输了。 - 《权力的游戏》
✨前言
上一篇节我们复习了对象分析,注册别名,设置日志输出
本篇节我们将复习在框架中动态代理的实现和我一起复习下去你可以获得一个比较
完美框架demo
,并且深刻体会框架
。
坚持到最后的源码解析
你会收获更多哦,加油坚持!!!
文章目录
- ✨前言
- 动态代理存在的意义
- 动态代理的实现规范
- 动态代理实现的步骤
-
- 1)建表Users
- 2)新建maven工程,刷新可视化
- 3)修改目录
- 4)修改pom.xml文件,添加依赖
- 5)添加jdbc.propertis文件到resources目录下
- 6)添加SqlMapConfig.xml文件
- 7)添加实体类
- 8)添加mapper文件夹,新建UserMapper接口
- 9)在mapper文件夹下,新建UsersMapper.xml文件,完成增删改查功能
- 10)添加测试类,测试功能
- 结果演示
- ✨总结
动态代理存在的意义
在三层架构中,业务逻辑层要通过接口访问数据访问层的功能.我们只能访问什么功能就要手动创建什么功能的实现类。
那么动态代理就可以实现自动创建所需要的类对象.
动态代理的实现规范
在框架中实现动态代理需要遵循7个规范,框架才会自动接管。
1)UsersMapper.xml文件与UsersMapper.java的接口必须同一个目录下.
2)UsersMapper.xml文件与UsersMapper.java的接口的文件名必须一致,后缀不管.
3)UserMapper.xml文件中标签的id值与与UserMapper.java的接口中方法的名称完全一致.
4)UserMapper.xml文件中标签的parameterType属性值与与UserMapper.java的接口中方法的参数类型完全一致.
5)UserMapper.xml文件中标签的resultType值与与UserMapper.java的接口中方法的返回值类型完全一致.
6)UserMapper.xml文件中namespace属性必须是接口的完全限定名称com.bjpowernode.mapper.UsersMapper
7)在SqlMapConfig.xml文件中注册mapper文件时,使用class=接口的完全限定名称com.bjpowernode.mapper.UsersMapper.
动态代理实现的步骤
下面就利用一个例子实现动态代理的具体步骤:
1)建表Users
下面提供sql代码,可以直接导入哦,如果是跟着之前的过程直接导入就好,如果不是需要自己实例化数据库ssm哦
use ssm;
-- ----------------------------
-- Table structure for `users`
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) COMMENT '用户名称',
`birthday` date DEFAULT NULL COMMENT '生日',
`sex` char(2) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `users` VALUES (1, '王五', '2000-09-10', '2', '安徽');
INSERT INTO `users` VALUES (2, '张三', '2001-07-12', '1', '北京市');
INSERT INTO `users` VALUES (3, '张小明', '1999-02-22', '1', '河南');
INSERT INTO `users` VALUES (4, '陈小亮', '2002-11-19', '1', '辽宁');
INSERT INTO `users` VALUES (5, '张三丰', '2001-03-10', '1', '上海市');
INSERT INTO `users` VALUES (6, '陈小明', '2002-01-19', '1', '重庆市');
INSERT INTO `users` VALUES (7, '王五四', '2001-05-13', '2', '天津市');
select * from users;
2)新建maven工程,刷新可视化
刷新可视化,显示存在users就表示数据库创建成功
新建maven工程,这里就不在显示创建过程了,如果有需要请查找 mybatis框架详解04
3)修改目录
这里就不再显示修改目录过程了,如果有需要请查找 mybatis框架详解04
4)修改pom.xml文件,添加依赖
这里并没有添加新的依赖哦,具体解释请查找 mybatis框架详解04
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
5)添加jdbc.propertis文件到resources目录下
jdbc.driverclassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=********
![](https://img-blog.csdnimg.cn/b784036c807d49978b99ac1aee868abd.png)
6)添加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>
<!-- 读取属性文件(jdbc.properties)
属性:
resources:从resouces目录下找指定名称的文件加载
url:使用绝对路径加载属性文件
-->
<properties resource="jdbc.properties"></properties>
<!-- 设置日志输出-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--注册实体类-->
<typeAliases>
<package name="com.longlong.pojo"/>
</typeAliases>
<!-- 配置数据库的环境变量(数据库链接配置)
default:使用下面的environment标签下的id属性进行指定配置
-->
<!-- <settings>-->
<!-- <setting name="" value=""/>-->
<!-- </settings>-->
<environments default="development">
<!-- 开发时再公司使用的数据库配置
id;就是提供给environment的default属性使用
-->
<environment id="development">
<!-- 配置事务管理器
type:指定事务管理的方式
JDBC:事务的控制交给管理员来处理
MANAGED:由容器(Spring)来管理事务
-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源:
type:指定不同的配置方式
JNDI:java命名目录接口,在服务器端进行数据库连接池的管理
POOLED:使用数据库连接池
UNPOOLED:不使用数据库连接池
-->
<dataSource type="POOLED">
<!-- 配置数据库连接的基本参数
private String driver;
private String url;
private String username;
private String password;
-->
<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>
<!--在家时候数据库配置-->
<!-- <environment id="home">-->
<!-- <transactionManager type=""></transactionManager>-->
<!-- <dataSource type=""></dataSource>-->
<!-- </environment>-->
<!--<!–上线的数据库配置–>-->
<!-- <environment id="online">-->
<!-- <transactionManager type=""></transactionManager>-->
<!-- <dataSource type=""></dataSource>-->
<!-- </environment>-->
</environments>
<!-- 注册mappe.xml文件
resouces:从resouces目录下找指定名称的文件注册
url:使用绝对路径注册
class:动态代理方式下的注册
-->
<mappers>
<!-- <mapper class="com.longlong.mapper.UserMapper"></mapper>-->
<package name="com.longlong.mapper"/>
</mappers>
</configuration>
需要注意的是:在注册mapper的时候一定要选择类注册,或者包批量注册,否则无法检测到哦,包批量注册默认名称为首字母小写的驼峰命名法的类名
7)添加实体类
实体类,最好按照数据库的类名写哦,可以自动识别并且装配。当然不一样也是可以的,后续介绍哦
package com.longlong.pojo;
import java.util.Date;
/**
* @Author DELL longlong
* @Date 2022/7/3 15:59
* @Version 1.0
* @Function users实体类
*/
public class Users {
private Integer id;
private String userName;
private Date birthday;
private String sex;
private String address;
public Users(Integer id, String userName, Date birthday, String sex, String address) {
this.id = id;
this.userName = userName;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
public Users(String userName, Date birthday, String sex, String address) {
this.userName = userName;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
public Users() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
8)添加mapper文件夹,新建UserMapper接口
重点来了,Usermapper文件和UserMapper接口一定要放在同级目录下,大家看到名字和文件位置都非常的像,就是为了方便框架可以把他们两个更好的对应起来。
package com.longlong.mapper;
import com.longlong.pojo.Users;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author DELL longlong
* @Date 2022-08-05 16:26
* @Version 1.0
* @Function 数据访问层的接口,规定的数据库中可进行的各种操作
*/
public interface UserMapper {
//查询全部用户信息
List<Users> getAll();
}
9)在mapper文件夹下,新建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">
<mapper namespace="com.longlong.mapper.UserMapper">
<!-- //查询全部用户信息-->
<!-- List<Users> getAll();-->
<select id="getAll" resultType="users">
select <include refid="allColumns"></include>
from users
</select>
10)添加测试类,测试功能
package com.longlong.test;
import com.longlong.mapper.UserMapper;
import com.longlong.pojo.Users;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.UUID;
/**
* @Author DELL longlong
* @Date 2022/7/3 19:32
* @Version 1.0
* @Function 测试类
*/
public class Mytest {
SqlSession sqlSession;
//动态代理的对象
UserMapper userMapper;
//日期格式化刷子
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
@Before
public void openSqlSession() throws IOException {
//1.读取核心配置文件按
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.取出sqlsession
sqlSession = factory.openSession();
//取出动态代理的对象,完成接口中方法的调用,实则是调用xml文件中相应的标签功能
userMapper = sqlSession.getMapper(UserMapper.class);
}
@After
public void closeSqlSession(){
sqlSession.close();
}
@Test
public void testGetAll(){
System.out.println(userMapper);
List<Users> list = userMapper.getAll();
list.forEach(users -> System.out.println(users));
}
结果演示
✨总结
今天我们加入了动态代理,由于篇幅问题过的代码没有放入到文章里面,有需要请到仓库自取。小编会及时更新仓库。
本次源码放在代码仓库gitee,自取链接
原创不易,还希望各位大佬支持一下
\textcolor{blue}{原创不易,还希望各位大佬支持一下}
原创不易,还希望各位大佬支持一下
点赞,你的认可是我创作的动力!
\textcolor{green}{点赞,你的认可是我创作的动力!}
点赞,你的认可是我创作的动力!
收藏,你的青睐是我努力的方向!
\textcolor{green}{收藏,你的青睐是我努力的方向!}
收藏,你的青睐是我努力的方向!
评论,你的意见是我进步的财富!
\textcolor{green}{评论,你的意见是我进步的财富!}
评论,你的意见是我进步的财富!