一、分析流程

二、 前期准备

1.创建 Maven 工程

工程信息如下:
Groupid:cn.oesoft
ArtifactId:mybatis02
Packing:jar

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>
注意:
此处我们直接使用的是 mybatis 的配置文件,但是由于我们没有使用 mybatis 的 jar 包,所以要把配
置文件的约束删掉否则会报错(如果电脑能接入互联网,不删也行)

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>
注意:
此处我们使用的也是 mybatis 的配置文件,所以也要把约束删除了

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 框架相关推荐

  1. MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  2. MyBatis-学习笔记03【03.自定义Mybatis框架】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  3. 基于自定义Mybatis框架实现数据库操作

    一.场景模拟 基于自定义Mybatis框架和已有的Mysql数据库Mybatis,查询所有用户信息. 二.创建工程并引入自定义Mybatis框架的坐标 <?xml version="1 ...

  4. 自定义Mybatis框架

    一.开发环境的准备及统一 1. Jdk环境:JDK 1.8 64bit 2. Maven环境:MAVEN 3.3.9 二.创建Maven工程并引入坐标 <?xml version="1 ...

  5. java day53【 Mybatis框架概述 、 Mybatis 框架快速入门、自定义 Mybatis 框架 】

    第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种 定义认为,框架是可被应用开发者定 ...

  6. 翻过这座山之自定义mybatis框架

    前言: 不知不觉以及工作快两年.但是工作年限增加了,技术却没提升多少.之前一直想着自学来着.但是下班回到家毫无疑问都是被手机或者其他事情所吸引

  7. Java软件开发:自定义MyBatis持久层框架

    自定义MyBatis持久层框架 1 框架概述 1.1 什么是框架 1.2 框架要解决的问题 1.3 软件开发的分层的重要性 2 MyBatis框架 3 JDBC编程 3.1 JDBC程序的回顾 3.2 ...

  8. Mybatis框架(待完善)

    框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法:另一种定义认为,框架是可被应用开发者定制的应用骨架.前者是从应用方面而后者是从目的方面给出的定义 ...

  9. [转载] 快速学习-Mybatis框架概述

    参考链接: Java在竞争性编程中的快速I/O 第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互 ...

最新文章

  1. Chrome扩展程序——TabCopy:一键复制网页标题和网址
  2. 拓普微智能TFT液晶显示模块
  3. 09.snapshot and restore操作
  4. 定义一个手表_华米Amazfit Pop评测:一款功能全面的“性价比”手表
  5. 解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)
  6. C语言为何到现在都是热门语言?原因很简单,程序员大牛都知道
  7. VMware 多款产品中存在严重漏洞
  8. Akka网络编程基本介绍
  9. YzmCMSV3.1 | 代码审计
  10. laravel 与 tp5 获取控制器 方法名
  11. KCP - A Fast and Reliable ARQ Protocol
  12. (转)别只盯着比特币!“野蛮生长”的ICO江湖:2年30倍只是寻常
  13. whoosh读取+html,django-haystack+jieba+whoosh实现全文检索
  14. 漏洞扫描技术:对Web应用程序进行漏洞扫描
  15. Python -- 扫描局域网活跃IP
  16. select默认选中及赋值问题
  17. 读后感系列2:《看见》柴静(一)
  18. 微服务下蓝绿发布、滚动发布、灰度发布等方案
  19. java rrd_rrd4j的基本介绍和使用
  20. Win10下次使用debug进入DOS进行汇编开发

热门文章

  1. Linux安装使用redis
  2. mgr未同步 mysql_MySQL MGR如何修复数据不一致的节点
  3. 【clickhouse】创建物化视图数据来源是两张表该怎么写创建语句呢?
  4. 95-910-146-源码-FlinkSQL-Flink SQL中TableFunction使用分析
  5. 【ES】CURL 操作 ES命令集合
  6. 95-280-035-源码-资源管理-计算资源管理-TaskSlot
  7. 95-290-362-源码-内存管理-Buffer-LocalBufferPool
  8. 设计模式:高性能IO之Reactor模式
  9. Object类解析(简)
  10. 如何解读Nginx源码