jdbc操作问题
传统的jdbc代码
public class MyJDBC {
//定义数据库连接四要素:驱动名,url,用户名和密码
private static String Driver="com.mysql.jdbc.Driver";
private static String Url="jdbc:mysql://localhost:3306/test";
private static String UserName="root";
private static String PassWord="1234567";
Connection connection = null;
PreparedStatement statement = null;
ResultSet result = null;
User user = new User();
public static void main(String[] args) {
try {
//1.加载jdbc驱动
Class.forName(Driver);
//2.获取数据库连接
connection = DriverManager.getConnection(Url,UserName, PassWord );
//3.获取预处理对象
String sql = "select * from JDBCTest where id = ?";
statement = connection.prepareStatement(sql);
statement.setString(1,"1");
//4.执行sql语句
result=statement.executeQuery();
//5.获取结果集取数据
System.out.println("id"+" "+"name");
while (result.next()){
int id=result.getInt("id");
String name=result.getString("name");
user.setId = id;
user.setName = name;
}
System.out.println(user);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//6.关闭连接
result.close();
statement.close();
connection.close();
}
}
}
问题分析
- 代码 数据库连接
//1.加载jdbc驱动
Class.forName(Driver);
//2.获取数据库连接
connection = DriverManager.getConnection(Url,UserName, PassWord );
- 数据库配置信息存在硬编码 解决办法:配置文件
- 频繁创建释放数据连接 解决方法:连接池
- 代码 sql语句
//3.获取预处理对象
String sql = "select * from JDBCTest where id = ?";
statement = connection.prepareStatement(sql);
statement.setString(1,"1");
//4.执行sql语句
result=statement.executeQuery();
//5.获取结果集取数据
System.out.println("id"+" "+"name");
while (result.next()){
int id=result.getInt("id");
String name=result.getString("name");
user.setId = id;
user.setName = name;
}
- sql语句、设置参数、获取结果集参数均存在硬编码问题 解决方法:配置文件
- 代码 映射对象
while (result.next()){
int id=result.getInt("id");
String name=result.getString("name");
user.setId = id;
user.setName = name;
}
System.out.println(user);
- 手动封装返回结果集,较为繁琐 解决方法:反射、内省技术
自定义持久层框架
设计思路
- 使用端(项目)
- 引入自定义持久层框架jar包
- 提供部分配置信息,使用配置文件
- sqlMapConfig.xml
- 数据库配置信息
- 存放mapper.xml的全路径
- mapper.xml:sql配置信息、参数类型、返回值类型
- 自定义持久层框架(工程)
- 本质:对JDBC的封装,规避JDBC操作问题
- 设计思路
- 加载配置文件
根据配置文件的路径,加载配置文件成
字节输入流,存储在内存 创建Resource类 方法:getResourceAsSteam(String path) - 创建两个javaBean容器对象 存放的就是对配置文件解析出来的内容
- Configuration 核心配置类 存放的就是对sqlMapConfig.xm解析出来的内容
- MapperStatement 映射配置类 存放对Mapper.xml解析出来的内容
- 解析配置文件:dom4j
- 创建类:SqlSessionFactoryBuilder
- 方法:build(InputStream in)
- 流程
- 使用dom4j解析配置文件,将解析出来的内容封装到容器对象中
- 创建SqlSessionFactory对象:
生产sqlSession:
会话对象 使用了工程模式
- 创建SqlSessionFactory接口及实现DefaultSqlSessionFactory openSession():生产sqlSession
- 创建SqlSession接口及实现类DefaultSession 定义对数据库的crud操作
- selectList()
- selectOne()
- update()
- delete()
- 创建Executor接口及实现类SimpleExecutor实现类
query(Configuration,MapperStatement,Object… params):
执行的就是JDBC代码
- 加载配置文件
根据配置文件的路径,加载配置文件成
- 问题分析
- Dao层使用自定义持久层框架,存在代码重复,整个操作过程模板重复
- 加载配置文件
- 创建SqlSessionFactory
- 生产SqlSession
- statementId存在硬编码问题
- 解决思路:使用代理模式生成Dao层接口的代理实现
2 条评论 “自定义持久层框架”