使用原生jdbc进行查询数据步骤.
- 1、加载驱动
- 2、获取数据库连接
- 3、创建Statement对象
- 4、占位符赋值
- 5、执行脚本
- 6、解析结果
- 7、关闭资源
代码示例
java
public class T0 {
public static void main(String[] args) throws Exception {
String sql = "SELECT id,name FROM goods WHERE id = ?";
List<Object> params = new ArrayList<>(1);
params.add(1);
new T0().jdbcForSql(sql, params);
}
public void jdbcForSql(String sql, List<Object> params) throws Exception {
//从配置文件中读取配置信息
Properties pro = new Properties();
pro.load(Resources.getResourceAsStream("database.properties"));
String driver = pro.get("db.driver").toString();
String userName = pro.getProperty("db.username").toString();
String pwd = pro.getProperty("db.password").toString();
String url = pro.getProperty("db.url").toString();
//加载驱动
Class.forName(driver);
//创建数据库链接
Connection connection = DriverManager.getConnection(url, userName, pwd);
//创建Statement对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//给占位符赋值
for (int i = 0; i < params.size(); i++) {
preparedStatement.setObject(i + 1, params.get(i));
}
//执行脚本
ResultSet resultSet = preparedStatement.executeQuery();
//结果解析
while (resultSet.next()) {
System.out.println(resultSet.getString("name"));
}
//关闭资源
if (resultSet != null) {
resultSet.close();
}
if (null != preparedStatement) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
}
}
从上面代码中可以看出明显的缺点:
1、每与数据库交互一次,都要执行一遍上面的流程,流程繁琐,
2、脚本与业务代码强耦合,不利于复用和维护。
优化思路:
- 1、步骤1、步骤2 可以引入数据库连接池解决。
- 2、步骤3~步骤7可以封装,唯一不同的是执行脚本不同(传递参数),返回值不同[反射解决](查询操作)。
步骤3~步骤7中,核心是执行脚本,执行脚本之前需要给脚本动态赋值,脚本执行以后需要对结果进行解析,正好对应代理模式(动态代理)。
基于以上分析,可以将查询数据库的操作简化为两步:
1、从数据库连接池中获取数据库连接;
2、传入脚本获取结果。
下一篇基于 动态代理+注解 实现简易版的MyBatis。