小蚂蚁 发表于 2021-12-17 22:35:48

Mybatis动态代理的原理详解,java企业级应用架构

<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/user" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 注册表映射文件 -->
<mappers>
<mapper resource="mybatis/User.xml"/>
</mappers>
</configuration>
3.接口定义
定义实体:
package com.xiongxin.mybatis.entity;
public class User {
private String username;
private String password;
...getter&&setter
}
接口定义
package com.xiongxin.mybatis.mapper;
import com.xiongxin.mybatis.entity.User;
import java.util.List;
public interface UserMapper {
List<User> queryUser();
}
定义映射文件
<?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.xiongxin.mybatis.mapper.UserMapper">
<select id="queryUser" resultType="com.xiongxin.mybatis.entity.User">
select from tbl_user
</select>
</mapper>
4.加载执行
package com.xiongxin.mybatis;
import com.alibaba.fastjson.JSON;
import com.xiongxin.mybatis.entity.User;
import com.xiongxin.mybatis.mapper.UserMapper;
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 java.io.IOException;
import java.io.Reader;
import java.util.List;
pub
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
lic class TestMain {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
//加载 mybatis 的配置文件(它也加载关联的映射文件)
Reader reader = Resources.getResourceAsReader(resource);
//构建 sqlSession 的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能执行映射文件中 sql 的 sqlSession
SqlSession session = sessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.queryUser();
System.out.println(JSON.toJSONString(users));
}
}
..consule print..
[{"password":"password","username":"xiongxin"}]
到这里,这个Mybatis的使用环节结束。
整个实现过程中,我们并未编写Mapper的实现类,框架是如何在无实现类的场景下实现接口方法返回的呢?
这里就不得不说到接口的动态代理方法了。
3.原理解析
======

SqlSession接口的实现中,获取Mapper的代理实现类

使用了JDK动态代理的功能

代理类执行方法调用

方法调用中执行MethodInvoker

最终执行execue方法。
获取返回结果Result?
4.手撕框架
======
前置知识:
|
序号
|
前置知识
|
是否必须
|
用途
|
| --- | --- | --- | --- |
|
1
|
动态代理
|
必须
|
代理模式,静态代理,基于JDK的动态代理,Mapper接口代理
|
|
2
|
泛型与反射
|
必须
|
动态获取类型,实体对象赋值
|
|
3
|
JDBC连接数据库
|
必须
|
连接数据库,执行SQL,返回结果集
|
|
4
|
自定义注解
|
非必须
|
基于注解实现SQL语句与接口方法映射
|
|
5
|
函数式
|
非必须
|
功能抽象
|
|
6
|
H2数据库
|
非必须
|
提供数据源
|
|
7
|
fastjson
|
非必须
|
json序列化
|
源码:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.74</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
</dependencies>
package com.dbutil.session;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.reflect.;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**

[*]@author xiongxin
*/
public class SqlSession {
public static Connection getConnH2() throws Exception {
String url = "jdbc:h2:mem:db_h2;MODE=MYSQL;INIT=RUNSCRIPT FROM './src/main/resources/schema.sql'";
String user = "root";
String password = "123456";
//1.加载驱动程序
Class.forName("org.h2.Driver");
//2.获得数据库链接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
/**

[*]自定义注解

总结
互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理
下面有部分截图希望能对大家有所帮助。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

            </div>
      
      <div id="asideoffset"></div>

https://blog.51cto.com/u_15450948/4812462
页: [1]
查看完整版本: Mybatis动态代理的原理详解,java企业级应用架构