JDBC
1.环境准备
MySQL数据库
数据库驱动:mysql-connector-java-5.1.27.jar,
maven依赖
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.5</version> </dependency>
2. 常用接口
2.1 Driver接口:注册JDBC驱动
// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost:3306/DBName"; // MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL //static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; //static final String DB_URL = "jdbc:mysql://localhost:3306/DBName?useSSL=false&serverTimezone=UTC";
2.2 Connection接口:和接数据库建立连接
Connection conn = DriverManager.getConnection(DB_URL, "user", "password")
常用方法如下:
1. createStatement():创建向数据库发送sql的statement对象。
2. prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
(1) 与 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接
(2) 使用PreparedStatement时,他的SQL语句不再采用字符串拼接的方式,而是采用占位符的方式。“?”在这里就起到占位符的作用。这种方式除了避免了statement拼接字符串的繁琐之外,还能够提高性能。每次SQL语句都是一样的,java类就不会再次编译,这样能够显著提高性能。注意一点,这里的参数索引是从1开始的
(3)PreparedStatement对象可以防止sql注入,而Statement不能防止sql注入
3.prepareCall(sql):创建执行存储过程的callableStatement对象。
4. setAutoCommit(boolean autoCommit):设置事务是否自动提交。
5.commit() :在链接上提交事务。
6. rollback() :在此链接上回滚事务。
2.3 Statement接口:执行静态SQL语句并返回它所生成结果的对象
三种Statement类:
1. Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
2. PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
3. CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程
常用Statement方法:
1. execute(String sql):运行语句,返回是否有结果集
2. executeQuery(String sql):运行select语句,返回ResultSet结果集
3. executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数
4. addBatch(String sql) :把多条sql语句放到一个批处理中
5. executeBatch():向数据库发送一批sql语句执行
2.4 ResultSet接口: statement.executeQuery(String sql):运行select语句返回的对象
ResultSet提供检索不同类型字段的方法,常用的有:
1. getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
2. getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
3. getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
4. getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
5. getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据
6. ResultSet还提供了对结果集进行滚动的方法
7. next():移动到下一行
8. Previous():移动到前一行
9. absolute(int row):移动到指定行
10. beforeFirst():移动resultSet的最前面。
11. afterLast() :移动到resultSet的最后面。
12. getMetaData()
2.5 获取每一列的列名
ResultSetMetaData metaData= resultSet.getMetaData(); int count=metaData.getColumnCount(); //index从1开始 for(int i=1;i<=count;i++){ //获取每一列的列名 System.out.println(metaData.getColumnName(i)); }
3(重要). 使用后依次关闭对象及连接:ResultSet → Statement → Connection
//数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放 //都要加try catch 以防前面关闭出错,后面的就不执行了 try { if (resultSet != null) { resultSet.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (statement != null) { statement.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
4. 使用代码
import java.sql.*; public class JDBCTest { public static void main(String[] args) throws ClassNotFoundException, SQLException { //设置db_driver, db_url, username , password String JDBC_DRIVER="com.mysql.jdbc.Driver"; String DB_URL="jdbc:mysql://localhost:3306/JDBCTestDB"; String user="admin"; String passwd="123456"; //注册JDBC驱动 Class.forName(JDBC_DRIVER); //建立连接 Connection connection=DriverManager.getConnection(DB_URL,user,passwd); //创建执行SQL语句的 statement Statement statement=connection.createStatement(); //使用statement执行update int resultInt= statement.executeUpdate("update student set name='tom' WHERE id ='111'"); System.out.println(resultInt); //使用statement执行select ResultSet resultSet=statement.executeQuery("SELECT * from student WHERE id ='111'"); while (resultSet.next()){ System.out.println(resultSet.getString("name")); } //数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放 //都要加try catch 以防前面关闭出错,后面的就不执行了 try { if (resultSet != null) { resultSet.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (statement != null) { statement.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } }