JDBC
JDBC概述
数据的持久化
- 持久化:把数据保存到可调用存储设备中以供之后使用。在大多数情况下,数据持久化以为着将内存中的数据保存到硬盘上加以“固化”,而持久化的实现过程大多通过各种关系数据库来完成
- 持久化主要是将内存中的数据存储在关系型数据库中,当然可以存储在磁盘文件、xml数据文件中
java中的数据存储技术
- 在java中,数据库存储技术可以分为:
- JDBC直接访问数据库
- JDO(java Data Object)
- 第三方O/R工具,如:Mybatis
- JDBC是访问数据库的基石,其他的技术只是更好的封装了JDBC
JDBC程序编写步骤
- 注册驱动:告诉java程序,哪一个数据库要连接
- 获取连接:表示JVM的进程和数据库之间的通道打了,需要关闭
- 获取数据库操作对象:专门执行sql语句的对象
- 执行SQL语句 (DQL、DML)
- 处理查询语句 :只有在执行select语句的时候,才有第五步处理查询结果
- 释放资源 (一定要关闭)
JDBC实现步骤
增删改
Statement statement = null;
Connection connection = null;
try {
/*1、注册驱动 方式一
Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driver);*/
//1、注册驱动 方式一(常用)
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接
/*
* url:统一资源定位符,某个资源的绝对路径
* */
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "157498";
connection = DriverManager.getConnection(url,user,password);
System.out.println(connection);//com.mysql.jdbc.JDBC4Connection@14514713
//3、获取数据库的操作对象
statement = connection.createStatement();
//4、执行sql
/*
* executeUpdate(String sql)
执行给定的SQL语句,这可能是 INSERT , UPDATE ,或 DELETE语句,或者不返回任何内容,如SQL DDL语句的SQL语句。 */
String sql1="insert into test values (1,'a'), (2,'b')";
//5、处理结果
long count = statement.executeUpdate(sql1);
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
}finally {
//6、释放资源
//并且遵顼从小到大一次关闭 先关闭statement 再关闭connection
//分开处理try catch保证全部关闭
if(statement !=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection !=null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
查
/*注册驱动:告诉java程序,哪一个数据库要连接
获取连接:表示JVM的进程和数据库之间的通道打了,需要关闭
获取数据库操作对象:专门执行sql语句的对象
释放资源
这些语句与上面的增删改的语句一样 */
/*4、执行sql*/
ResultSet resultSet = null;//也需要释放
String sql="select * from test";
resultSet= statement.executeQuery(sql);
/*5、处理结果
next() 类似c语言中的指针,每次使用玩后都会向下移动一个
getString(String col) col为列名得到这一列的值
*/
while(resultSet.next()) {
System.out.println("-----");
String id = resultSet.getString("id");
String name = resultSet.getString("name");
System.out.println(id+" "+name);
}
解决sql注入问题
-
只要用户提供的信息不参与sql的编译过程,问题就解决了
-
要想用户不参与sql语句的编译,就要使用java.sql.PreperedStatement
-
PreparedStatement ps = null; Connection connection = null; ResultSet resultSet = null; try { //1、注册驱动 方式一 // Driver driver = new com.mysql.jdbc.Driver(); // DriverManager.registerDriver(driver); //1、注册驱动 方式一(常用) Class.forName("com.mysql.jdbc.Driver"); //2、获取连接 /* * url:统一资源定位符,某个资源的绝对路径 * */ String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "157498"; connection = DriverManager.getConnection(url,user,password); System.out.println(connection);//com.mysql.jdbc.JDBC4Connection@14514713 String sql="insert into test(id,name) values (id =?, name =?)";//每一个?表示一个占位符,一个?未来要接受一个值,占位符不能用单引号括起来。 //3、获取数据库的操作对象 ps = connection.prepareStatement(sql); //给占位符传值 String str="cc"; ps.setInt(1,3); ps.setString(2,"str"); //4、执行sql System.out.println(sql); int count = ps.executeUpdate(); System.out.println(count); //5、处理结果 } catch (SQLException | ClassNotFoundException e) { e.printStackTrace(); }finally { //6、释放资源 //并且遵顼从小到大一次关闭 先关闭statement 再关闭connection if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if( ps !=null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection !=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }