演示JDBC操作数据库
1.添加依赖
<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");
String sql
= "select * from user where id = ? and username = ?";
preparedStatement
= connection
.prepareStatement(sql
);
preparedStatement
.setObject(1, 1);
preparedStatement
.setObject(2, "lucy");
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.使用内省处理数据库字段与对象属性的映射