##JDBC
一、概念:
1、JDBC(Java DataBase Connectivity) Java 数据库连接,Java语言操作数据库;是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。。
2、JDBC本质:其实是官方定义的一套操作所有关系型数据库的规则(即接口),各个数据库厂家去实现这个接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
3、快速入门(步骤):
-
- 导入驱动jar包;
- 注册驱动;
- 获取数据库连接对象 Connection;
- 定义SQL;
- 获取执行SQL语句的对象 Statement;
- 执行SQL,接收返回结果;
- 处理结果;
- 释放资源(与IO一样 close)。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class JDBC { public void testJDBC(){ Connection connection = null; Statement stmt = null; try { //1.注册驱动 mysql5 之后可以不写 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取Connection对象 String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8"; String user = "root"; String password="123456"; connection = DriverManager.getConnection(url,user,password); //3.定义sql String sql = "update stu set math = 99 where id = 2"; //4.获取执行sql对象 stmt = connection.createStatement(); //5.执行sql int count = stmt.executeUpdate(sql); //6.处理结果, System.out.println(count); if(count>0){ System.out.println("修改成功"); }else { System.out.println("修改失败"); } } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally { //7.释放 try { if(stmt!=null) { stmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(connection!=null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
二、各个对象详解:
1、DriverManager:驱动管理对象
功能:
①注册驱动:告诉程序该使用那一个数据库驱动jar
-
-
- static void registerDriver(Driver driver)
- Class.forName("com.mysql.jdbc.Driver")
-
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤
②获取数据库连接:
-
-
- 方法:static Connection getConnection(String url,String user,String password)
- 参数:
- url:指定连接的路径
- 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
- 举例:jdbc:mysql://localhostL3306/test
- 如果连接的是本机mysql服务器,并且mysql服务默认的端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
- user:用户名
- password:密码
- url:指定连接的路径
-
2、Connection: 数据库连接对象
功能:
①获取执行sql的对象:
-
-
- Statement createStatement()
- PreparedStatement prepareStatement(String sql)
②管理事务:
- 开启事务:void setAutoCommit(boolean autoCommit),调用该方法设置参数为false,即开启事务。
- 提交事务:void commit()
- 回滚事务:void rollback()
-
3、Statement:执行SQL的对象
执行sql
①boolean execute(String sql):可以执行任意的sql,了解一下即可。
②int executeUpdate(String sql):执行DML(insert、update、delete)语句、DDL(create、alter、drop)语句,返回值是影响的行数。
③ResultSet executeQuery(String sql):执行DQL(select)语句,常用。
4、ResultSet: 结果集对象,封装查询结果
①next():游标向下移动一行
②getXXX(参数):获取数据
-
-
- XXX代表数据类型, 如int getInt()、String getString()
- 参数:
- int:代表列的编号(从1开始,与索引不同)。如String getString(1)
- String:代表列的名称。如double getDouble(“balance”)
-
import java.sql.*; public class TestResultSet { public void testJDBC(){ Connection connection = null; Statement stmt = null; ResultSet resultSet = null; try { //1.注册驱动 mysql5 之后可以不写 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取Connection对象 String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8"; String user = "root"; String password="123456"; connection = DriverManager.getConnection(url,user,password); //3.定义sql String sql = "select *from stu"; //4.获取执行sql对象 stmt = connection.createStatement(); //5.执行sql resultSet = stmt.executeQuery(sql); //6.处理结果, resultSet.next(); int id = resultSet.getInt(1); String username = resultSet.getString("username"); int math = resultSet.getInt("math"); int english = resultSet.getInt("english"); int chinese = resultSet.getInt("chinese"); System.out.println(id+"--"+username+"--"+math+"--"+english+"--"+chinese); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally { //7.释放 try { if(resultSet!=null) { resultSet.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(stmt!=null) { stmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(connection!=null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
import java.sql.*; public class TestResultSet { public void testJDBC(){ Connection connection = null; Statement stmt = null; ResultSet resultSet = null; try { //1.注册驱动 mysql5 之后可以不写 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取Connection对象 String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8"; String user = "root"; String password="123456"; connection = DriverManager.getConnection(url,user,password); //3.定义sql String sql = "select *from stu"; //4.获取执行sql对象 stmt = connection.createStatement(); //5.执行sql resultSet = stmt.executeQuery(sql); //6.处理结果 while (resultSet.next()){//先移动 在判断 int id = resultSet.getInt(1); String username = resultSet.getString("username"); int math = resultSet.getInt("math"); int english = resultSet.getInt("english"); int chinese = resultSet.getInt("chinese"); System.out.println(id+"--"+username+"--"+math+"--"+english+"--"+chinese); } } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally { //7.释放 try { if(resultSet!=null) { resultSet.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(stmt!=null) { stmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(connection!=null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
5、PreparedStatement:执行sql的对象
①SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。
sql:select * from user where username = 'asdasd' and password = 'a' or 'a' = 'a'
②解决sql注入问题:使用PreparedStatement对象来解决
③预编译的SQL:参数使用?作为占位符
④步骤:
1、导入驱动jar包
2、注册驱动
3、获取数据库连接对象 Connection
4、定义sql
*注意:sql的参数使用?最为占位符,如:select * from user where username = ? and password = ? ;
5、获取执行sql语句的对象PreparedStatement Connection.prepareStatement(sql)
6、给 ?赋值
*方法:setXxx(参数1,参数2)
参数1:?的位置编号,从1开始
参数2:?的值
7、执行sql,接受返回结果,不需要传递sql语句
8、处理结果
9、释放资源
⑤以后经常会使用PreparedStatement来完成增删改查的所有操作
可以防止sql注入
效率更高
package jdbc_day01; import java.sql.*; public class TestPreparedStatement { public boolean testJDBC(String name,String userpassword){ Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { //1.注册驱动 mysql5 之后可以不写 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取Connection对象 String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8"; String user = "root"; String password="123456"; connection = DriverManager.getConnection(url,user,password); //3.定义sql String sql = "select *from bank where name = ? and password = ?"; //4.获取执行sql对象 preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1,name); preparedStatement.setString(2,userpassword); //5.执行sql resultSet = preparedStatement.executeQuery(); //6.处理结果 return resultSet.next(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally { //7.释放 try { if(resultSet!=null) { resultSet.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(preparedStatement!=null) { preparedStatement.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(connection!=null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } return false; } } package jdbc_day01; public class Main { public static void main(String[] args) { System.out.println(new TestPreparedStatement().testJDBC("zhangsan","123")); } }