Java学习:JDBC
Posted 少放辣子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习:JDBC相关的知识,希望对你有一定的参考价值。
jdbc简介
DBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,使用这个类库可以以一种标准的方法、方便地访问数据库资源。
jdbc的核心API
Driver接口:数据库驱动程序的接口,所有的数据库厂商需要的驱动程序需要实现此接口。
Connection接口:与具体的数据库连接对象;
Statement createStatement() 创建一个静态sql语句对象
PreparedStatement prepareStatement(String sql) 创建预编译的sql语句对象
CallableStatement prepareCall(String sql) 创建存储过程的sql语句对象
Statement接口:用于执行静态 SQL 语句
int executeUpdate(String sql) 执行更新操作的sql语句 (create/alter/drop) DDL语句
(insert/update/delete)DML语句
ResultSet executeQuery(String sql) 执行查询操作的sql语句
(select)(DQL查询语句)
PreparedStatement接口:用于执行预编译的 SQL 语句(是Statement的子接口)
int executeUpdate() 执行更新操作的sql语句
ResultSet executeQuery() 执行查询操作的sql语句
CallableStatement接口:用于执行 SQL 存储过程的接口(是PreparedStatement的子 接口)
ResultSet executeQuery() 执行存储过程的sql语句
ResultSet接口:结果集对象。 存储所有数据库查询的结果,用该对象进行数据遍历。
boolean next() : 把光标移动到下一行。如果下一行有数据,返回true,如果没有下一行数 据,返回false。
getXXX(列索引|列字段名称): 获取字段的数据
Jdbc编程步骤:
1、加载数据库驱动
Class.ForName(driveClass)
上面的driveClass就是数据库驱动类对应的类路径字符串,
2、通过DriverManager获取数据库的链接
DriverManager.getConnection(String url, Stirng user, String pass)
当使用DriverManager来获取链接,需要传入三个参数:分别是数据量的url、用户名、密码。
用此方法获取数据库的链接
1 public class DriverDemo { 2 private static String url = "jdbc:mysql://localhost:3306/day20"; 3 //jdbc协议:mysql协议://主机地址:端口号/需要连接的数据库名称 4 private static String user = "root"; 5 private static String password="root"; 6 7 public static void main(String[] args) throws Exception { 8 /** 9 * java程序连接mysql数据库 10 * 1.mysql数据库的主机地址 11 * 2.端口号 12 * 3.用户名 13 * 5.密码 14 * 6.需要连接的数据库 15 * 16 * 需求:先使用java程序连接我们的数据库,需要一个连接对象Connection 17 */ 18 conn3(); 19 } 20 private static void conn3() throws Exception { 21 //注册驱动,我们发现mysql驱动程序的Driver实现类已经帮我们在静态代码块中注册好了驱动, 22 //我们在此时只需要将Driver实现类加载到我们的内存中,static代码块就会自动执行,我们的驱动也就自动注册了 23 //注册驱动 24 Class.forName("com.mysql.jdbc.Driver"); 25 26 //获取java连接数据库的对象 27 Connection conn = DriverManager.getConnection(url, user, password); 28 29 //打印这个连接对象 30 System.out.println(conn); 31 32 }
3、通过Connection对象创建Statement对象,Connection创建Statement的方法如下三个:
createStatement()创建基本的Statement对象。
prepareStatement(String sql):根据传入的sql语句创建预编译的Statement对象。
prepareCall(String sql):根据传入的sql语句创建CallableStatement对象。
4、Statement执行SQL语句,Statement有三大方法来执行SQL语句:
execute:可以执行任何SQL语句,单比较麻烦
executeUpdate:可以执行DML、DDL语句。执行DML返回受影响的SQL语句行数,执行DDL返回0;
(create/alter/drop) DDL语句
(insert/update/delete)DML语句
executeQuery:只能执行查询语句DQL,执行后返回代表查询结果的ResultSet对象。
先创建基本的Statement对象。然后通过executeUpdate执行DML、DDL语句。
1 public class Demo { 2 private static String url = "jdbc:mysql://localhost:3306/day19"; 3 private static String user = "root"; 4 private static String password = "root"; 5 6 public static void main(String[] args){ 7 Connection conn = null; 8 Statement stmt = null; 9 try { 10 //注册驱动 11 Class.forName("com.mysql.jdbc.Driver"); 12 //通过驱动管理类获取数据库连接 13 conn = DriverManager.getConnection(url, user, password); 14 15 //创建语句执行者 16 stmt = conn.createStatement(); 17 //int executeUpdate(String sql) 18 //throws SQLException执行给定 SQL 语句, 19 //该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。 20 String sql = "CREATE TABLE student1("+ 21 "id INT,"+ 22 "NAME VARCHAR(20),"+ 23 "age INT"+ 24 ");"; 25 26 //使用语句执行者执行创建的sql语句 27 int count = stmt.executeUpdate(sql); 28 29 //打印一下影响的结果 30 System.out.println(count); 31 } catch (Exception e) { 32 e.printStackTrace(); 33 throw new RuntimeException(); 34 }finally{ 35 //释放资源 36 if (conn!=null) { 37 try { 38 conn.close(); 39 } catch (SQLException e) { 40 // TODO Auto-generated catch block 41 e.printStackTrace(); 42 } 43 } 44 45 if (stmt!=null) { 46 try { 47 stmt.close(); 48 } catch (SQLException e) { 49 // TODO Auto-generated catch block 50 e.printStackTrace(); 51 } 52 } 53 54 } 55 } 56 57 }
1 public class Demo2 { 2 private static String url = "jdbc:mysql://localhost:3306/day20"; 3 private static String user = "root"; 4 private static String password = "root"; 5 6 public static void main(String[] args) { 7 testInsert();//给数据库添加一条记录 8 testUpdate();//修改数据库中的一条数据 9 testDelete(); 10 } 11 12 private static void testDelete() { 13 14 //需求:将刘德华改为岳云鹏 15 Connection conn = null; 16 Statement stmt = null; 17 18 try{ 19 //2.获取连接对象 20 conn =JDBCUtil.getConn(); 21 //3.准备sql 22 String sql = "DELETE FROM student WHERE id=1;"; 23 //4.获取语句执行者 24 stmt = conn.createStatement(); 25 //5.发送兵长执行sql 26 int count = stmt.executeUpdate(sql); 27 //打印影响的行数 28 System.out.println(count); 29 30 }catch(Exception e){ 31 e.printStackTrace(); 32 throw new RuntimeException(); 33 }finally{ 34 JDBCUtil.close(conn, stmt, null); 35 } 36 37 38 39 } 40 41 private static void testUpdate() { 42 //需求:将刘德华改为岳云鹏 43 Connection conn = null; 44 Statement stmt = null; 45 46 try{ 47 //1.注册驱动 48 Class.forName("com.mysql.jdbc.Driver"); 49 //2.获取连接对象 50 conn =DriverManager.getConnection(url, user, password); 51 //3.准备sql 52 String sql = "UPDATE student SET NAME=‘岳云鹏‘ WHERE id=1;"; 53 //4.获取语句执行者 54 stmt = conn.createStatement(); 55 //5.发送兵长执行sql 56 int count = stmt.executeUpdate(sql); 57 //打印影响的行数 58 System.out.println(count); 59 60 }catch(Exception e){ 61 e.printStackTrace(); 62 throw new RuntimeException(); 63 }finally{ 64 if (conn!=null) { 65 try { 66 conn.close(); 67 } catch (SQLException e) { 68 // TODO Auto-generated catch block 69 e.printStackTrace(); 70 } 71 } 72 73 if (stmt!=null) { 74 try { 75 stmt.close(); 76 } catch (SQLException e) { 77 // TODO Auto-generated catch block 78 e.printStackTrace(); 79 } 80 } 81 } 82 83 } 84 85 private static void testInsert() { 86 //专门测试添加功能 87 Connection conn = null; 88 Statement stmt = null; 89 try{ 90 //注册驱动 91 Class.forName("com.mysql.jdbc.Driver"); 92 //获取连接 93 conn = DriverManager.getConnection(url, user, password); 94 //定义sql 95 String sql = "INSERT INTO student VALUES(1,‘刘德华‘,50);"; 96 //获取语句执行者 97 stmt = conn.createStatement(); 98 //使用语句执行者发送并执行sql语句,并返回影响的行数 99 int count = stmt.executeUpdate(sql); 100 System.out.println(count); 101 102 }catch(Exception e){ 103 e.printStackTrace(); 104 throw new RuntimeException(); 105 }finally{ 106 //释放资源 107 if (conn!=null) { 108 try { 109 conn.close(); 110 } catch (SQLException e) { 111 // TODO Auto-generated catch block 112 e.printStackTrace(); 113 } 114 } 115 116 if (stmt!=null) { 117 try { 118 stmt.close(); 119 } catch (SQLException e) { 120 // TODO Auto-generated catch block 121 e.printStackTrace(); 122 } 123 } 124 } 125 126 } 127 128 }
为了使程序员对数据库的操作方便可将注册驱动,获取连接数据库对象,释放资源等操作抓取成功一个类
1 package com.jdbc.Util; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 public class JDBCUtil { 10 private static String url = "jdbc:mysql://localhost:3306/day20"; 11 private static String user = "root"; 12 private static String password = "root"; 13 14 static{ 15 //随着类的加载而夹在 16 try { 17 Class.forName("com.mysql.jdbc.Driver"); 18 } catch (ClassNotFoundException e) { 19 // TODO Auto-generated catch block 20 e.printStackTrace(); 21 } 22 } 23 24 //获取连接 25 public static Connection getConn(){ 26 //注册驱动 27 try { 28 Connection conn = DriverManager.getConnection(url, user, password); 29 return conn; 30 } catch (Exception e) { 31 // TODO Auto-generated catch block 32 e.printStackTrace(); 33 throw new RuntimeException(); 34 } 35 36 } 37 38 39 //释放资源 40 public static void close(Connection conn,Statement stmt,ResultSet rs){ 41 if (conn!=null) { 42 try { 43 conn.close(); 44 } catch (SQLException e) { 45 // TODO Auto-generated catch block 46 e.printStackTrace(); 47 } 48 } 49 50 if (stmt!=null) { 51 try { 52 stmt.close(); 53 } catch (SQLException e) { 54 // TODO Auto-generated catch block 55 e.printStackTrace(); 56 } 57 } 58 59 if (rs!=null) { 60 try { 61 rs.close(); 62 } catch (SQLException e) { 63 // TODO Auto-generated catch block 64 e.printStackTrace(); 65 } 66 } 67 } 68 69 }
通过executeQuery执行DQL语句,利用next()方法判断是否有下一行数据
1 public class Demo3 { 2 3 public static void main(String[] args) { 4 //定义一个连接对象和一个语句执行者 5 Connection conn =null; 6 Statement stmt = null; 7 ResultSet rs = null; 8 try{ 9 conn = JDBCUtil.getConn(); 10 //定义sql 11 String sql = "SELECT * FROM student;"; 12 //获取语句执行者对象 13 stmt = conn.createStatement(); 14 //执行DQL查询语句 15 //ResultSet executeQuery(String sql) 16 //throws SQLException执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。 17 rs = stmt.executeQuery(sql); 18 //ResultSet是一个结果集 19 /*//判断有没有下一行数据 20 if (rs.next()) { 21 //说明有下一行数数据 22 System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getInt(3)); 23 } 24 25 if (rs.next()) { 26 //说明有下一行数数据 27 System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getInt(3)); 28 } 29 30 if (rs.next()) { 31 //说明有下一行数数据 32 System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getInt(3)); 33 } 34 35 if (rs.next()) { 36 //说明有下一行数数据 37 System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getInt(3)); 38 } 39 40 if (rs.next()) { 41 //说明有下一行数数据 42 System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getInt(3)); 43 }*/ 44 45 //使用while循环改进上面的代码,获取字段的数据(字段类型+列号) 46 /* while (rs.next()) { 47 System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getInt(3)); 48 }*/ 49 50 //使用字段名称获取字段的每一个数据 51 while (rs.next()) { 52 //当我们使用字段名称去获取字段数据的时候,字段名称是不区分大小写 53 System.out.println(rs.getInt("ID")+"--"+rs.getString("NAME")+"--"+rs.getInt("AGE")); 54 } 55 56 57 58 }catch(Exception e){ 59 e.printStackTrace(); 60 }finally{ 61 JDBCUtil.close(conn, stmt, rs); 62 } 63 64 } 65 66 }
还可以通过
PreparedStatement prepareStatement(String sql)
定义预编译sql语句对象,并通过setInt()方法 发送参数并执行sql语句。
1 package com.jdbc.c_preparedstatement; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 7 import com.jdbc.Util.JDBCUtil; 8 9 public class Demo { 10 public static void main(String[] args) { 11 testInsert(); 12 testUpdate(); 13 testDelete(); 14 testSelect(); 15 } 16 17 private static void testSelect() { 18 Connection conn =null; 19 PreparedStatement stmt = null; 20 ResultSet rs = null; 21 try{ 22 //获取连接 23 conn = JDBCUtil.getConn(); 24 //定义预编译sql 25 String sql = "SELECT * FROM student WHERE id=?;"; 26 //获取预编译sql对象 27 stmt = conn.prepareStatement(sql); 28 //给问好赋值 29 stmt.setInt(1, 3); 30 //发送参数并执行sql语句 31 //ResultSet executeQuery()throws SQLException在此 32 //PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。 33 rs = stmt.executeQuery(); 34 //遍历结果集 35 while (rs.next()) { 36 System.out.println(rs.getInt("id")+"--"+rs.getString("name")+"--"+rs.getInt("age")); 37 } 38 39 }catch(Exception e){ 40 e.printStackTrace(); 41 }finally{ 42 JDBCUtil.close(conn, stmt, rs); 43 } 44 45 46 } 47 48 private static void testDelete() { 49 50 Connection conn =null; 51 PreparedStatement stmt = null; 52 53 try{ 54 conn = JDBCUtil.getConn(); 55 //写一个参数化的sql 56 String sql = "DELETE FROM student WHERE id=?;"; 57 //获取预编译的sql对象 58 stmt = conn.prepareStatement(sql); 59 //给?设置参数 60 stmt.setInt(1, 2); 61 //发送参数并执行sql 62 int count = stmt.executeUpdate(); 63 System.out.println(count); 64 }catch(Exception e){ 65 e.printStackTrace(); 66 }finally{ 67 JDBCUtil.close(conn, stmt, null); 68 } 69 70 } 71 72 private static void testUpdate() { 73 Connection conn =null; 74 PreparedStatement stmt = null; 75 76 try{ 77 conn = JDBCUtil.getConn(); 78 String sql = "UPDATE student SET NAME=? WHERE id=?;"; 79 //执行预编译sql 80 stmt = conn.prepareStatement(sql); 81 //给?赋值 82 stmt.setString(1, "张学友"); 83 stmt.setInt(2, 5); 84 //发送参数到数据库服务器,并执行sql,将执行结果返回 85 int count = stmt.executeUpdate(); 86 System.out.println(count); 87 }catch(Exception e){ 88 e.printStackTrace(); 89 }finally{ 90 JDBCUtil.close(conn, stmt, null); 91 } 92 93 94 } 95 96 private static void testInsert() { 97 //定义连接对象和预编译sql对象 98 Connection conn = null; 99 PreparedStatement stmt = null; 100 101 try{ 102 //获取连接 103 conn = JDBCUtil.getConn(); 104 //PreparedStatement prepareStatement(String sql) 105 //throws SQLException创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。 106 String sql = "INSERT INTO student VALUES(?,?,?);";//参数化的sql,动态sql 107 stmt = conn.prepareStatement(sql);//需要一个预编译的sequel语句,将sq发送到数据库端,检查sql语法及用户权限等信息 108 109 //给之前参数化的sql语句设置参数 110 //两个参数:1:是给第几个?设置数据 2:给?设置的数据 111 stmt.setInt(1, 5); 112 stmt.setString(2, "黎明"); 113 stmt.setInt(3, 60); 114 //int executeUpdate()throws SQLException 115 int count = stmt.executeUpdate(); 116 System.out.println(count); 117 }catch(Exception e){ 118 e.printStackTrace(); 119 }finally{ 120 //释放资源 121 JDBCUtil.close(conn, stmt, null); 122 } 123 124 } 125 126 }
利用此预编译的sql对象的特性可以改进sql的注入行为
1 package com.jdbc.c_preparedstatement; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 8 import com.jdbc.Util.JDBCUtil; 9 10 public class Login { 11 //SELECT * FROM USER WHERE userName=‘james‘ OR 1=1 -- ‘ AND PASSWORD=‘123456‘; 12 //sql注入行为 13 private static String user = "james‘ OR 1=1 -- "; 14 private static String password = "123456"; 15 public static void main(String[] args) { 16 //testStatement(); 17 testPreparedStatement(); 18 } 19 20 private static void testPreparedStatement() { 21 Connection conn =null; 22 PreparedStatement stmt = null; 23 ResultSet rs = null; 24 25 try{ 26 conn =JDBCUtil.getConn(); 27 String sql = "SELECT * FROM USER WHERE userName=? AND PASSWORD=?;"; 28 stmt = conn.prepareStatement(sql); 29 //给问号设置参数 30 stmt.setString(1, user); 31 stmt.setString(2, password); 32 //发送参数并执行sql 33 rs = stmt.executeQuery(); 34 if (rs.next()) { 35 System.out.println("登陆成功"); 36 }else { 37 System.out.println("登录失败"); 38 } 39 40 }catch (Exception e) { 41 e.printStackTrace(); 42 }finally{ 43 JDBCUtil.close(conn, stmt, rs); 44 } 45 } 46 47 private static void testStatement() { 48 Connection conn =null; 49 Statement stmt = null; 50 ResultSet rs = null; 51 try{ 52 conn = JDBCUtil.getConn(); 53 stmt = conn.createStatement(); 54 String sql ="SELECT * FROM USER WHERE userName=‘"+user+"‘ AND PASSWORD=‘"+password+"‘;"; 55 rs = stmt.executeQuery(sql); 56 if (rs.next()) { 57 System.out.println("登陆成功"); 58 }else { 59 System.out.println("登录失败"); 60 } 61 62 }catch(Exception e){ 63 e.printStackTrace(); 64 }finally{ 65 JDBCUtil.close(conn, stmt, rs); 66 } 67 } 68 69 }
通过
CallableStatement prepareCall(String sql) 创建存储过程的sql语句对象
1 package com.jdbc.d_callablestatement; 2 3 import java.sql.CallableStatement; 4 import java.sql.Connection; 5 import java.sql.ResultSet; 6 7 import com.jdbc.Util.JDBCUtil; 8 9 public class Demo { 10 public static void main(String[] args) { 11 执行带有输入参数存储过程 12 //testIn(); 13 //执行带有输出参数的存储过程 14 testOut(); 15 } 16 17 private static void testOut() { 18 19 Connection conn =null; 20 CallableStatement stmt = null; 21 ResultSet rs = null; 22 try{ 23 conn = JDBCUtil.getConn(); 24 String sql = "CALL pro_QueryNameById(?,?);"; 25 stmt = conn.prepareCall(sql); 26 //给问号赋值 27 stmt.setInt(1, 2); 28 //如果存储过程带有输出参数的时候,首先需要注册,输出参数的类型 29 //void registerOutParameter(int parameterIndex,int sqlType) 30 stmt.registerOutParameter(2, java.sql.Types.VARCHAR); 31 32 //发送参数并执行sql 33 stmt.executeQuery(); 34 35 //从stmt中取出输出参数的结果 36 System.out.println(stmt.getString(2)); 37 38 }catch(Exception e){ 39 e.printStackTrace(); 40 }finally{ 41 //释放资源 42 JDBCUtil.close(conn, stmt, rs); 43 } 44 } 45 46 private static void testIn() { 47 Connection conn =null; 48 CallableStatement stmt = null; 49 ResultSet rs = null; 50 try{ 51 conn = JDBCUtil.getConn(); 52 String sql = "CALL pro_QueryById(?);"; 53 stmt = conn.prepareCall(sql); 54 55 //给问号设置值 56 stmt.setInt(1, 2); 57 //发送参数并执行sql,只能调用excuteQuery() 58 rs = stmt.executeQuery(); 59 if (rs.next()) { 60 System.out.println(rs.getInt(1)+"--"+rs.getString(2)); 61 } 62 }catch(Exception e){ 63 e.printStackTrace(); 64 }finally{ 65 //释放资源 66 JDBCUtil.close(conn, stmt, rs); 67 } 68 69 } 70 71 }
以上是关于Java学习:JDBC的主要内容,如果未能解决你的问题,请参考以下文章
关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段