JAVA11-JDBC学习

1.JDBC概念

      全称:java database connectivity ,JDBC 规范定义接口,

1) JDBC 是 官方(SUN公司)定义的一套操作所有关系型数据库的规则,也就是接口,称之为Java 访问数据库的标准规范;

2)具体的实现由各大数据库厂商来实现这套接口,提供数据库驱动的jar包,我们可以使用这套接口(jdbc)编程,实际上执行的代码是jar包的实现类。操作数据库还需要具体的实现类,也就是数据库驱动。真正执行的代码是驱动jar包中的实现类,比方说之前写的接口

     Person接口    worker实现类  写出: Person person = new worker();

含义就是父类引用指向子类对象的方式,而执行person.eat()执行worker实现类的方法,产生了一个多态的调用。因此在jdbc编程当中,都是用接口类型来调用方法,而当我导入了jar包之后,调用的是实现类的实现方法。


3)每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供。

4)jar包一般包含的内容

image


     使用 JDBC 的好处:

1) 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。

2) 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库



1.1.jdbc的快速入门之jdbc执行的基本步骤

  • 1)导入驱动jar包,我们目前用的是mysql-connector-java-5.1.37
  • 2)去编写代码来注册驱动
  • 3)获取数据库的连接对象Connection,它是本地的java代码和数据库之间的桥梁对象
  • 4)有了连接对象后,我们就可以定义sql语句
  • 5)Connection不能直接执行sql语句,需要获取执行sql语句对象(也就是Statement)
  • 6)执行sql,接收返回结果
  • 7)有了返回结果,处理这个返回结果。
  • 8)释放资源
  1 public class jdbcDemo01 {
  2     public static void main(String[] args) throws Exception {
  3         // 1)导入驱动jar包
  4         // 2)注册驱动
  5         Class.forName("com.mysql.jdbc.Driver");
  6         //3) 获取数据库的连接对象
  7         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");
  8         //4) 定义sql语句
  9         String sql = "update account set balance = 5000 where id =1 ";
 10         // 5) 获取执行sql语句的对象 Statement
 11         Statement stmt = conn.createStatement();
 12         // 6)执行sql语句
 13         int conut = stmt.executeUpdate(sql);
 14         //7)有了结果,处理结果,打印一下
 15         System.out.println(conut);
 16         // 8)释放资源
 17         stmt.close();
 18         conn.close();
 19     }
 20 }

2.现在我们针对这里面出现的各个对象进行详细解答

2.1 DriverManager  驱动管理对象

      功能1: 注册驱动  为何能注册驱动,因为里面有方法  static void  registerDriver(Driver driver)  向 DriverManager 注册给定驱动程序。

                我们写代码  Class.forName("com.mysql.jdbc.Driver");来注册加载驱动,为何不是上面的方法呢,,此处com.mysql.jdbc.Driver加载能执行,说明com.mysql.jdbc.Driver这个类里面一定存在一个静态代码块自动执行,我们找寻下这个com.mysql.jdbc.Driver来找寻下这:确实有静态代码块。

static {
     try {
         java.sql.DriverManager.registerDriver(new Driver());

     } catch (SQLException E) {
         throw new RuntimeException("Can't register driver!");
     }

}

      mysql5之后的驱动jar包可以不写

      功能2:获取数据库连接 方法如下:

       static Connection  getConnection(String url, String user, String password)   试图建立到给定数据库 URL 的连接。

     *url  指定连接的数据库路径 语法 jdbc:mysql://ip地址  ,举例如下:

                                                 jdbc:mysql://localhost:3306/db3

     * user 用户名

     *password:密码

2.2 Connection       数据库连接对象

     功能:

         1)获取执行sql的对象 

方法1:Statement  createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。

方法2: PreparedStatement  prepareStatement(String sql)  创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。

          2)管理事务功能,针对开启事务、提交事务和回滚也封装了三个方法

