网站首页 > 开源技术 正文
jdbc问题分析和解决思路
jdbc代码
Class.forName("com.mysql.cj.jdbc.Driver");
String dbUrl = "jdbc:mysql://localhost:3306/test?characterEncoding=utf-8";
String username = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(dbUrl, username, password);
String sql = "select * from user where username = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "张三");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("username");
System.out.println(id+"===="+name);
}
connection.close();
问题分析
- 数据库配置信息存在硬编码
- 频繁的创建释放数据库连接
- sql语句,设置参数,返回结果集存在硬编码
- 手动封装结果集
解决思路
- 配置文件解决硬编码问题
- 采用数据库连接池解决频繁创建和释放数据库连接问题
- 使用反射,内省机制封装结果集
持久层框架
Apache DBUtils
//传入数据源,可以使用c3p0,Hikari等
QueryRunner queryRunner = new QueryRunner(dataSource);
String sql = "select * from user where username = ?";
User user = queryRunner.query(sql, new BeanHandler<User>(User.class), "张三");
- 采用数据库连接池,解决频繁创建释放数据库连接
- 对crud进行了封装
- 传入指定类型的handler自动把结果集封装成List,实体bean或Map
- 自动映射要求数据库字段名和对象属性名称保持一致
Spring JDBC
String sql = "select * from user";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<User> query = jdbcTemplate.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
User user = new User();
int id = resultSet.getInt("id");
String name = resultSet.getString("username");
user.setId(id);
user.setUsername(name);
return user;
}
});
解决的问题
- 对数据库的crud进行了封装
- 数据库连接这块不需要频繁的手动处理了
- 对结果集的返回进行了封装,可以映射成List,Map,Pojo
存在的问题
- sql语句还是存在硬编码问题
- 参数设置,通过占位符替换,不能传入对象或map自动映射
- 没有缓存,性能还有优化空间
Hibernate
@Entity
@Table(name = "user")
public class User {
@Id
@Column(name="id")
private Integer id;
@Column(name="username")
private String username;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory
.openSession();
Query query = session.createQuery("from cn.bijy.pojo.User");
List list = query.list();
System.out.println(list);
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory
.openSession();
Query query = session.createQuery("from cn.bijy.pojo.User");
List list = query.list();
System.out.println(list);
解决的问题
- hibernate是一个全自动的ORM持久层框架,实现了对象与关系型数据库的完全映射
- 自动管理连接资源
- 提供了缓存机制
- 能够根据数据库方言自动生成sql
存在的问题
- hibernate是一个全自动框架,灵活性不是很好。比如,save,update操作的是所有字段
- 自动生成sql,对sql进行一些优化就比较麻烦,这样的话,会存在一些性能问题
MyBatis
- MyBatis是基于ORM的半自动化轻量级持久层框架
- 支持定制化sql,存储过程以及高级映射
- 屏蔽了jdbc代码,手动设置参数以及获取结果集
- 支持缓存
具体代码大家可自行搜索,相对来说上手比较简单
自定义持久层框架
设计思路
使用侧
- 提供核心配置文件
- sqlMapConfig.xml 存放数据源配置信息 xxxMapper.xml 存放sql配置信息
框架侧
- 读取配置文件
- Configuration 存放数据源配置信息,Map<唯一标识,Mapper> MappedStatement sql语句,statement类型,输入参数类型,输出参数类型
- 解析配置文件
- 类SqlSessionFactoryBuilder,方法 SqlSessionFactory build() 通过dom4j解析配置文件,将信息存入Configuration和MappedStatment中 创建SqlSessionFactory的实现类DefaultSessionFactory
- 创建SqlSessionFactory
- 方法openSession创建sqlSession
- 创建SqlSession
- selectList() selectOne() close() 创建Executor
- 创建Executor
- 实际执行sql语句
声明:这是一篇学习笔记,部分内容摘抄自课堂笔记,如有侵权可联系作者删除
猜你喜欢
- 2024-09-19 将Sentinel监控数据持久化到外部InfluxDB时间序列数据库
- 2024-09-19 【每日一学】解锁数据库之门:深入探讨JDBC技术的奇妙世界
- 2024-09-19 成为优秀的Java程序员要具备哪些技能?
- 2024-09-19 Java架构师的10个学习经验,不可错过
- 2024-09-19 软件测试学习教程——JDBC开发(jdbc 测试)
- 2024-09-19 文科妹子都能看懂Mybatis快速入门教程
- 2024-09-19 如何通过连接池提高API性能(连接池获取连接)
- 2024-09-19 应大家需要,Java常用开发工具汇总来了
- 2024-09-19 jSqlBox 4.0.8 发布,在 Java 里直接写 SQL 的 ORM 工具
- 2024-09-19 一行代码搞定数据库操作 ThinkJDBC
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)