当前位置:网站首页>自定义持久层框架

自定义持久层框架

2020-12-07 17:40:35 杨杨杨杨杨杨杨振

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
包名结构如图
image.png

2.pom.xml文件配置

1:IPersistence

<dependencies>
    <!-- 数据库 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.17</version>
    </dependency>
     <!-- 数据库连接池 -->
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
    </dependency>
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>jaxen</groupId>
        <artifactId>jaxen</artifactId>
        <version>1.1.6</version>
    </dependency>
</dependencies>

2:IPersistence_test
使用端只需要引入自定义框架

<!--引入自定义持久层框架的依赖-->
<dependencies>
    <dependency>
        <groupId>com.lagou</groupId>
        <artifactId>IPersistence</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

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<User> findAll();
    //条件查询
    public User findUserByCondition(User user);
    //新增
    public void addUser(User user);
    //更新
    public void updateUser(User user);
    //删除
    public void deleteUserById(User user);
}

image.png

测试类编写

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<User> 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目录

所有节点名称均为自定义名称,没有约束头文件

<configuration>
    <!--数据库配置信息-->
 <dataSource>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql:///zdy_mybatis"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </dataSource>
    <!--存放mapper.xml的全路径-->
 <mapper resource="userMapper.xml"></mapper>
</configuration>

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

版权声明
本文为[杨杨杨杨杨杨杨振]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000038402018