先挂出大佬的传送门:http://www.cnblogs.com/erbing/p/5805727.html
-
基本的步骤
- 加载驱动程序
- 建立连接
- 创建语句
- 执行语句
- 处理结果集
- 关闭连接
工欲善其事,必先利其器。
首先你要有一个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)得到结果集中的数据
写完睡觉。。。