MyBatis学习(一)– 为什么要使用MyBatis
标签(空格分隔): MyBatis学习
- 程序例子
- 问题总结
之前使用JDBC作为数据库持久层,一般需要以下几个步骤:
1. 加载数据库驱动
2. 创建并获得数据库连接(设置连接地址、用户名密码)
3. 创建jdbc statement对象
4. 设置sql语句
5. 设置sql语句中的参数(使用preparedStatement)
6. 通过statement执行sql并获得结果
7. 对sql执行结果并解析处理
8. 释放资源(关闭连接)
代码实例如下:
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", "mysql");
// 定义sql语句 ?表示占位符
String sql = "select * from user where username = ?";
// 获取预处理statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
// 向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
// 遍历查询结果集
while (resultSet.next()) {
System.out.println(resultSet.getString("id") + " " + resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
针对上面的代码,总结如下问题:
- 创建数据库连接、释放资源频繁造成数据库资源的浪费,创建和关闭连接影响性能—-解决方案:采用数据库连接池
- 将sql硬编码在java代码中,如果sql语句修改需要重新编译java代码,不利于系统的维护 —-解决设想:将sql语句配置在配置文件中,即使sql变化不需要重新编译java代码
- 在prepareStatement中设置参数,对占位符位置和设置参数值硬编码在java代码中,不利于后期系统维护—解决设想:将sql语句及占位符全部配置在sql文件中
- 在遍历结果集时,将获取表的字段进行硬编码,不利于后期系统维护 —解决设想:将查询的结果集自动映射成java的pojo对象