加载数据库驱动: | class.forName(“com.mysql.jdbc.Driver”); |
---|
通过驱动类连接数据库: | Connecttion con = DriverManger.getConnection(“jdbc:mysql://localhost:3306/数据库名”,“用户名”,“密码”) |
定义sql语句: | String SQL= “SQL语句” |
数据库处理: | Preparedstatement ps = con.preparedstatement(sql); |
通过语句处理方法处理SQL语句 | ps.setstring(参数,参数) ; |
得到查询的结果集: | Resultset resultset = ps.executeQuery(); |
其他的一些遍历于关闭的 | 这里就不写了 |
原始jdbc的缺点 | 改进 |
---|
数据库驱动(class.forName())频繁使用,浪费性能 | 使用数据库连接池改进 |
SQL语句过于硬编码不便于更改 | 将SQL语句配置与xml文件 |
语句处理的两个参数过于硬编码 | 也将配置于xml文件 |
public static void main(String[] args) {
//数据库连接
Connection connection = null;
//预编译的Statement,使用预编译的Statement提高数据库性能
PreparedStatement preparedStatement = null;
//结果集
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/shopping?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) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
这里扯一点面试问题:就是资源关闭的顺序是从下往上逐渐关闭
resultset.close();
ps.close();
con.close();