2-自定义 Mybatis 框架
一、分析流程
二、 前期准备
1.创建 Maven 工程
2.引入相关坐标
<dependencies><!-- 日志坐标 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><!-- 解析 xml 的 dom4j --><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><!-- mysql 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!-- dom4j 的依赖包 jaxen --><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.1.6</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>RELEASE</version><scope>compile</scope></dependency></dependencies>
3.引入工具类到项目中
4.编写 SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" ></property> <property name="url" value="jdbc:mysql:///eesy" ></property> <property name="username" value="root"></property><property name="password" value="1234"></property></dataSource> </environment> </environments>
</configuration>
5.编写读取配置文件的类
public class Resources {/*** 根据传入的参数,获取一个字节输入流* @param filePath* @return*/public static InputStream getResourceAsStream(String filePath){return Resources.class.getClassLoader().getResourceAsStream(filePath);}
}
6.编写 Mapper 类
/*** 用于封装执行的SQL语句和结果类型的全限定类名*/
public class Mapper {private String queryString;//SQLprivate String resultType;//实体类的全限定类名public String getQueryString() {return queryString;}public void setQueryString(String queryString) {this.queryString = queryString;}public String getResultType() {return resultType;}public void setResultType(String resultType) {this.resultType = resultType;}
}
7.编写 Configuration 配置类
/*** 自定义mybatis的配置类*/
public class Configuration {private String driver;private String url;private String username;private String password;private Map<String,Mapper> mappers = new HashMap<String,Mapper>();public Map<String, Mapper> getMappers() {return mappers;}public void setMappers(Map<String, Mapper> mappers) {this.mappers.putAll(mappers);//此处需要使用追加的方式}public String getDriver() {return driver;}public void setDriver(String driver) {this.driver = driver;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
8.编写 User 实体类
@Data
public class User {private Integer id;private String username;private Date birthday;private String sex;private String address;}
三、基于 XML 的自定义 mybatis 框架
1.编写持久层接口和 IUserDao.xml
/*** 用户的持久层接口*/
public interface IUserDao {/*** 查询所有操作* @return*///@Select("select * from user")List<User> findAll();
}
<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="cn.oesoft.mybatis02.dao.IUserDao"><!--配置查询所有--><select id="findAll" resultType="cn.oesoft.mybatis02.domain.User">select * from user</select>
</mapper>
2.编写构建者类
/*** 用于创建一个SqlSessionFactory对象*/
public class SqlSessionFactoryBuilder {/*** 根据参数的字节输入流来构建一个SqlSessionFactory工厂* @param config* @return*/public SqlSessionFactory build(InputStream config){Configuration cfg = XMLConfigBuilder.loadConfiguration(config);return new DefaultSqlSessionFactory(cfg);}
}
3.编写 SqlSessionFactory 接口和实现类
public interface SqlSessionFactory {/*** 用于打开一个新的SqlSession对象* @return*/SqlSession openSession();
}
public class DefaultSqlSessionFactory implements SqlSessionFactory {private Configuration cfg;public DefaultSqlSessionFactory(Configuration cfg){this.cfg = cfg;}/*** 用于创建一个新的操作数据库对象* @return*/@Overridepublic SqlSession openSession() {return new DefaultSqlSession(cfg);}
}
4.编写 SqlSession 接口和实现类
/*** 自定义Mybatis中和数据库交互的核心类* 它里面可以创建dao接口的代理对象*/
public interface SqlSession {/*** 根据参数创建一个代理对象* @param daoInterfaceClass dao的接口字节码* @param <T>* @return*/<T> T getMapper(Class<T> daoInterfaceClass);/*** 释放资源*/void close();
}
/*** SqlSession接口的实现类*/
public class DefaultSqlSession implements SqlSession {private Configuration cfg;private Connection connection;public DefaultSqlSession(Configuration cfg){this.cfg = cfg;connection = DataSourceUtil.getConnection(cfg);}/*** 用于创建代理对象* @param daoInterfaceClass dao的接口字节码* @param <T>* @return*/@Overridepublic <T> T getMapper(Class<T> daoInterfaceClass) {return (T) Proxy.newProxyInstance(daoInterfaceClass.getClassLoader(),new Class[]{daoInterfaceClass},new MapperProxy(cfg.getMappers(),connection));}/*** 用于释放资源*/@Overridepublic void close() {if(connection != null) {try {connection.close();} catch (Exception e) {e.printStackTrace();}}}
}
5.编写用于创建 Dao 接口代理对象的类
public class MapperProxy implements InvocationHandler {//map的key是全限定类名+方法名private Map<String, Mapper> mappers;private Connection conn;public MapperProxy(Map<String,Mapper> mappers,Connection conn){this.mappers = mappers;this.conn = conn;}/*** 用于对方法进行增强的,我们的增强其实就是调用selectList方法* @param proxy* @param method* @param args* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//1.获取方法名String methodName = method.getName();//2.获取方法所在类的名称String className = method.getDeclaringClass().getName();//3.组合keyString key = className+"."+methodName;//4.获取mappers中的Mapper对象Mapper mapper = mappers.get(key);//5.判断是否有mapperif(mapper == null){throw new IllegalArgumentException("传入的参数有误");}//6.调用工具类执行查询所有return new Executor().selectList(mapper,conn);}
}
6.运行测试类
public class UserDaoTest {@Testpublic void findAllTest() throws Exception{//1.读取配置文件InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");// 2.创建SqlSessionFactory的构建者对象SqlSessionFactoryBuilder builder= new SqlSessionFactoryBuilder();//3.使用构建者创建工厂对象SqlSessionFactorySqlSessionFactory factory= builder.build(in);// 4.使用SqlSessionFactory生产SqlSession对象SqlSession session= factory.openSession();// 5.使用SqlSession创建dao接口的代理对象IUserDao userDao= session.getMapper(IUserDao.class);//6.使用代理对象执行查询所有方法List<User> users= userDao.findAll();for(User user: users) {System.out.println(user);}//7.释放资源session.close();in.close();}
}
四、基于注解方式定义 Mybatis 框架
1.自定义@Select 注解
/*** 查询的注解*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Select {/*** 配置SQL语句的* @return*/String value();
}
2.修改持久层接口
public interface IUserDao {/*** 查询所有操作* @return*/@Select("select * from user")List<User> findAll();
}
3.修改 SqlMapConfig.xml
删除原来的mappers标签,添加下面的<!-- 告知 mybatis 映射配置的位置 -->
<mappers>
<mapper class="cn.oesoft.mybatis02.dao.IUserDao"/>
</mappers>
五、自定义流程再分析
2-自定义 Mybatis 框架相关推荐
- MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】
Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...
- MyBatis-学习笔记03【03.自定义Mybatis框架】
Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...
- 基于自定义Mybatis框架实现数据库操作
一.场景模拟 基于自定义Mybatis框架和已有的Mysql数据库Mybatis,查询所有用户信息. 二.创建工程并引入自定义Mybatis框架的坐标 <?xml version="1 ...
- 自定义Mybatis框架
一.开发环境的准备及统一 1. Jdk环境:JDK 1.8 64bit 2. Maven环境:MAVEN 3.3.9 二.创建Maven工程并引入坐标 <?xml version="1 ...
- java day53【 Mybatis框架概述 、 Mybatis 框架快速入门、自定义 Mybatis 框架 】
第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种 定义认为,框架是可被应用开发者定 ...
- 翻过这座山之自定义mybatis框架
前言: 不知不觉以及工作快两年.但是工作年限增加了,技术却没提升多少.之前一直想着自学来着.但是下班回到家毫无疑问都是被手机或者其他事情所吸引
- Java软件开发:自定义MyBatis持久层框架
自定义MyBatis持久层框架 1 框架概述 1.1 什么是框架 1.2 框架要解决的问题 1.3 软件开发的分层的重要性 2 MyBatis框架 3 JDBC编程 3.1 JDBC程序的回顾 3.2 ...
- Mybatis框架(待完善)
框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法:另一种定义认为,框架是可被应用开发者定制的应用骨架.前者是从应用方面而后者是从目的方面给出的定义 ...
- [转载] 快速学习-Mybatis框架概述
参考链接: Java在竞争性编程中的快速I/O 第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互 ...
最新文章
- Chrome扩展程序——TabCopy:一键复制网页标题和网址
- 拓普微智能TFT液晶显示模块
- 09.snapshot and restore操作
- 定义一个手表_华米Amazfit Pop评测:一款功能全面的“性价比”手表
- 解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)
- C语言为何到现在都是热门语言?原因很简单,程序员大牛都知道
- VMware 多款产品中存在严重漏洞
- Akka网络编程基本介绍
- YzmCMSV3.1 | 代码审计
- laravel 与 tp5 获取控制器 方法名
- KCP - A Fast and Reliable ARQ Protocol
- (转)别只盯着比特币!“野蛮生长”的ICO江湖:2年30倍只是寻常
- whoosh读取+html,django-haystack+jieba+whoosh实现全文检索
- 漏洞扫描技术:对Web应用程序进行漏洞扫描
- Python -- 扫描局域网活跃IP
- select默认选中及赋值问题
- 读后感系列2:《看见》柴静(一)
- 微服务下蓝绿发布、滚动发布、灰度发布等方案
- java rrd_rrd4j的基本介绍和使用
- Win10下次使用debug进入DOS进行汇编开发