zoukankan      html  css  js  c++  java
  • Java——JDBC鶸笔记

     先挂出大佬的传送门:http://www.cnblogs.com/erbing/p/5805727.html

    • 基本的步骤

    1. 加载驱动程序
    2. 建立连接
    3. 创建语句
    4. 执行语句
    5. 处理结果集
    6. 关闭连接

    工欲善其事,必先利其器。

    首先你要有一个jdbc的jar包,我用的是mysql。这个jar包直接到官网上下载就好了

    传送门:https://dev.mysql.com/downloads/connector/j/3.1.html

    打开就可以看到jar包

    jar包下载好了,我们就可以正式写代码了。


    第一步:加载驱动

    1 Class.forName("com.mysql.jdbc.Driver");

    其他数据库的驱动就百度吧

    第二步:建立连接

    1 Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);

    这三个参数分别是数据库的URL, 数据库的用户,密码

    mysql的URL通常这样写:jdbc:mysql://hostname/dbname

    其实驱动、URL、USER、PASSWORD可以写成常量形式

        public static final String DRIVER = "com.mysql.jdbc.Driver";
        public static final String URL = "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8";
        public static final String USER = "root";
        public static final String PASSWORD = "12345";

     至于为什么我的URL写的那么长,防止中文乱码。百度了一波都是这么写的。

    第三步 :创建语句

    一开始我就在想,我都已经连接上数据库了。我直接写SQL语句不行吗?后来我有点想明白了。这个建立连接就像一根网线一样,连接你的电脑和数据库。但是吧,电脑和数据库之间交流需要用都能听得懂的协议(语言)才行。(就行浏览器和服务器之间用http协议交流一样)这个创建语句,就是让电脑和数据库达成某种共识,来探讨人生。

    1 Statement statement = connection.createStatement();

    第四步 : 执行语句

    执行的语句放到哪里?结果集啊

    ResultSet resultSet = statement.executeQuery("SELECT * FROM student");

    如果是增删改的操作就用 

    statement.executeUpdate(sql);

    第五步 : 处理结果集

    查询得到的结果是放到结果集里面的。

    有一个resultSet.next()方法,这个方法在最开始的时候指向的是null第一条数据的前一行。执行一次next指针就会指向下一条数据。

    resultSet.get... 有很多方法获得数据。如:getString(1),getString("subject"),getShort(1),getInt(1);

    while (resultSet.next()) {
                System.out.println(resultSet.getString("id") + "	" + resultSet.getString("subject") + "	"
                        + resultSet.getString("score"));
            }

    第六步 : 关闭连接

    最后该干啥里心里能没点B数吗???

    标准的写法我就不写了,写点简单的写法吧。

                resultSet.close();
                statement.close();
                connection.close();    

    反正是和创建的顺序反着关闭的。

    把完整的代码贴一下:

    public class SimpleJDBC {
    
        public static void main(String[] args) throws SQLException, ClassNotFoundException {
    
            // 1.加载驱动程序
            Class.forName(JDBCUtil.DRIVER);
            System.out.println("Driver loaded");
            // 2.建立连接
            Connection connection = DriverManager.getConnection(JDBCUtil.URL, JDBCUtil.USER, JDBCUtil.PASSWORD);
            System.out.println("Database connected");
            // 3.创建语句
            Statement statement = connection.createStatement();
            // 4.执行语句
            ResultSet resultSet = statement.executeQuery("SELECT * FROM student");
            // 5.处理ResultSet
            while (resultSet.next()) {
                System.out.println(resultSet.getString("id") + "	" + resultSet.getString("subject") + "	"
                        + resultSet.getString("score"));
            }
            // 6.你猜这是啥
            connection.close();
        }
    }

    运行结果  :


    前面的Statement一般是创建的静态的SQL语句。但是,一般在生产生活中,用得到的都是动态的SQL,涉及到用户输入的一些信息。就要用到 PreparedStatement这个对象了。虽然没找到这个对象正经的中文名字,暂且就叫他预编译处理语句吧。

    一般写成下面的形式:

    1     String sql = "INSERT INTO student(id, number, subject, score) VALUES (?, ?, ?, ?)";
    2     PreparedStatement preparedStatement = connection.prepareStatement(sql);

    里面的问号?是占位符。占位符的序号是从1开始的。用下面的语句来设置占位符:

    1     preparedStatement.setInt(1, 8);
    2     preparedStatement.setInt(2, 2);
    3     preparedStatement.setString(3, "English");
    4     preparedStatement.setInt(4, 89);

    我写的其实还是静态的。但,这已经写的不是静态的语句了。

    再简单的把存储过程写一写(纯属娱乐)

    由于我的mysql语句是在DOS界面写的。所以要改一下执行符号。

    Mysql的执行符号默认的是分号";"

    DELIMITER   [dɪ'lɪmɪtə] 分隔符,定界符。

    但是记得用完之后怕以后完了 要改回来

    存储过程学习传送门:http://www.cnblogs.com/mark-chan/p/5384139.html

    教程我看的也不是很明白,但现在主要是要目的是用JDBC写一个存储过程才行。

     

    要先写一个存储过程。

    这个存储过程应该是能用的。

    然后就会用到CallableStatement这个对象 它是PreparedStatement的子类

    而PreparedStatement又是Statement的子类。

    所以有些方法都是互通的。

     1         //1.加载驱动
     2         Class.forName(DRIVER);
     3         //2.连接数据库
     4         Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
     5         //3.创建CallableStatement
     6         String sql = "call test(?)";
     7         CallableStatement callableStatement = connection.prepareCall(sql);
     8         callableStatement.setInt(1, 2); //PreparedStatement
     9         //4.获取ResultSet
    10         ResultSet resultSet = callableStatement.executeQuery();
    11         while(resultSet.next()) {
    12             System.out.println(resultSet.getString(1) + "	" + 
    13                     resultSet.getString(2) + "	" + resultSet.getString(3) + "	"
    14                     + resultSet.getString(4));
    15         }
    16         //close
    17         resultSet.close();
    18         callableStatement.close();
    19         connection.close();

    没毛病。

    callableStatement.setter将只传给IN和IN OUT参数

    registerOutParameter(parameterIndex, sqlType)来注册OUT和 IN OUT的参数

    再写一个函数的。

    函数写的也是可以用的。

     1         //1.加载驱动
     2         Class.forName(DRIVER);
     3         //2.建立连接
     4         Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
     5         //3.创建CallableStatement
     6         String sql = "{? = call myfun(?)}";
     7         CallableStatement callableStatement = connection.prepareCall(sql);
     8         callableStatement.setInt(2, 3);
     9         callableStatement.registerOutParameter(1, Types.INTEGER);
    10         callableStatement.executeUpdate();
    11         //same as 
    12         //callableStatement.execute();
    13         
    14         //4.result
    15         int result = callableStatement.getInt(1);
    16         System.out.println(result);
    17         //5.close
    18         callableStatement.close();
    19         connection.close();

     

    运行结果没毛病。

    存储过程和函数写的就很简单了,因为以后可能用的很少。

    获取元数据

    什么是元数据: https://baike.baidu.com/item/元数据/1946090?fr=aladdin

    简单的说就是数据库的一些属性。

    可以使用DatabaseMetaDat接口来获取数据库的元数据,还提供ResultSetMetaData接口获取特定的ResultSet信息。

    代码如下:

     1         //1.Load the JDBC driver
     2         Class.forName(DRIVER);
     3         //2.Connect to a database
     4         Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
     5         //3.Get the metadata
     6         DatabaseMetaData dbMetaData = connection.getMetaData();
     7         
     8         System.out.println("database URL: " + dbMetaData.getURL());
     9         System.out.println("database username: " + dbMetaData.getUserName());
    10         System.out.println("database product name: " + dbMetaData.getDatabaseProductName());
    11         System.out.println("database product version: " + dbMetaData.getDatabaseProductVersion());
    12         System.out.println("JDBC driver name: " + dbMetaData.getDriverName());
    13         System.out.println("JDBC driver version: " + dbMetaData.getDriverVersion());
    14         System.out.println("JDBC driver major version: " + dbMetaData.getDriverMajorVersion());
    15         System.out.println("JDBC driver minor version: " + dbMetaData.getDriverMinorVersion());
    16         System.out.println("Max number of connections: " + dbMetaData.getMaxConnections());
    17         System.out.println("Max Table Name Length: " + dbMetaData.getMaxTableNameLength());
    18         System.out.println("Max Columns In Table: " + dbMetaData.getMaxColumnsInTable());
    19         
    20         //Close the connection
    21         connection.close();

    运行结果:

    使用getTables方法通过数据库元数据可以确定数据库中的表格。

     1         //Load the JDBC driver
     2         Class.forName(DRIVER);
     3         //Get the connection
     4         Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
     5         //get the matedata
     6         DatabaseMetaData dbMetaData = connection.getMetaData();
     7         //get the Table
     8         ResultSet rsTables = dbMetaData.getTables(null, null, null, new String[]{"TABLE"});
     9         System.out.println("User tables: ");
    10         while(rsTables.next()) {
    11             System.out.println(rsTables.getString("TABLE_NAME") + "");
    12         }
    13         //close the connection
    14         connection.close();

    这根我用SQL语句:show tables;  显示的结果是一样的

    最后在写一个结果集数据元的例子:

     1         //Load the JDBC driver
     2         Class.forName(DRIVER);
     3         //Connect to a database
     4         Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
     5         //Create a statement
     6         Statement statement = connection.createStatement();
     7         //Execute a statement
     8         ResultSet rs = statement.executeQuery("SELECT * FROM student");
     9         ResultSetMetaData rsMetaData = rs.getMetaData();
    10         for(int i = 1; i <= rsMetaData.getColumnCount(); i++) {
    11             System.out.printf("%-12s	", rsMetaData.getColumnName(i));
    12         }
    13         System.out.println();
    14         
    15         //Iterate
    16         while(rs.next()) {
    17             for(int i = 1; i <= rsMetaData.getColumnCount(); i++) {
    18                 System.out.printf("%-12s	", rs.getObject(i));
    19             }
    20             System.out.println();
    21         }
    22         //Close the connection
    23         connection.close();

    运行结果如下:

    结果集数据元ResultSetMetaData用于描述结果集ResultSet的信息

    ResultSetMetaData rsMetaData = resultSet.getMeatData();

    rsMetaData.getColumnCount();获得结果列的数目

    getColumnName(i);获得列的名字

    我还学会了用resultSet.getObject(i)得到结果集中的数据

    写完睡觉。。。

  • 相关阅读:
    模拟赛T5 : domino ——深搜+剪枝+位运算优化
    校内模拟赛T5:连续的“包含”子串长度( nekameleoni?) —— 线段树单点修改,区间查询 + 尺取法合并
    C++[Tarjan求点双连通分量,割点][HNOI2012]矿场搭建
    C++二分图匹配基础:zoj1002 FireNet 火力网
    迭代加深搜索 C++解题报告 :[SCOI2005]骑士精神
    Linux 常用命令
    Microservices and exception handling in Java with Feign and reflection
    微服务摘要
    Javac编译与JIT编译
    GC调优思路
  • 原文地址:https://www.cnblogs.com/zuosy/p/7567667.html
Copyright © 2011-2022 走看看