JDBC
原生JDBC
package com.jdbc.test;
import com.jdbc.model.Person;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class JdbcTest {
public static void main(String[] args) throws Exception {
//第一步,加载、注册驱动
//mysql驱动:com.mysql.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
//连接参数
//mysql连接:jdbc:mysql://ip/port/数据库名
String url = "jdbc:mysql://192.168.1.101:3306/mytest?characterEncoding=utf-8";
String userName = "root";
String password = "root";
//第二步,获取连接
Connection connection = DriverManager.getConnection(url, userName, password);
//执行sql,?作为占位符
String sql = "select t.* from person t where t.id = ? and t.name = ?";
//第三步,获取语句执行者
//statement: 1. 参数直接嵌入sql执行,会引发sql注入;2. 执行效率低,每次执行都需要编译
//Statement statement = connection.createStatement();
//preparedStatement:1. 会对sql进行预编译,防止sql注入;2. 执行效率高,sql只会编译一次
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//第四步,设置参数,替换占位符,注意:占位符角标从1开始
int id = 1;
String name = "张三";
preparedStatement.setObject(1, id);
preparedStatement.setObject(2, name);
//第五步,执行sql,获取结果集
ResultSet resultSet = preparedStatement.executeQuery();
//第六步,解析结果集
List<Person> list = new ArrayList();
while (resultSet.next()) {
int resultId = resultSet.getInt("id");
String resultName = resultSet.getString("name");
int resultAge = resultSet.getInt("age");
int resultSex = resultSet.getInt("sex");
list.add(Person.builder().id(resultId).name(resultName).age(resultAge).sex(resultSex).build());
}
System.out.println(list);
//连接释放
resultSet.close();
preparedStatement.close();
connection.close();
}
}
问题局限
1. 数据库配置信息硬编码问题
2. 频繁创建数据库连接
3. 需要手动释放连接
4. sql语句、参数设置、获取结果集参数存在硬编码
5. 需要手动封装进行结果集解析
解决方式
1. 配置文件 --解决--> 数据库配置信息硬编码问题
2. 连接池 --解决--> 解决频繁创建数据库连接;需要手动释放连接
3. 反射、内省创建结果实体 --解决--> sql语句、参数设置、获取结果集参数存在硬编码;需要手动封装进行结果集解析