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)得到结果集中的数据

写完睡觉。。。

原文地址:https://www.cnblogs.com/zuosy/p/7567667.html