出现的原因
先来看一段jdbc连接mysql数据库进行查询的java代码
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
Class.forName("com.mysql.jdbc.Driver");
DriverManager.getConnection("jdbc:mysql//192.168.2.240:3306/mybatis?characterEncoding=utf-8",
"root","root");
String sql = "SELECT * FROM user WHERE user_name = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"tom");
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
int id = resultSet.getInt("id");
String useName = resultSet.getString("user_name");
}
}catch (Exception e){
e.printStackTrace();
}
jdbc的问题
- 数据库配置信息存在硬编码
- 解决:使用配置文件
- 频繁的创建和释放数据库连接资源
- 解决:使用连接池
- sql语句硬编码
- 解决:使用配置文件存放sql
- 手动封装结果集,较为繁琐
- 解决:利用反射等机制自动封装结果
自定义思路
使用端:
项目使用自定义框架的jar包,提供数据库配置信息以及sql配置信息(语句,参数,返回值)
sqlMapConfig.xml 数据库配置信息,同时存放mapper.xml的全路径
mapper.xml sql配置信息
自定义持久层框架对jdbc的封装
- 加载配置文件:根据配置文件的路径加载为输入流存储在内存中
- 创建Resource类 方法 InputStream getResourceAsStream(String path)
- 创建两个java bean,存放的就是对配置文件解析出来的内容
- Configuration:核心配置类,存放SqlMapConfi.xml解析出来的
- MapperStatement:映射配置类,存放mapper.xml解析出来的
- 解析配置文件
- 使用dom4j
- 创建类:SqlSessionFactoryBuilder方法:build(InputStream in)
- 使用dom4j解析配置文件,将解析出来的内容封装起来
- 创建类SqlSessionFactory,生产sqlSession会话对象(工厂模式)
- 创建SqlSessionFactory接口以及DefaultSqlSessionFactory实现类
- openSession():用来生产sqlSession
- 创建SqlSession接口以及实现类DefaultSqlSession
- 定义对数据库的curd操作
- 创建Executor接口以及实现类SimplExecutor
- query(Configuration,MapperStatement,Object... params),执行jdbc代码
Q.E.D.