小菜鸟之java JDBC编程
JDBC技术
百度简介 : JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。 JDBC并不能直接访问数据库,需要借助于数据库厂商提供的JDBC驱动程序。
JDBC中常用的类和接口可用于我们编程开发,利用这些类和接口可以方便的经行数据访问和处理。这些类和接口都位于java.sal包中。具体的下面一一揭晓~~
废话一堆后,其实这些废话都可以去百度找到的有木有发现百度很强大,很犀利,很友好,很无敌啊~~~~扯远了。。。。下面开始JDBC的旅途.
数据库连接
如果要在Java访问数据库,首先要加载一个数据库驱动,数据库驱动只需要在第一次访问时加载一次。然后再每次访问数据库时创建一个Connection实例,获取数据库连接,这样就可以执行操作数据库的SQL语句。最后用完后释放掉数据库的连接。
数据库驱动类
不同的数据库实现JDBC接口不同,所以就产生了不同的数据库驱动包。驱动包就包含一些负责数据库连接的类,把我们要操作的SQL语句传递到里面去。因为我上班的PC用的是SQL2012,所以我们要去这里http://www.microsoft.com/zh-cn/search/DownloadResults.aspx?q=jdbc下载下面的驱动:
可能会有人说为什么下这个呢怎么不是下面的3.0或者2.0的驱动呢!因为我的SQL版本是2012的所以下载这个,如果你是2008或者2005的话你就可以下载下面的3.0驱动包!说这么多在不明白就点进去看下:
看明白就去下载适合自己SQL版本的驱动吧!
加载数据库驱动类
Java加载数据库驱动的方法是调用Class类的静态方法forName().写法如下:
1
Class.forName(String driveManager);
forName()方法的参数用于指定要加载的数据库驱动。加载成功,将会加载驱动类注册给DriveManager.失败的话抛出ClassNotFoundExecption异常。
在扯一点没必要的闲话:为了把程序的出错性尽量的排斥掉,我可不希望我第一次用Java的JDBC就出一堆的错误,然后对在学者去用工具然后跳错。因为操作的是我PC本地的SQL12数据库,我准备一切都用默认(端口)的东西试试先。所以我们要开始就启动我们SQL网络配置协议TCP/IP设置为启动,当然已经启动的话就没必要在此去启动啦!
连接SQL2012数据库
把我们刚才下的驱动加载到 MyEclipse中来,如下:
好萌的东西,像个牛奶瓶o(^▽^)o。
下面开始我们SQL2012的数据连接操作:
1 10 11 12 package myJava.jdbc; 13 14 import java.sql.*; 15 16 public class SelectQuery { 17 18 Connection conn; 19 20 //创建一个返回值为Connection的方法 21 22 public Connection getConnection(){ 23 24 try { 25 26 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 27 28 System.out.println("数据库驱动加载成功"); 29 30 conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=DB_ShowData","sa","123456"); 31 32 if(conn!=null){ 33 34 System.out.println("数据库连接成功"); 35 36 } 37 38 } catch (Exception e) { 39 40 // TODO Auto-generated catch block 41 42 e.printStackTrace(); 43 44 } 45 46 //返回Connection对象 47 48 return conn; 49 50 } 51 52 /** 53 54 * @param args 55 56 */ 57 58 public static void main(String[] args) { 59 60 // TODO Auto-generated method stub 61 62 SelectQuery getcon = new SelectQuery(); 63 64 getcon.getConnection(); 65 66 67 68 } 69 70 } 71
运行结果如下:
看到这个应该算是一路顺风吧!没出什么异常,然后我们趁热打铁连接成功啦查询一下有何不可,我搞一个很简单的查询具体代码如下:
1 package myJava.jdbc; 2 3 import java.sql.*; 4 5 public class SelectQuery { 6 7 Connection conn; 8 9 //创建一个返回值为Connection的方法 10 11 public Connection getConnection(){ 12 13 try { 14 15 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 16 17 System.out.println("数据库驱动加载成功"); 18 19 conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=DB_ShowData","sa","123456"); 20 21 if(conn!=null){ 22 23 System.out.println("数据库连接成功"); 24 25 } 26 27 } catch (Exception e) { 28 29 // TODO Auto-generated catch block 30 31 e.printStackTrace(); 32 33 } 34 35 //返回Connection对象 36 37 return conn; 38 39 } 40 41 /** 42 43 * @param args 44 45 */ 46 47 public static void main(String[] args) { 48 49 // TODO Auto-generated method stub 50 51 SelectQuery getcon = new SelectQuery(); 52 53 getcon.getConnection(); 54 55 //查询 56 57 String sql = "SELECT * FROM [dbo].[User]"; 58 59 try { 60 61 PreparedStatement Ps = getcon.conn.prepareStatement(sql); 62 63 ResultSet Rs = Ps.executeQuery(); 64 65 while(Rs.next()){ 66 67 String name = Rs.getString("Name"); 68 69 String password = Rs.getString("Password"); 70 71 System.out.println(name); 72 73 System.out.println(password); 74 75 } 76 77 Rs.close(); 78 79 Ps.close(); 80 81 } catch (SQLException e) { 82 83 // TODO Auto-generated catch block 84 85 e.printStackTrace(); 86 87 } 88 89 90 91 } 92 93 } 94
运行结果如下:
结果出来啦o(^▽^)o不是重点,重点是这个查询里面我们都用到了JDBC技术中的那些类和接口,或许你看了上面的代码还是茫然我说的是和我一样入门的人,那么下面的解释后,你就懂得啦!
首先是我们在getConnection中用到的 DriverManager类
DriverManager类是用来管理数据库中所有的驱动程序,是JDBC的管理层,作用用户和驱动程序之间,并在数据库的驱动之间建立连接。DriverManager类中的方法都是静态方法,所以用的时候不需要实例化,直接调用类名就可以。
DriverManager类的常用方法如下:
方法
功能
getConnection(String url,String user,String password)
指定3个参数,连接数据库的url,数据库用户名,数据库密码
setLoginTimeout()
获取驱动程序试图登录到某一个数据库时可以等待的最长时间
printIn(String Message)
将一条消息打印到当前JDBC日志流中
其次我们看到就是Connection接口
Connection接口代表与特定的数据库的连接。要对数据表中的数据经行操作,首先要获取数据库连接。
Connection接口常用的方法如下:
方法
功能
createStatement()
创建Statement对象
createStatement(int resultSetType,int resultSetConcurrency)
创建一个Statement对象,该对象将生产具有给定类型,并发性和可保存性的ResultSet对象
prepareStatement()
创建预处理对象PreparedStatement
isReadOnly()
查看当前的Connection对象的读取模式是否为之读形式
setReadOnly()
设置当前Connection对象的读写模式i,默认是非只读模式
commit()
使所有上一次提交,回滚后进行的更改成为持久更改
roolback()
取消再当前事物中经行的所有更改,并释放此Connection对象当前持有的所有数据库锁
close()
立即释放Connection对象数据库和JDBC资源
PreparedStatement接口
PreparedStatement接口继承Statemetn接口,用于执行动态的SQL语句,通过PreparedStatement实例执行SQL语句,将被预编译并保存到PreparedStatement实例中,从而可以反复的执行SQL语句。可以通过Connection类的prepareStatement()方法获取PreparedStatement对象。PreparedStatement接口常用的方法:
<P>方法<BR>功能描述 <P>execute()<BR>在此PreparedStatement对象中执行SQL语句,该语句可以是任何类型的SQL语句 <P>executeQuery()<BR>在此PreparedStatement对象中SQL查询语句,返回结果为查询结果集ResultSet对象 <P>executeUpadte()<BR>在此PreparedStatement对象中执行SQL语句,该SQL语句必须是个INSET,UPDATE,DELETE语句,或者返回没有返回值的DDl语句 <P>setByte(int pIndex,byte bt)<BR>将参数pIndex位置上设置为给定的byte型参数值bt <P>setDouble(int pIndex,double dou)<BR>将参数pIndex位置上设置为给定的double型参数值dou <P>setInt(int pInde,int x)<BR>将参数pIndex位置上设置为给定的int型参数值x <P>setObject(int pIndex,Object o)<BR>将参数pIndex位置上设置为给定的Object型参数值o <P>setString(int pIndex,String str)<BR>将参数pIndex位置上设置为给定的String型参数值str</P>
ResultSet接口
ResultSet接口类似一张数据表,用来暂时存放数据库查询操作获得的结果集。ResultSet实例具有指向当前数据行的指定,指针开始的位置在查询的结果集第一条记录的前面。在获取查询结果集时,可通过next()方法将指针向下移动。如果存在下一行,还方法返回true,否则返回false.
方法
功能
getInt()
以intt形式获取ResultSet对象的当前行的指定值
getFloat()
以float形式获取ResultSet对象的当前行的指定值
getDate()
以Data形式获取ResultSet对象的当前行的指定值
getBoolean()
以boolean形式获取ResultSet对象的当前行的指定值
getString()
以String形式获取ResultSet对象的当前行的指定值
getObject()
以Object形式获取ResultSet对象的当前行的指定值
frist()
将指针移到当前记录的第一行
last()
将指针移到当前记录的最后一行
next()
将指针下移一行
beforeFirst()
将指针移到集合的开头
afterLast()
将指针移到集合的尾部
absolute(int index)
将指针一到ResultSet指定编号的行
inFist()
判断指针是否位于当前ResultSet集合的第一行
isLast()
判断指针是否位于当前ResultSet集合的最后一行
updateInt()
用指定的int值更新指定列
upadateFloat()
用指定的float值更新指定列
updateLong()
用指定的Long值更新指定列
updateString()
用String值更新指定列
updateObject()
用Object值更新指定列
updateNull()
将指定列的值改为NULL
updateDate()
用指定的Date值更新指定列
updateDouble()
用指定的double值更新指定列
getRow()
查看当前的索引号
insertRow()
将插入行的内容插入到数据库
updateRow()
将当前行的内容同步到数据库
deleteRow()
删除当前行,但不同步到数据库中,在执行close()方法后同步到数据库中
基本解释完了,有什么不具体或者不对的地方写到具体的地方可以去查下资料在看看,然后我们继续在写一个增加的方法:
1 2 package myJava.jdbc; 3 4 import java.sql.*; 5 6 public class SelectQuery { 7 8 Connection conn; 9 10 //创建一个返回值为Connection的方法 11 12 public Connection getConnection(){ 13 14 try { 15 16 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 17 18 System.out.println("数据库驱动加载成功"); 19 20 conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=DB_ShowData","sa","123456"); 21 22 if(conn!=null){ 23 24 System.out.println("数据库连接成功"); 25 26 } 27 28 } catch (Exception e) { 29 30 // TODO Auto-generated catch block 31 32 e.printStackTrace(); 33 34 } 35 36 //返回Connection对象 37 38 return conn; 39 40 } 41 42 /** 43 44 * @param args 45 46 */ 47 48 public static void main(String[] args) { 49 50 // TODO Auto-generated method stub 51 52 SelectQuery getcon = new SelectQuery(); 53 54 getcon.getConnection(); 55 56 //查询 57 58 /** String sql = "SELECT * FROM [dbo].[User]"; 59 60 try { 61 62 PreparedStatement Ps = getcon.conn.prepareStatement(sql); 63 64 ResultSet Rs = Ps.executeQuery(); 65 66 while(Rs.next()){ 67 68 String name = Rs.getString("Name"); 69 70 String password = Rs.getString("Password"); 71 72 System.out.println(name); 73 74 System.out.println(password); 75 76 } 77 78 Rs.close(); 79 80 Ps.close(); 81 82 } catch (SQLException e) { 83 84 // TODO Auto-generated catch block 85 86 e.printStackTrace(); 87 88 } 89 90 **/ 91 92 //添加 93 94 try { 95 96 Statement statement = getcon.conn.createStatement(); 97 98 int count = statement.executeUpdate("INSERT INTO [dbo].[User] VALUES ('Superman','001002')"); 99 100 getcon.conn.close(); 101 102 System.out.println("添加行数为"+count); 103 104 } catch (SQLException e) { 105 106 // TODO Auto-generated catch block 107 108 e.printStackTrace(); 109 110 } 111 112 113 114 115 116 } 117 118 } 119
来看下运行结果:
OK,当我看添加成功后!结果不是重点,重点是增加方法里面用到了Statement接口
Statement实例用于在已经建立连接的基础上向数据库发送SQL语句。该接口用来执行静态的SQL语句。Statement接口常用的方法如下:
方法
功能
execute(String sql)
执行静态的SELECT语句,该语句可能返回过个结果
executeQuery(String sql)
执行给定SQL语句,该语句返回ResultSet对象
clearBatch()
清空此Statement对象的当前SQL命令列表
executeBatch()
将一批命令提交给数据库执行,如果全部命令执行成功,则返回更新计数组的数组。
executeUpdate()
执行给定的SQL语句,该语句可以为INSERT,UPDATE或者DELETE
addBatch(String sql)
将给定的SQL命令添加到Satement对象的当前命令列表中。
close()
释放Statement实例占用的数据库和JDBC资源
接着我们在写一个删除这次的演示就搞完,删除代码如下:
1 package myJava.jdbc; 2 3 import java.sql.*; 4 5 public class SelectQuery { 6 7 Connection conn; 8 9 //创建一个返回值为Connection的方法 10 11 public Connection getConnection(){ 12 13 try { 14 15 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 16 17 System.out.println("数据库驱动加载成功"); 18 19 conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=DB_ShowData","sa","123456"); 20 21 if(conn!=null){ 22 23 System.out.println("数据库连接成功"); 24 25 } 26 27 } catch (Exception e) { 28 29 // TODO Auto-generated catch block 30 31 e.printStackTrace(); 32 33 } 34 35 //返回Connection对象 36 37 return conn; 38 39 } 40 41 /** 42 43 * @param args 44 45 */ 46 47 public static void main(String[] args) { 48 49 // TODO Auto-generated method stub 50 51 SelectQuery getcon = new SelectQuery(); 52 53 getcon.getConnection(); 54 55 //查询 56 57 /** String sql = "SELECT * FROM [dbo].[User]"; 58 59 try { 60 61 PreparedStatement Ps = getcon.conn.prepareStatement(sql); 62 63 ResultSet Rs = Ps.executeQuery(); 64 65 while(Rs.next()){ 66 67 String name = Rs.getString("Name"); 68 69 String password = Rs.getString("Password"); 70 71 System.out.println(name); 72 73 System.out.println(password); 74 75 } 76 77 Rs.close(); 78 79 Ps.close(); 80 81 } catch (SQLException e) { 82 83 // TODO Auto-generated catch block 84 85 e.printStackTrace(); 86 87 } 88 89 **/ 90 91 //添加 92 93 /** try { 94 95 Statement statement = getcon.conn.createStatement(); 96 97 int count = statement.executeUpdate("INSERT INTO [dbo].[User] VALUES ('Superman','001002')"); 98 99 getcon.conn.close(); 100 101 System.out.println("添加行数为"+count); 102 103 } catch (SQLException e) { 104 105 // TODO Auto-generated catch block 106 107 e.printStackTrace(); 108 109 } 110 111 **/ 112 113 //删除 114 115 try { 116 117 Statement statement = getcon.conn.createStatement(); 118 119 int count = statement.executeUpdate("DELETE FROM [dbo].[User] WHERE Name LIKE 'Superman'"); 120 121 getcon.conn.close(); 122 123 System.out.println("成功删除行数"+count); 124 125 } catch (SQLException e) { 126 127 // TODO Auto-generated catch block 128 129 e.printStackTrace(); 130 131 } 132 133 134 135 } 136 137 } 138
运行结果如下:
OK!关于JDBC的操作就先简单的介绍到这里,后续我们在慢慢深入的学习,这个作为我的开始学习笔记,希望对我日后和新学Java的有所帮助,不过我的是针对SQL数据库的,其他数据库的就是在创建连接上有所不同,JDBC里面的接口的东西用法大同小异,可以试试去写下!
补充:
1 package JDBC编程; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 10 public class Test { 11 12 public static void main(String[] args) { 13 Connection connect = null;//代表数据库连接对象 14 Statement statement = null;//执行sql语句的工具接口 15 ResultSet resultSetstu = null;//结果集对象 16 ResultSet resultsetMark = null; 17 18 try { 19 20 Class.forName("oracle.jdbc.OracleDriver");// 第一步注册驱动(类加载 21 String connId = "jdbc:oracle:thin:@192.168.45.3:1521:XE";// 获取连接 22 connect = DriverManager.getConnection(connId, "hr", "123456");// 第一种方式利用DrivaManger 23 24 System.out.println(connect);// 测试connect正确与否 25 statement = connect.createStatement();// 第三步获取sql语句对象,第一种方式statement 26 // 第二种方式PreStatement 27 // PreparedStatement preparedStatement=connect.prepareStatement("select * from 28 // student"); 29 // 第四步执行sql语句 30 // 第一种方式 31 // resultSetstu = statement.executeQuery("select * from student"); 32 // resultSetstu = statement.executeQuery("insert into student (sid,sname,sage,ssex) values (126285,'叶晶1512',21,'女')"); 33 34 35 resultSetstu = statement.executeQuery("select * from avgMark");//调用数据库 36 while (resultSetstu.next()) { 37 int sid = resultSetstu.getInt("sid");//查找 38 String sname = resultSetstu.getString("sname"); 39 // String ssex = resultSetstu.getString("ssex"); 40 double AMK=resultSetstu.getDouble("AMK"); 41 // System.out.println("名字" + sname + "学号" + sid + "性别" + ssex); 42 System.out.println("名字\n" + sname + "学号\n" + sid + "平均成绩\n" + AMK); 43 } 44 45 } catch (ClassNotFoundException e) { 46 e.printStackTrace();//报异常 47 48 } catch (SQLException e) {//原始记录 49 // TODO Auto-generated catch block 50 e.printStackTrace();//打印该异常信息 51 } finally { 52 // 第六步关闭资源 53 try { 54 if (resultSetstu != null)//结果集 55 resultSetstu.close(); 56 if (statement != null)//工具接口 57 statement.close(); 58 if (connect != null)//连接对象 59 connect.close(); 60 if (resultsetMark != null) 61 resultsetMark.close(); 62 } catch (SQLException e) { 63 // TODO Auto-generated catch block 64 e.printStackTrace(); 65 } 66 } 67 } 68 } 69
数据库代码:
1 create or replace view avgMark as 2 select s.sid,sname ,avg(cmark) amk from student s left outer join mark m on s.sid=m.sid group by s.sid,sname;
CallableStatement调用
1 cstmt = connect.prepareCall("{call abc(?,?,?,?,?)}"); 2 cstmt.setString(1, "马云"); 3 cstmt.registerOutParameter(2,Types.INTEGER); 4 cstmt.registerOutParameter(3, Types.INTEGER); 5 cstmt.registerOutParameter(4, Types.INTEGER); 6 cstmt.registerOutParameter(5, Types.DOUBLE); 7 cstmt.execute(); 8 System.out.println("马云的学号是:"+cstmt.getInt(2)+",最高分是:"+cstmt.getInt(3)+",最低分是:"+cstmt.getInt(4)+",平均分是:"+cstmt.getDouble(5)); 9
数据库代码
1
package JDBC编程;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public abstract class Test1 {
private static Connection connect;
private static Statement statement;
private static ResultSet resultSetStun;
public static void main(String[] args){
try {
//第一步,注册驱动(类加载)
Class.forName("oracle.jdbc.OracleDriver");
//第二步:获取连接
//第一种方式:利用DriverManager(常用)
String connId="jdbc:oracle:thin:@192.168.45.3:1521:XE";
connect = DriverManager.getConnection(connId,"hr","123456");
//测试connect正确与否
System.out.println(connect);
//第三步:获取执行sql语句对象
//第一种方式:statement
statement = connect.createStatement();
create or replace procedure abc 2 ( 3 name in student.sname%type, 4 id out student.sid%type, 5 mak out mark.cmark%type, 6 mik out mark.cmark%type, 7 amk out mark.cmark%type 8 ) 9 as 10 begin 11 select sid into id from student where sname=name; 12 select max(cmark) into mak from mark where sid=id; 13 select min(cmark) into mik from mark where sid=id; 14 select avg(cmark) into amk from mark where sid=id; 15 end; 16 17 declare 18 a student.sid%type; 19 b mark.cmark%type; 20 c mark.cmark%type; 21 d mark.cmark%type; 22 begin 23 abc('张三',a,b,c,d); 24 dbms_output.put_line('学号为'||a||'最高分为'||b||'最低分为'||c||'平均分为'||d); 25 end;