码迷,mamicode.com
首页 > 数据库 > 详细

JAVA11-JDBC学习

时间:2020-04-19 14:44:27      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:oid   端口   字符串   throws   manager   gis   目的   发送   撤销   

1.JDBC概念

      全称:java database connectivity ,JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。 JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供。 ?

使用 JDBC 的好处:

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

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

技术图片


(1)使用JDBC开发使用到的包

  包 名          说明

 java.sql      所有与 JDBC 访问数据库相关的接口和类

javax.sql     数据库扩展包,提供数据库额外的功能。如:连接池 数据库的驱动 由各大数据

                   库厂商提供,需要额外去下载,是对JDBC接口实现的类 

(2)jdbc的常规流程8步:

  • 1 导入驱动jar包

首先:复制 mysql-connector-java-5.1.37-bin.jar至文件夹libs中;

其次:右击 libs 选择 Add as library;这样项目的代码里引入这个jar里的内容

  • 2 注册驱动

(1)告诉程序用哪个驱动

Class.forName("com.mysql.jdbc.Driver"); // 这样写比较简单
在 java.sql.DriverManager;中,源码如下:

public class Driver implements java.sql.Driver {    

public Driver() throws SQLException {     }
      static {       

             try {             DriverManager.registerDriver(new Driver());  //注册数据库驱动        

               } catch (SQLException var1) { 

                           throw new RuntimeException("Can‘t register driver!");        

}     } }

从 JDBC3 开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName 这句话可以省略。 
com.mysql.jdbc.Driver 源代码: // Driver 接口,所有数据库厂商必须实现的接口,表示这是一个驱动类。 
技术图片
(2)获取数据库的连接:在该类中,有个方法:
DriverManager 类中的静态方                             描述 
Connection getConnection (String url, String user, String password) 
通过连接字符串,用户名,密码来得到数据库的连接对象 
Connection getConnection (String url, Properties info) 通过连接字符串,属性对象来得到连接对象 
其中 url 连接路径:jdbc:mysql://ip地址(域名):端口号/数据库名称
                        jdbc:mysql://localhost:3306/db1(如果是本机,黄色可省略)
  • 3 获取数据库连接对象 connection

(1)获取可执行的sql对象

Connection 接口中的方法                               描述

Statement createStatement()   创建一条 SQL 语句对象

preparedstatement(String sql)创建一个preparedstatement对象,将参数化的sql语句发送到数据库

(2)管理事务

  • 开启事务  void 类型 setAutoCommit( boolean autoCommit)

                             将此连接的自动提交模式设置为给定状态,false 即开启事务

  • 提交事务   void 类型          commit();事务
  • 回滚事务   void 类型  rollback()撤销当前事务中的所有更改,并释放connection对象当前持有的任何数据库锁。


  • 4 定义sql



  • 5 获取执行sql语句的对象 statement

Statement对象,是sql包下的用于执行静态sql语句(也就是给定值)并返回其生成的结果的对象。执行的方法常见的有:

boolean execute(String sql)执行给定的SQL语句,这可能会返回多个结果,如果是

                                    true返回一个ResultSet对象,false是更新计数或没有结果。

int executeUpdate(String sql):执行DML(insert update delete),

                                                      DDL(Create,alter,drop)。

                                       执行给定的sql语句,这可能是insert ,update或delete语句,或者不返回任何内容,如sql ddl语句。返回的是影响执行的行数。

ResultSet excutequery(String sql):执行DQL(select)语句



6 执行sql,接收返回结果
  • 7 处理结果
  • 8 释放资源(类似于流结束需要释放)
  1 package cn.itcast.demo01.demo01.demo03;
  2 
  3 import java.sql.Connection;
  4 import java.sql.Driver;
  5 import java.sql.DriverManager;
  6 import java.sql.Statement;
  7 
  8 public class JdbcDemo01 {
  9     public static void main(String[] args) throws Exception {
 10         //导入驱动jar包
 11         //注册驱动
 12         Class.forName("com.mysql.jdbc.Driver");
 13         //获取数据库连接对象 connection
 14         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
 15         //  定义sql语句
 16         String sql = "update emp set salary = 7500 where id = 1001;";
 17         // 获取执行sql的对象,statement
 18         Statement stmt = conn.createStatement();
 19         //执行sql
 20         int count = stmt.executeUpdate(sql);// 返回的是影响的行数
 21         // 处理结果
 22         System.out.println(count);
 23         //释放资源
 24         stmt.close();
 25         conn.close();
 26     }
 27 }

2.JDBC的各个类

