zoukankan      html  css  js  c++  java
  • jdbc操作

    jdbc技术

    使用java代码(程序)发送sql语句的技术。

    jdbc接口核心API

    jdbc相关结构在java.sql.*和javax.sql.*包下。

    |- Driver接口: 表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。
      |- connect(url, properties):  连接数据库的方法。
          url: 连接数据库的URL 
               URL语法: jdbc协议:数据库子协议://主机:端口/数据库
               user: 数据库的用户名
               password: 数据库用户密码
        |- DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序
            |-registerDriver(driver)  : 注册驱动类对象
            |-Connection getConnection(url,user,password);  获取连接对象
    
        |- Connection接口: 表示java程序和数据库的连接对象。
             |- Statement createStatement() : 创建Statement对象
             |- PreparedStatement prepareStatement(String sql)  创建PreparedStatement对象
             |- CallableStatement prepareCall(String sql) 创建CallableStatement对象
    
         |- Statement接口: 用于执行静态的sql语句
             |- int executeUpdate(String sql)  : 执行静态的更新sql语句(DDL,DML)
             |- ResultSet executeQuery(String sql)  :执行的静态的查询sql语句(DQL)
    
         |-PreparedStatement接口:用于执行预编译sql语句
             |- int executeUpdate() : 执行预编译的更新sql语句(DDL,DML)
             |-ResultSet executeQuery()  : 执行预编译的查询sql语句(DQL)
    
         |-CallableStatement接口:用于执行存储过程的sql语句(call xxx)
             |-ResultSet executeQuery()  : 调用存储过程的方法
    

       |- ResultSet接口:用于封装查询出来的数据 |- boolean next() : 将光标移动到下一行 |-getXX() : 获取列的值

    获取数据库连接的方法

    常用连接数据

    1 private String url = "jdbc:mysql://localhost:3306/day17";
    2                         // jdbc协议:数据库子协议:主机:端口/连接的数据库   //
    3 
    4 private String user = "root"; //用户名
    5 private String password = "root"; //密码

    第一种方法:

     1 //1.创建驱动程序类对象
     2 Driver driver = new com.mysql.jdbc.Driver(); 
     3 
     4 //设置用户名和密码
     5 Properties props = new Properties();
     6 props.setProperty("user", user);
     7 props.setProperty("password", password);
     8 
     9 //2.连接数据库,返回连接对象
    10 Connection conn = driver.connect(url, props);

    第二种方法:使用驱动管理器类连接数据库(这里注册了两次,没必要)

    Driver driver = new com.mysql.jdbc.Driver();
    
    /1.注册驱动程序(可以注册多个驱动程序)
    DriverManager.registerDriver(driver);
            
    //2.连接到具体的数据库
    Connection conn = DriverManager.getConnection(url, user, password);

    第三种方法:使用加载驱动类来注册驱动程序,推荐使用

    1 //通过得到字节码对象的方式加载静态代码块,从而注册驱动程序
    2 Class.forName("com.mysql.jdbc.Driver");
    3 //2.连接到具体的数据库
    4 Connection conn = DriverManager.getConnection(url, user, password);

    jdbcUtils写法:

     1 import java.io.InputStream;
     2 import java.sql.Connection;
     3 import java.sql.DriverManager;
     4 import java.sql.ResultSet;
     5 import java.sql.SQLException;
     6 import java.sql.Statement;
     7 import java.util.Properties;
     8 
     9 public class JdbcUtils {
    10     
    11     private static String url = null;
    12     private static String user = null;
    13     private static String password = null;
    14     private static String classDriver = null;
    15     static{
    16         //读取系统中的配置文件
    17         InputStream in = JdbcUtils.class.getResourceAsStream("/db.properties");
    18         Properties property = new Properties();
    19         try {
    20             property.load(in);
    21             url = property.getProperty("url");
    22             user = property.getProperty("user");
    23             password = property.getProperty("password");
    24             classDriver = property.getProperty("classDriver");
    25             //加载类文件        
    26             Class.forName(classDriver);    
    27         } catch (Exception e) {
    28             e.printStackTrace();
    29             throw new RuntimeException(e);
    30         }
    31     }
    32     public static Connection getConnection(){
    33         try {
    34             //返回连接对象
    35             return DriverManager.getConnection(url, user, password);
    36         } catch (Exception e) {
    37             e.printStackTrace();
    38             throw new RuntimeException(e);
    39         }
    40     }
    41     
    42     public static void closeAll(Connection conn,Statement stmt,ResultSet rs){
    43         try {
    44             if(rs != null){
    45                 rs.close();
    46                 rs = null;
    47             }
    48             if(stmt != null){
    49                 stmt.close();
    50                 stmt = null;
    51             }
    52             if(conn != null && !conn.isClosed()){
    53                 conn.close();
    54                 conn = null;
    55             }
    56         } catch (SQLException e) {
    57             e.printStackTrace();
    58         }
    59     }
    60 }

    statement执行静态SQL

    1、执行DDL语句

     1 public void test1(){
     2         Statement stmt = null;
     3         Connection conn = null;
     4         try {
     5             //1.驱动注册程序
     6             Class.forName("com.mysql.jdbc.Driver");
     7             
     8             //2.获取连接对象
     9             conn = DriverManager.getConnection(url, user, password);
    10             
    11             //3.创建Statement
    12             stmt = conn.createStatement();
    13             
    14             //4.准备sql
    15             String sql = "CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),gender VARCHAR(2))";
    16             
    17             //5.发送sql语句,执行sql语句,得到返回结果
    18             int count = stmt.executeUpdate(sql);
    19             
    20             //6.输出
    21             System.out.println("影响了"+count+"行!");
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24             throw new RuntimeException(e);
    25         } finally{
    26             //7.关闭连接(顺序:后打开的先关闭)
    27             if(stmt!=null)
    28                 try {
    29                     stmt.close();
    30                 } catch (SQLException e) {
    31                     e.printStackTrace();
    32                     throw new RuntimeException(e);
    33                 }
    34             if(conn!=null)
    35                 try {
    36                     conn.close();
    37                 } catch (SQLException e) {
    38                     e.printStackTrace();
    39                     throw new RuntimeException(e);
    40                 }
    41         }        
    42     }
    View Code

    2、执行DML语句

      1         private String url = "jdbc:mysql://localhost:3306/day17";
      2     private String user = "root";
      3     private String password = "root";
      4 
      5     /**
      6      * 增加
      7      */
      8     @Test
      9     public void testInsert(){
     10         Connection conn = null;
     11         Statement stmt = null;
     12         try {
     13             //通过工具类获取连接对象
     14             conn = JdbcUtil.getConnection();
     15             
     16             //3.创建Statement对象
     17             stmt = conn.createStatement();
     18             
     19             //4.sql语句
     20             String sql = "INSERT INTO student(NAME,gender) VALUES('李四','女')";
     21             
     22             //5.执行sql
     23             int count = stmt.executeUpdate(sql);
     24             
     25             System.out.println("影响了"+count+"行");
     26             
     27         } catch (Exception e) {
     28             e.printStackTrace();
     29             throw new RuntimeException(e);
     30         } finally{
     31             //关闭资源
     32             JdbcUtil.close(conn, stmt);
     33         }
     34     }
     35     
     36     /**
     37      * 修改
     38      */
     39     @Test
     40     public void testUpdate(){
     41         Connection conn = null;
     42         Statement stmt = null;
     43         //模拟用户输入
     44         String name = "陈六";
     45         int id = 3;
     46         try {
     47             /*//1.注册驱动
     48             Class.forName("com.mysql.jdbc.Driver");
     49             
     50             //2.获取连接对象
     51             conn = DriverManager.getConnection(url, user, password);*/
     52             //通过工具类获取连接对象
     53             conn = JdbcUtil.getConnection();
     54             
     55             //3.创建Statement对象
     56             stmt = conn.createStatement();
     57             
     58             //4.sql语句
     59             String sql = "UPDATE student SET NAME='"+name+"' WHERE id="+id+"";
     60             
     61             System.out.println(sql);
     62             
     63             //5.执行sql
     64             int count = stmt.executeUpdate(sql);
     65             
     66             System.out.println("影响了"+count+"行");
     67             
     68         } catch (Exception e) {
     69             e.printStackTrace();
     70             throw new RuntimeException(e);
     71         } finally{
     72             //关闭资源
     73             JdbcUtil.close(conn, stmt);
     74         }
     75     }
     76     
     77     /**
     78      * 删除
     79      */
     80     @Test
     81     public void testDelete(){
     82         Connection conn = null;
     83         Statement stmt = null;
     84         //模拟用户输入
     85         int id = 3;
     86         try {
     87             /*//1.注册驱动
     88             Class.forName("com.mysql.jdbc.Driver");
     89             
     90             //2.获取连接对象
     91             conn = DriverManager.getConnection(url, user, password);*/
     92             //通过工具类获取连接对象
     93             conn = JdbcUtil.getConnection();
     94             
     95             //3.创建Statement对象
     96             stmt = conn.createStatement();
     97             
     98             //4.sql语句
     99             String sql = "DELETE FROM student WHERE id="+id+"";
    100             
    101             System.out.println(sql);
    102             
    103             //5.执行sql
    104             int count = stmt.executeUpdate(sql);
    105             
    106             System.out.println("影响了"+count+"行");
    107             
    108         } catch (Exception e) {
    109             e.printStackTrace();
    110             throw new RuntimeException(e);
    111         } finally{
    112             //关闭资源
    113             JdbcUtil.close(conn, stmt);
    114         }
    115     }    
    View Code

    3、执行DQL语句

     1 public void test1(){
     2         Connection conn = null;
     3         Statement stmt = null;
     4         try{
     5             //获取连接
     6             conn = JdbcUtil.getConnection();
     7             //创建Statement
     8             stmt = conn.createStatement();
     9             //准备sql
    10             String sql = "SELECT * FROM student";
    11             //执行sql
    12             ResultSet rs = stmt.executeQuery(sql);
    13             //遍历结果
    14             while(rs.next()){
    15                 int id = rs.getInt("id");
    16                 String name = rs.getString("name");
    17                 String gender = rs.getString("gender");
    18                 System.out.println(id+","+name+","+gender);
    19             }
    20             
    21         }catch(Exception e){
    22             e.printStackTrace();
    23             throw new RuntimeException(e);
    24         }finally{
    25             JdbcUtil.close(conn, stmt);
    26         }
    27     }
    View Code

    PreparedStatement执行动态SQL,可以有效防止sql注入

     1 public void testByPreparedStatement(){
     2         Connection conn = null;
     3         PreparedStatement stmt = null;
     4         ResultSet rs = null;
     5         try {
     6             //获取连接
     7             conn = JdbcUtil.getConnection();
     8             
     9             String sql = "SELECT * FROM users WHERE NAME=? AND PASSWORD=?";
    10             
    11             //预编译
    12             stmt = conn.prepareStatement(sql);
    13             
    14             //设置参数
    15             stmt.setString(1, name);
    16             stmt.setString(2, password);
    17             
    18             //执行sql
    19             rs = stmt.executeQuery();
    20             
    21             if(rs.next()){
    22                 //登录成功
    23                 System.out.println("登录成功");
    24             }else{
    25                 System.out.println("登录失败");
    26             }
    27             
    28         } catch (Exception e) {
    29             e.printStackTrace();
    30             throw new RuntimeException(e);
    31         } finally {
    32             JdbcUtil.close(conn, stmt ,rs);
    33         }
    34         
    35     }
    View Code

     元数据

    元数据分为三种:

    1、数据库元数据(连接元数据)、参数元数据、结果集元数据。

    数据库元数据

    public void testDB() throws Exception {
            // 获取连接
            Connection conn = JdbcUtil.getConnection();
            // 获取数据库元数据
            DatabaseMetaData metaData = conn.getMetaData();
            System.out.println(metaData.getUserName());
            System.out.println(metaData.getURL());
            System.out.println(metaData.getDatabaseProductName());
        }

    参数元数据

    public void testParams() throws Exception {
            // 获取连接
            Connection conn = JdbcUtil.getConnection();
            // SQL
            String sql = "select * from dept where deptid=? and deptName=?";
            // Object[] values = {"tom","888"};
            
            PreparedStatement pstmt = conn.prepareStatement(sql);
            // 参数元数据
            ParameterMetaData p_metaDate = pstmt.getParameterMetaData();
            // 获取参数的个数
            int count = p_metaDate.getParameterCount();
            
            
            // 测试
            System.out.println(count);
        }

    结果集元数据

    public void testRs() throws Exception {
            String sql = "select * from dept ";
            
            // 获取连接
            Connection conn = JdbcUtil.getConnection();
            PreparedStatement pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();
            // 得到结果集元数据(目标:通过结果集元数据,得到列的名称)
            ResultSetMetaData rs_metaData = rs.getMetaData();
            
            // 迭代每一行结果
            while (rs.next()) {
                // 1. 获取列的个数
                int count = rs_metaData.getColumnCount();
                // 2. 遍历,获取每一列的列的名称
                for (int i=0; i<count; i++) {
                    // 得到列的名称
                    String columnName = rs_metaData.getColumnName(i + 1);
                    // 获取每一行的每一列的值
                    Object columnValue = rs.getObject(columnName);
                    // 测试
                    System.out.print(columnName + "=" + columnValue + ",");
                }
                System.out.println();
            }
            
        }
  • 相关阅读:
    《汇编语言》- 来自底层的较量
    《深入理解java虚拟机》
    《深入理解java虚拟机》
    PHP进阶,使用交互模式进行快速测试实验?
    为什么要拒绝使用大事务进行处理任务?
    一份从0到1的java项目实践清单
    怎样在mybatis里向mysql中插入毫秒数的时间?
    mysql技能提升篇
    如何快速成长?我的java之路!
    微软职位内部推荐-Senior Development Engineer
  • 原文地址:https://www.cnblogs.com/nicker/p/6813823.html
Copyright © 2011-2022 走看看