1.前言
通过模仿MyBatis源码手写自定义持久层框架,命名规则,设计规范均参考MyBatis.
2.自定义框架设计思路
使用端:
提供配置文件
- 1.SqlMapConfig.xml
核心配置文件,存放数据源,引入mapper - 2.Mapper.xml
自定义sql
框架端:
1.读取配置文件,使用javabean存储
(1)Configuration 对应SqlMapConfig.xml
(2)MappedStatement 对应Mapper.xml
2.解析配置文件
1.创建XMLConfigBuilder类:
方法:Configutation parseConfig(InputStream inputStream)
1.创建 SqlSessionFactoryBuilder类:(Builder构建者设计模式)
方法:SqlSessionFactory bulid()
2.创建 SqlSessionFactory接口:(工厂模式)
方法:SqlSession openSession();
3.创建SqlSession接口(封装具体CRUD方法)
方法:selectList(String statementid,Object... params);
selectOne(String statementid,Object... params);
3.自定义框架设计实现
3.1前提准备
1.创建两个Module
1)IPersistence
2)IPersistence_test
包名结构如图
2.pom.xml文件配置
1:IPersistence
mysql
mysql-connector-java
5.1.17
c3p0
c3p0
0.9.1.2
log4j
log4j
1.2.12
junit
junit
4.10
dom4j
dom4j
1.6.1
jaxen
jaxen
1.1.6
2:IPersistence_test
使用端只需要引入自定义框架
com.lagou
IPersistence
1.0-SNAPSHOT
IPersistence_test pojo包下新增实体User
public class User {
private Integer id;
private String username;
private String password;
private String birthday;
//省略getter setter 以及toString 方法
}
IPersistence_test dao包下新增接口IUserDao
public interface IUserDao {
//查询所有
public List findAll();
//条件查询
public User findUserByCondition(User user);
//新增
public void addUser(User user);
//更新
public void updateUser(User user);
//删除
public void deleteUserById(User user);
}
测试类编写
PS:我喜欢从使用入手,思路会比较清楚,报红先忍着
在IPersistence_test test包下新建IPersistenceTest.java
我们希望自定义框架能够拥有种MyBatis的类似的功能
1.定义接口IUserDao 不用写Dao的实现(代理模式)
public class IPersistenceTest{
//读取到的字节流对象
private InputStream resourceAsStream;
private SqlSessionFactory sqlSesstionFactory;
private SqlSession sqlSession;
private IUserDao userDao;
@Before
public void before() throws Exception {
resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//构建者设计模式获取sqlSesstionFactory
sqlSesstionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
sqlSession = sqlSesstionFactory.openSession();
userDao = sqlSession.getMapper(IUserDao.class);
}
@Test
public void test1() throws Exception {
User user = new User();
user.setId(1);
user.setUsername("lucy");
//普通模式
List userList = sqlSession.selectList("com.lagou.dao.IUserDao.findUserByCondition",user);
for (User user1 : userList) {
System.out.println(user1);
}
}
@Test
public void test2() throws Exception {
User user = new User();
user.setId(1);
user.setUsername("lucy");
//代理模式
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
User userByCondition = userDao.findUserByCondition(user);
System.out.println(userByCondition);
}
}
@Before 注解可以定义在所有Test文件之前,在测试之前执行
通过Resources.getResourceAsStream("sqlMapConfig.xml")方法,将读取到的字节流对象保存在成员变量上。
涉及到的设计模式:
Builder构建者设计模式、工厂模式、代理模式
测试类代码解析
resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
1.核心配置文件:sqlMapConfig.xml
定义在IPersistence_test下的resources目录
所有节点名称均为自定义名称,没有约束头文件
2.Resources类编写
IPersistence:
package com.lagou.io;
public class Resources {
//根据配置文件的路径,将配置文件加载成字节输入流,存储在内存中
public static InputStream getResourceAsStream(String path){
InputStream resourceAsStream = Resources.class.getClassLoader().getResourceAsStream(path);
return resourceAsStream;
}
}
sqlSesstionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);