技术图片


  1 package cn.itcast.demo01.demo01.demo03;
  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             Class.forName("com.mysql.jdbc.Driver");
 14             //定义sql
 15             String sql = "insert into account values (null,‘王五‘,3500)";
 16             // 获取Connection对象
 17             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
 18 
 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 
 27             }else{
 28                 System.out.println("执行失败");
 29             }
 30         } catch (ClassNotFoundException | SQLException e) {
 31             e.printStackTrace();
 32         } finally {
 33             if(stmt != null){
 34                 try {
 35                     stmt.close();
 36                 } catch (SQLException e) {
 37                     e.printStackTrace();
 38                 }
 39             }
 40             if(conn != null){
 41                 try {
 42                     stmt.close();
 43                 } catch (SQLException e) {
 44                     e.printStackTrace();
 45                 }
 46             }
 47         }
 48     }
 49 }
 50 

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

  • next();方法 游标向下移动一行,默认指向表头;
  • getXxx(参数);一次获取一行某一列的数据,

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

     参数 int 代表列的变化,从1开始,如getString(1);

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

  1 package cn.itcast.demo01.demo01.demo03;
  2 
  3 import java.sql.*;
  4 
  5 public class JdbcDemo02 {
  6     public static void main(String[] args) {
  7         Statement stmt = null;
  8         Connection conn = null;
  9         ResultSet rs = null;
 10         try {// 注册驱动
 11             Class.forName("com.mysql.jdbc.Driver");
 12             //定义sql
 13             String sql = "select * from account";
 14             // 获取Connection对象
 15             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
 16 
 17             // 获取执行sql的对象 Statement
 18             stmt = conn.createStatement();
 19             // 执行sql
 20             rs = stmt.executeQuery(sql);// 获取结果集
 21             rs.next();
 22             int id = rs.getInt(1);
 23             String name = rs.getString("name");
 24             double balance = rs.getDouble(3);
 25             System.out.println(name+balance);
 26 
 27 
 28         } catch (ClassNotFoundException | SQLException e) {
 29             e.printStackTrace();
 30         } finally {
 31             if(rs != null){
 32                 try {
 33                     stmt.close();
 34                 } catch (SQLException e) {
 35                     e.printStackTrace();
 36                 }
 37             }
 38             if(stmt != null){
 39                 try {
 40                     stmt.close();
 41                 } catch (SQLException e) {
 42                     e.printStackTrace();
 43                 }
 44             }
 45             if(conn != null){
 46                 try {
 47                     stmt.close();
 48                 } catch (SQLException e) {
 49                     e.printStackTrace();
 50                 }
 51             }
 52         }
 53     }
 54 }
 55 

        使用ResultSet正确用法: 游标向下移动一行,判断有无数据,再行获取数据,可使用boolean next();方法含义:判断当前行是否是最后一行结尾,如果是,则返回false,如果不是则返回true;或者使用while(rs.next()){}

练习:查询emp表的数据,将其封装为对象。然后装载集合,返回emp表包含对象。类似于将某一行作为一个对象,因为每一行都有变量名和类型。用集合将对象装载。

  • 首先  定义Emp类
  • 其次  定义方法 public List<Emp> findAll(){}
  • 最后  实现方法  select *from emp;
  1 package cn.itcast.demo01.demo01.demo03;
  2 
  3 import cn.itcast.demo01.demo01.demo04;
  4 
  5 import java.sql.*;
  6 import java.util.ArrayList;
  7 import java.util.List;
  8 
  9 public class JdbcDemo04 {
 10     /*
 11 查询所有emp对校
 12  */
 13     public static void main(String[] args) {
 14         List<demo04> list = new JdbcDemo04().findAll();
 15         System.out.println(list);
 16     }
 17     public List<demo04> findAll(){
 18         ResultSet rs = null;
 19         Statement stmt = null;
 20         Connection conn = null;
 21         List<demo04> list = null;
 22         try {
 23             Class.forName("com.mysql.jdbc.Driver");
 24             // 获取连接
 25             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
 26             //  定义sql
 27             String sql = "select * from emp";
 28             // 获取执行sql 的对校
 29             stmt = conn.createStatement();
 30             // 执行sql
 31             rs = stmt.executeQuery(sql);
 32             demo04 emp = null;// 先创建一个对象
 33             list = new ArrayList<demo04>();
 34             while ( rs.next()){
 35                 int id = rs.getInt("id");
 36                 String ename = rs.getString("ename");
 37                 int job_id = rs.getInt("job_id");
 38                 int mgr = rs.getInt("mgr");
 39                 Date joindate = rs.getDate("joindate");
 40                 double salary = rs.getDouble("salary");
 41                 double bonus = rs.getDouble("bonus");
 42                 int dept_id = rs.getInt("dept_id");
 43                 emp = new demo04();// 创建emp对象,并赋值
 44                 emp.setId(id);
 45                 emp.setEname(ename);
 46                 emp.setJob_id(job_id);
 47                 emp.setMgr(mgr);
 48                 emp.setJoindate(joindate);
 49                 emp.setSalary(salary);
 50                 emp.setBonus(bonus);
 51                 emp.setDept_id(dept_id);
 52                 list.add(emp);
 53             }
 54         } catch (ClassNotFoundException e) {
 55             e.printStackTrace();
 56         } catch (SQLException e) {
 57             e.printStackTrace();
 58         }finally {
 59             if (rs != null){
 60                 try {
 61                     rs.close();
 62                 } catch (SQLException e) {
 63                     e.printStackTrace();
 64                 }
 65             }
 66             if (stmt != null){
 67                 try {
 68                     rs.close();
 69                 } catch (SQLException e) {
 70                     e.printStackTrace();
 71                 }
 72             }
 73             if (conn != null){
 74                 try {
 75                     rs.close();
 76                 } catch (SQLException e) {
 77                     e.printStackTrace();
 78                 }
 79             }
 80 
 81         }
 82         return  list;
 83 
 84 
 85     }
 86 }
 87 

上图中,注册驱动和释放资源代码重复性较高,因此有必要抽取JDBC工具类

即可:JDBCUtils 


JAVA11-JDBC学习

标签:oid   端口   字符串   throws   manager   gis   目的   发送   撤销   

原文地址:https://www.cnblogs.com/rango0550/p/12731363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!