1.前言
通过模仿MyBatis源码手写自定义持久层框架,命名规则,设计规范均参考MyBatis.
2.自定义框架设计思路
使用端:
提供配置文件
1.SqlMapConfig.xml
核心配置文件,存放数据源,引入mapper
2.Mapper.xml
自定义sql
3.创建实体类User
4.创建dao层接口
5.创建测试类进行测试
框架端:
1.读取配置文件(以流的形式保存在内存中)
1.创建Resources类:
静态方法:static InputStream getResourceAsStream(String path)
根据配置文件的路径,将配置文件加载成字节输入流,存储在内存中
2.创建Configuration类:
对应SqlMapConfig.xml
3.创建MappedStatement类:
对应Mapper.xml
2.解析配置文件(从内存中读取保存在javabean中)
1.创建XMLConfigBuilder类:(封装Configuration)
方法:Configutation parseConfig(InputStream inputStream)
2.创建XMLMapperBuilder类:(封装MappedStatement,需要传入封装Configuration)
方法:void parse(InputStream inputStream)
3.创建 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
3.IPersistence_test pojo包下新增实体User
public class User {
private Integer id;
private String username;
private String password;
private String birthday;
//省略getter setter 以及toString 方法
}
4.IPersistence_test dao包下新增接口IUserDao
public interface IUserDao {
//查询所有
public ListfindAll();
//条件查询
public User findUserByCondition(User user);
//新增
public void addUser(User user);
//更新
public void updateUser(User user);
//删除
public void deleteUserById(User user);
}
3.2配置文件准备
定义在IPersistence_test下的resources目录
所有节点名称均为自定义名称,没有约束头文件
1.核心配置文件:sqlMapConfig.xml
2.SQL语句文件:UserMapper.xml
namespace:该Mapper的唯一标识
id:sql的唯一标识
namespace+id:表示statementId(后面会用到)
resultType:返回值的全限定类名
paramterType:参数的全限定类名
#{}:表示占位符号
select * from user
select * from user where id = #{id} and username = #{username}
3.3读取配置文件
1.创建Javabean
MappedStatement
对应mapper.xml中的一个select标签
public class MappedStatement {
//id标识
private String id;
//返回值类型
private String resultType;
//参数值类型
private String paramt