自定义持久层框架

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
包名结构如图
自定义持久层框架_第1张图片

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);
}

自定义持久层框架_第2张图片

测试类编写

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);

你可能感兴趣的:(java)