演示JDBC操作数据库
1.添加依赖
<!--mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.17</version>
</dependency>
2.操作数据库详细步骤
- 加载数据库驱动
- 通过驱动管理器获取数据库链接
- 定义SQL语句,并且用
?
表示占位符 - 获取预处理statement
- 设置参数,参数序号从1开始
- 向数据库发出SQL
- 处理结果集
- 释放资源
3.实现
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",
"mysql");
// 定义SQL语句,并且用`?`表示占位符
String sql = "select * from user where id = ? and username = ?";
// 获取预处理statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数,参数序号从1开始
preparedStatement.setObject(1, 1);
preparedStatement.setObject(2, "lucy");
// 向数据库发出SQL
resultSet = preparedStatement.executeQuery();
// 处理结果集
List<User> userList = new ArrayList<>();
if (resultSet.next()) {
Long id = resultSet.getLong("id");
String username = resultSet.getString("username");
User user = new User(id, username);
userList.add(user);
}
System.out.println(userList);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException 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();
}
}
}
tips:由于Connection、PreparedStatement、ResultSet均实现了AutoCloseable,可以使用try-with-reource机制关闭资源,简化finally代码块
4.基于原始JDBC开发存在的问题
- 1.数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能;
- 2.SQL语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变
java代码; - 3.使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能
多也可能少,修改sql还要修改代码,系统不易维护; - 4.对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库
记录封装成pojo对象解析比较方便。
5.解决上述问题的思路
- 1.使用数据库连接池初始化连接资源,复用连接
- 2.将SQL语句抽取到xml配置文件中
- 3.使用反射设置参数
- 4.使用内省处理数据库字段与对象属性的映射