通过上一篇分析可知,可以访问数据库繁琐步骤封装为两部分完成。
步骤1、使用数据库连接池完成数据库的连接;
步骤2、封装一个“方法”,入参为脚本,出参为“目标”数据。
通过步骤2可以看出,脚本是与“目标数据”绑定在一起的,如何完成这种绑定 ? 方法很多:
方案1:建立一个实体,保存方法和返回值对象
方案2:在方法上使用注解
方案3:使用配置文件(xml、properties等)
…
本案例使用注解进行(选择注解的原因:在执行步骤2的时候,核心是执行脚本,执行脚本之前需要对参数进行处理,执行完成之后需要进行结果处理,符合动态代理设计模式)。
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();
}
}
}
下一节,正式阅读mybatis源码。