文章内容输出来源:拉勾教育Java高薪训练营
自定义持久层框架分析梳理学习心得
一、分析JDBC操作问题
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis? characterEncoding=utf-8", "root", "root");
// 自定义sql,?表示点位符
String sql = "select * from user where username = ?";
// 预处理statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "tom");
// 向数据库发出sql查询,查询出结果集
resultSet = preparedStatement.executeQuery();
// 遍历查询结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
// 封装user
user.setId(id);
user.setUsername(username);
}
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC问题总结:
1、数据库连接创建、释放频繁造成系统资源的浪费,从而影响系统性能;
2、sql语句在代码中硬编码,造成代码不易维护,实际应用中sql语句变化的可能性软大,sql变动需要修改java代码;
3、使用preparedStatement向点位符号传递参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql需要修改代码,系统不易维护。
4、对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象,解析比较方便。
二、问题解决思路
数据库频繁创建链接、释放资源:连接池
sql语句及参数硬编码:配置文件
手动解析封装返回结果集:反射、内省
三、自定义框架设计
使用端:
提供核心配置文件
sqlMapConfig.xml:存储数据源信息,引入mapper.xml
mapper.xml:sql语句配置文件信息
框架端:
1、读取配置文件
读取完后以流的形式存在,我们不能将读取到的配置信息以流的形式存在内存中,不好操作,可以创建javaBean来存储
1)configuration:存放数据库基本信息,Map<唯一标识,Mapper>唯一标识:namespace+"."+id
2) MapperStatement:sql语句、statement类型、输入参数java类型、输出参数java类型
2、解析配置文件
创建sqlSessionFactoryBuilder类:
方法:sqlSessionFactory builder()
第一:使用dom4j解析配置文件,将解析出来的内容封装到Configuration和Mapperstatement中
第二:创建SqlSessionFactory的实现类DefaultSqlSession
3、创建sqlSessionFactory:
方法:openSession():获取sqlSession接口的实现类实例对象
4、创建sqlSession接口及实现类:主要封闭CRUD方法
方法:selectList(String statementId,Object param):查询所有
selectOne(String statementId,Object param):查询单个
close()释放资源
具体实现:封装JDBC完成对数据库表的查询操作
涉及到的设计模式:
构建者模式、工厂模式、代理模式
通过以上分析,逐步可以写出一个自定义的持久层框架,通过对JDBC底层API进行封装的例子,我们可以把这个思路运用到其他API封装的应用上,首先写出API应用的基本流程,然后对其进行分析梳理。这是当时自己学习的一个心得体会。希望能带给小伙伴一点启发。这是高薪训练营的入门课程,主讲老师讲的非常透彻,重点突出,通俗易懂。自己希望成为老师那样的人。
自已是在偶然的情况下知道拉勾网,开始只是了解这是一家招聘网站,在投简历的过程中发现在他家还有一些课程,主讲老师是各大厂的架构师,领域专家。从最初购买《32个Java面试必考点》到现在的《java高薪训练营》,感觉自己钱不会白花,因为拉勾一直在根据时下各公司的招聘情况,不断推出新的课程,这是其他网站不具备的。另外,自己也购买其他网站的课程,感觉钱交了大权在人家手里了,体验非常不好。通过这段时间的努力,希望自己早日进入自己喜欢的岗位。小伙伴们加油!!