开启事务   void  setAutoCommit(boolean autoCommit)

     含义:将此连接的自动提交模式设置为给定状态。调用该房屋设置参数为false,即开启事务

提交事务    void  commit()

     含义:使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当

              前持有的所有数据库锁。

回滚事务      void  rollback()

     含义:取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据

              库锁。



2.3 Statement        执行sql的对象 statement在beans和sql两个包下都有, 本次看sql

     功能:Statement用于执行静态 SQL 语句并返回它所生成结果的对象。而PreparedStatement执行的是动态预编译sql语句,静态sql含义就是sql语句中的值是给定的就是静态sql。

1)执行sql  boolean  execute(String sql) 执行给定的 SQL 语句,该语句可能返回多个结果。

         返回: 如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回 false

2)执行sql   int  executeUpdate(String sql) 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。

     DML  insert update delete

     DDL create alter  drop

3)ResultSet  executeQuery(String sql) 执行给定的 SQL(select) 语句,该语句返回单个 ResultSet 对象。

* int 返回值是影响的行数

练习1 向db2中account表插入一个数据 insert into account values (null,'王五',3000)

  1 package cn.itcast.demo01.demo01.demo05;
  2 
  3 import java.sql.Connection;
  4 import java.sql.DriverManager;
  5 import java.sql.SQLException;
  6 import java.sql.Statement;
  7 
  8 public class JdbcDemo02 {
  9     public static void main(String[] args) {
 10         Statement stmt = null;
 11         Connection conn = null;
 12         try {
 13             //注册驱动,我们这次抓取异常
 14             Class.forName("com.mysql.jdbc.Driver");
 15             //定义sql
 16             String sql  = "insert into account values (null,'王五',3000)";
 17             //获取Connection对象
 18             conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
 19             //获取执行sql的对象Statement
 20             stmt = conn.createStatement();
 21             //执行sql
 22             int count = stmt.executeUpdate(sql);
 23             System.out.println(count);
 24             if(count > 0 ){
 25                 System.out.println("添加成功");
 26             }else{
 27                 System.out.println("添加失败");
 28             }
 29         } catch (ClassNotFoundException e) {
 30             e.printStackTrace();
 31         } catch (SQLException e) {
 32             e.printStackTrace();
 33         }finally{
 34             if (stmt != null){//避免空指针异常
 35                 try {
 36                     stmt.close();//stemt原来作用域在try中,因此需要提前定义
 37                 } catch (SQLException e) {
 38                     e.printStackTrace();
 39                 }
 40             }
 41             if (conn != null){//避免空指针异常
 42                 try {
 43                     conn.close();//stemt原来作用域在try中,因此需要提前定义
 44                 } catch (SQLException e) {
 45                     e.printStackTrace();
 46                 }
 47             }
 48         }
 49     }
 50 }
 51 

练习2,我们修改db2中的account表的数据金额 update account set balance = 1500 where id = 3

  1 public class JdbcDemo02 {
  2     public static void main(String[] args) {
  3         Statement stmt = null;
  4         Connection conn = null;
  5         try {
  6             //注册驱动,我们这次抓取异常
  7             Class.forName("com.mysql.jdbc.Driver");
  8             //定义sql
  9             String sql = "update account set balance = 1500 where id = 3";
 10             //获取Connection对象
 11             conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
 12             //获取执行sql的对象Statement
 13             stmt = conn.createStatement();
 14             //执行sql
 15             int count = stmt.executeUpdate(sql);
 16             System.out.println(count);
 17             if(count > 0 ){
 18                 System.out.println("添加成功");
 19             }else{
 20                 System.out.println("添加失败");
 21             }
 22         } catch (ClassNotFoundException e) {
 23             e.printStackTrace();
 24         } catch (SQLException e) {
 25             e.printStackTrace();
 26         }finally{
 27             if (stmt != null){//避免空指针异常
 28                 try {
 29                     stmt.close();//stemt原来作用域在try中,因此需要提前定义
 30                 } catch (SQLException e) {
 31                     e.printStackTrace();
 32                 }
 33             }
 34             if (conn != null){//避免空指针异常
 35                 try {
 36                     conn.close();//stemt原来作用域在try中,因此需要提前定义
 37                 } catch (SQLException e) {
 38                     e.printStackTrace();
 39                 }
 40             }
 41         }
 42     }
 43 }

练习3:删除表中一个记录   delete from account where id = 3

  1 public class JdbcDemo02 {
  2     public static void main(String[] args) {
  3         Statement stmt = null;
  4         Connection conn = null;
  5         try {
  6             //注册驱动,我们这次抓取异常
  7             Class.forName("com.mysql.jdbc.Driver");
  8             //定义sql
  9             String sql = "delete from account where  id = 3";
 10             //获取Connection对象
 11             conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
 12             //获取执行sql的对象Statement
 13             stmt = conn.createStatement();
 14             //执行sql
 15             int count = stmt.executeUpdate(sql);
 16             System.out.println(count);
 17             if(count > 0 ){
 18                 System.out.println("添加成功");
 19             }else{
 20                 System.out.println("添加失败");
 21             }
 22         } catch (ClassNotFoundException e) {
 23             e.printStackTrace();
 24         } catch (SQLException e) {
 25             e.printStackTrace();
 26         }finally{
 27             if (stmt != null){//避免空指针异常
 28                 try {
 29                     stmt.close();//stemt原来作用域在try中,因此需要提前定义
 30                 } catch (SQLException e) {
 31                     e.printStackTrace();
 32                 }
 33             }
 34             if (conn != null){//避免空指针异常
 35                 try {
 36                     conn.close();//stemt原来作用域在try中,因此需要提前定义
 37                 } catch (SQLException e) {
 38                     e.printStackTrace();
 39                 }
 40             }
 41         }
 42     }
 43 }
 44 

练习4 创建一个表,DDL无返回值,因此if语句可以删除

  1 public class JdbcDemo02 {
  2     public static void main(String[] args) {
  3         Statement stmt = null;
  4         Connection conn = null;
  5         try {
  6             //注册驱动,我们这次抓取异常
  7             Class.forName("com.mysql.jdbc.Driver");
  8             //定义sql
  9             String sql = "create table  student(id int, name varchar(20))";
 10             //获取Connection对象
 11             conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
 12             //获取执行sql的对象Statement
 13             stmt = conn.createStatement();
 14             //执行sql
 15             int count = stmt.executeUpdate(sql);
 16             System.out.println(count);
 17 
 18         } catch (ClassNotFoundException e) {
 19             e.printStackTrace();
 20         } catch (SQLException e) {
 21             e.printStackTrace();
 22         }finally{
 23             if (stmt != null){//避免空指针异常
 24                 try {
 25                     stmt.close();//stemt原来作用域在try中,因此需要提前定义
 26                 } catch (SQLException e) {
 27                     e.printStackTrace();
 28                 }
 29             }
 30             if (conn != null){//避免空指针异常
 31                 try {
 32                     conn.close();//stemt原来作用域在try中,因此需要提前定义
 33                 } catch (SQLException e) {
 34                     e.printStackTrace();
 35                 }
 36             }
 37         }
 38     }
 39 }

2.4 ResultSet          结果集对象,就是来封装查询结果的,例如ResultSet  executeQuery(String sql) 执行给定的 SQL(select) 语句,该语句返回单个 ResultSet 对象。

       ResultSet接口,返回值是结果集,常见的方法如下:

  • boolean next();方法 游标向下移动一行,默认指向表头;判断是否最后一行末尾,如果是返回false,如果返回ture说明不是最后一行,还有数据
  • getXxx(参数);一次获取一行某一列的数据,XX代表数据类型,如int,double等

其中xxx代表数据类型,如int getInt();String类型 getString();

     参数 int 代表列的编号,从第一列开始(没有0列),如getString(1);

           string 代表列的名称 ,如 getDouble(“balance”)

使用步骤:

     1)游标向下移动一行 

     2)判断释放有数据

     3)获取数据

  1 public class JdbcDemo02 {
  2     public static void main(String[] args) {
  3         Statement stmt = null;
  4         Connection conn = null;
  5         ResultSet rd = null;//这个结果集也是一个资源,也需要是否
  6         try {
  7             //1.注册驱动,我们这次抓取异常
  8             Class.forName("com.mysql.jdbc.Driver");
  9             //2.定义sql
 10             String sql = "select * from account";
 11             //3.获取Connection对象
 12             conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
 13             //4.获取执行sql的对象Statement
 14             stmt = conn.createStatement();
 15             //5.执行sql
 16             rd = stmt.executeQuery(sql);
 17             while (rd.next()){
 18                 int anInt = rd.getInt(1);
 19                 String name = rd.getString("name");
 20                 double balance = rd.getDouble(3);
 21                 System.out.println(anInt + "----" + name + "-----" + balance );
 22                 System.out.println(rd);
 23             }
 24         } catch (ClassNotFoundException e) {
 25             e.printStackTrace();
 26         } catch (SQLException e) {
 27             e.printStackTrace();
 28         }finally{
 29             if (stmt != null){//避免空指针异常
 30                 try {
 31                     stmt.close();//stemt原来作用域在try中,因此需要提前定义
 32                 } catch (SQLException e) {
 33                     e.printStackTrace();
 34                 }
 35             }
 36             if (conn != null){//避免空指针异常
 37                 try {
 38                     conn.close();//stemt原来作用域在try中,因此需要提前定义
 39                 } catch (SQLException e) {
 40                     e.printStackTrace();
 41                 }
 42             }
 43         }
 44     }
 45 }
 46 

练习:查询emp表的数据,将其封装为对象,而专门装载对象的用集合即可

我们可以定义一个方法,查询emp表的数据,将其封装为对象,然后装载集合,返回,分为三步

类名 Emp类

方法: public List<emp> findAll(){}

实现方法 select * from emp;

  1     public static void main(String[] args) {
  2         List<Emp> list = new Jdbcdemo08().findAll();
  3         for(Emp emp : list){
  4             System.out.println(emp);
  5         }
  1 package cn.itcast.demo01.demo01.demo05;
  2 
  3 import java.sql.*;
  4 import java.util.ArrayList;
  5 import java.util.Collections;
  6 import java.util.List;
  7 
  8 public class Jdbcdemo08 {
  9     public static void main(String[] args) {
 10         List<Emp> list = new Jdbcdemo08().findAll();
 11         System.out.println(list);
 12     }
 13     /*
 14     查询所有emp对象
 15      */
 16     public List<Emp> findAll(){
 17         Connection conn = null;
 18         Statement stme = null;
 19         ResultSet rs = null;
 20         List<Emp> list = null;
 21         try {
 22             // 1)注册驱动
 23             Class.forName("com.mysql.jdbc.Driver");
 24             // 2)获取连接
 25             conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
 26             //3) 定义sql
 27             String sql = "select * from emp";
 28             //4)获取执行sql的对象
 29             stme = conn.createStatement();
 30             // 5)执行sql语句
 31             rs = stme.executeQuery(sql);
 32             // 7) 创建emp对象
 33             Emp emp = null;
 34             list = new ArrayList<Emp>();
 35             //6) 遍历结果集
 36             while (rs.next()){
 37                 int id = rs.getInt("id");//此处的名称与emp表要一样,与类可不一样。
 38                 String ename = rs.getString("ename");
 39                 int job_id = rs.getInt("job_id");
 40                 int mgr = rs.getInt("mgr");
 41                 Date joindate = rs.getDate("joindate");
 42                 double salary = rs.getDouble("salary");
 43                 double bonus = rs.getDouble("bonus");
 44                 int dept_id = rs.getInt("dept_id");
 45 
 46                 //创建emp对象,并赋值
 47                 emp = new Emp();
 48                 emp.setId(id);
 49                 emp.setEname(ename);
 50                 emp.setJob_id(job_id);
 51                 emp.setMgr(mgr);
 52                 emp.setJoindate(joindate);
 53                 emp.setSalary(salary);
 54                 emp.setBonus(bonus);
 55                 emp.setDept_id(dept_id);
 56 
 57                 // 装载集合
 58                 list.add(emp);
 59 
 60             }
 61 
 62         } catch (ClassNotFoundException e) {
 63             e.printStackTrace();
 64         } catch (SQLException e) {
 65             e.printStackTrace();
 66         }finally {
 67             if (rs != null){
 68                 try {
 69                     rs.close();
 70                 } catch (SQLException e) {
 71                     e.printStackTrace();
 72                 }
 73             }
 74             if (conn != null){
 75                 try {
 76                     conn.close();
 77                 } catch (SQLException e) {
 78                     e.printStackTrace();
 79                 }
 80             }
 81             if (stme != null){
 82                 try {
 83                     stme.close();
 84                 } catch (SQLException e) {
 85                     e.printStackTrace();
 86                 }
 87             }
 88         }
 89         return list;//这个集合需要前置定义
 90     }
 91 }
 92 
  1 package cn.itcast.demo01.demo01.demo05;
  2 
  3 import java.util.Date;
  4 
  5 /*
  6 封装emp数据的javaBean
  7  */
  8 public class Emp {
  9     private int id;//参考数据表中的各个字段,补充进来 这里面的名字尽量一样
 10     private String ename;
 11     private int job_id;
 12     private int mgr;
 13     private Date joindate;
 14     private double salary;
 15     private double bonus;
 16     private int dept_id;
 17 
 18     @Override
 19     public String toString() {//方便打印看效果
 20         return "Emp{" +
 21                 "id=" + id +
 22                 ", ename='" + ename + '\'' +
 23                 ", job_id=" + job_id +
 24                 ", mgr=" + mgr +
 25                 ", joindate=" + joindate +
 26                 ", salary=" + salary +
 27                 ", bonus=" + bonus +
 28                 ", dept_id=" + dept_id +
 29                 '}';
 30     }
 31 
 32     public int getId() {
 33         return id;
 34     }
 35 
 36     public void setId(int id) {
 37         this.id = id;
 38     }
 39 
 40     public String getEname() {
 41         return ename;
 42     }
 43 
 44     public void setEname(String ename) {
 45         this.ename = ename;
 46     }
 47 
 48     public int getJob_id() {
 49         return job_id;
 50     }
 51 
 52     public void setJob_id(int job_id) {
 53         this.job_id = job_id;
 54     }
 55 
 56     public int getMgr() {
 57         return mgr;
 58     }
 59 
 60     public void setMgr(int mgr) {
 61         this.mgr = mgr;
 62     }
 63 
 64     public Date getJoindate() {
 65         return joindate;
 66     }
 67 
 68     public void setJoindate(Date joindate) {
 69         this.joindate = joindate;
 70     }
 71 
 72     public double getSalary() {
 73         return salary;
 74     }
 75 
 76     public void setSalary(double salary) {
 77         this.salary = salary;
 78     }
 79 
 80     public double getBonus() {
 81         return bonus;
 82     }
 83 
 84     public void setBonus(double bonus) {
 85         this.bonus = bonus;
 86     }
 87 
 88     public int getDept_id() {
 89         return dept_id;
 90     }
 91 
 92     public void setDept_id(int dept_id) {
 93         this.dept_id = dept_id;
 94     }
 95 }
 96 
2.5 PreparedStatement  执行Sql的对象,功能比Statement丰富

前面

抽取JDBC的工具类 JDBCUtils,目的是简化书写

 










posted @ 2020-04-19 14:16  芒果侠  阅读(344)  评论(0编辑  收藏  举报