jdbc:全称java Database Connectivity java数据库连接。
起初,基于某数据库产品的开发,必须了解某数据库的api。通过c/c++直接访问某数据库的接口来编程。但无法实现跨数据库平台开发。
后来,通过统一数据库接口实现跨平台开发,例如odbc,ado.net。而jdbc是java访问数据库平台的统一接口.
jdbc在不同数据库平台的移植不是完全的。
jdbc对于java程序一端,是统一的一个接口。对于数据库产品连接端,不是统一的。(由厂商提供)
sql六大语句:
Select
Select * from T where … …
Insert
Insert into T values(… …)
Create
Create table T(… …)
Delete
Delete from T where… …
Update
Update T set t1=… and t2=…
Drop
Drop table T
JDBC 连接SQL SERVER
准备:
<1> 将JDBC解压缩到任意位置,比如解压到C盘program files下面,并在安装目录里找到sqljdbc.jar文件,得到其路径开始配置环境变量
在环境变量classpath 后面追加 sqljdbc.jar文件路径
<2> 设置SQLEXPRESS服务器:
a.打开SQL Server Configuration Manager -> SQLEXPRESS的协议 -> TCP/IP
b.右键单击启动TCP/IP
c.双击进入属性,把IP地址中的IP all中的TCP端口设置为1433
d.重新启动SQL Server 2008服务中的SQLEXPRESS服务器
e.关闭SQL Server Configuration Manager
<3> 打开刚刚安装好的 SQL Server Management Studio,连接SQLEXPRESS服务器, 新建数据库
eclipse:
1添加数据库产品相关类库。(数据库驱动包)。
myeclipse:项目鼠标右键project->Properties->Java Build Path->Libraries->Add External JARs->找到sqljdbc4加载
为什么将数据库驱动包放入项目而不是整个系统中?
放入系统中,项目与项目会产生影响,不同版本的jar包会产生冲突
2向DriverManager注册
driverManager:管理数据库的基本服务,若要连接某数据库,需要向DriverManager注册。(实例化时自动注册)
3连接数据库对象
import java.sql.*; /** * JDBC 连接SQL SERVER * 2014-5-5 * @author Administrator */ public class Demo1 { public static void main(String[] args) throws Exception { //1添加数据库产品相关类库。 //2向DriverManager注册。(实例化时自动注册) //Class是java.Lang包中的类,调用方法forName,根据字符串创建一个实例 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //new com.microsoft.sqlserver.jdbc.SQLServerDriver(); //3连接数据库对象 ////jdbc:sqlserver://ip地址:端口;DatabaseName=数据库名称",账号,密码 String url="jdbc:sqlserver://183.33.129.192:1433;DatabaseName=JavaStu"; Connection conn=DriverManager.getConnection(url, "sa", "qsnprac157"); System.out.println("连接数据库成功"); } }
执行查询sql语句
1通过连接创建语句对象
2通过语句对象执行查询sql语句,返回结果集
3循环取得结果集内容
4关闭资源(后打开的先关)
import java.sql.*; /** * 连接数据库并执行查询语句(不合理版) * 2014-5-5 * @author Administrator * */ public class Demo2 { public static void main(String[] args, String Sno, String Ssex) throws Exception{ //添加驱动包 //注册 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //连接数据库对象 String url="jdbc:sqlserver://113.76.233.233:1433;DatabaseName=StuManage"; String user="sa"; String password="qsnprac157"; Connection conn=DriverManager.getConnection(url, user, password); //创建语句对象(作用:将 SQL 语句发送到数据库) Statement stmt =conn.createStatement(); //执行给定的 SQL 语句,并将结果集返回给 ResultSet 对象 ResultSet rs=stmt.executeQuery("Select * from Student"); //循环遍历取得结果集 while(rs.next()){ System.out.println(rs.getInt("Sage")); System.out.println(rs.getString("Ssex")); } //关闭资源 rs.close(); stmt.close(); conn.close(); } }
DriverManager类:管理驱动程序的基本服务(删除、查找、注册驱动程序,建立数据库连接,获取、更新日志,设置)
Connection接口:与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果
Statement接口:执行静态 SQL 语句并返回它所生成结果的对象。
ResultSet接口:表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
上一个代码的问题:如果在遍历的时候出现异常,那么资源无法关闭,逐渐积累,大量内存被占用。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * 连接数据库并执行查询语句(完美版) * 2014-5-5 * @author Administrator * */ public class Demo3 { public static void main(String[] args, String Sno, String Ssex) { Connection conn=null; Statement stmt = null; ResultSet rs=null; //添加驱动包 try{ //注册 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //连接数据库对象 String url="jdbc:sqlserver://113.76.233.233:1433;DatabaseName=StuManage"; String user="sa"; String password="qsnprac157"; conn=DriverManager.getConnection(url, user, password); //创建语句对象(作用:将 SQL 语句发送到数据库) stmt =conn.createStatement(); //执行给定的 SQL 语句,并将结果集返回给 ResultSet 对象 rs=stmt.executeQuery("Select * from Student"); //循环遍历取得结果集 while(rs.next()){ System.out.println(rs.getInt("Sage")); System.out.println(rs.getString("Ssex")); } }catch(ClassNotFoundException e){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } finally{ try{ //关闭资源 if(rs!=null){ //判断是否初始化成功(未初始化的话会报异常) rs.close(); rs=null; } if(stmt!=null){ stmt.close(); //回收操作系统资源 stmt=null; //垃圾回收机制回收内存资源 } if(conn!=null){ conn.close(); conn=null; } }catch(SQLException e){ e.printStackTrace(); } } } }
java有垃圾回收机制,为什么还要使用close()方法回收垃圾
垃圾回收机制只能回收内存资源。其他资源(io设备,进程,cpu等),需要显式的释放
import java.sql.*; /** * 连接数据库并更新数据 * @author Administrator * */ public class Demo4 { public static void main(String[] args) { Connection conn=null; Statement stmt=null; //添加驱动 //注册 try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //连接数据库对象 String url="jdbc:sqlserver://113.76.113.84:1433;DatabaseName=JavaStu"; String user="sa"; String password="qsnprac157"; conn=DriverManager.getConnection(url, user, password); //创建语句对象 stmt=conn.createStatement(); //向表中更新(添加、修改、删除)数据 String sql="insert into Student values('1202020001','cw',20)"; //String sql2="delete from Student where Sname='cw'"; //String sql3="update Student set Sname='cw' where Sno=1202020002"; stmt.executeUpdate(sql); }catch(ClassNotFoundException e ){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } //关闭资源 finally{ try{ if(stmt!=null){ stmt.close(); stmt=null; } if(conn!=null){ conn.close(); conn=null; } }catch(SQLException e){ e.printStackTrace(); } } } }
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * *程序功能:从命令行输入三个字段的值,把三个字段的值插入数据库中 *时间:2014-5-9 * @author Administrator */ public class Demo5 { public static void main(String[] args) { Connection conn=null; Statement stmt=null; String Sno=null; String Sname=null; int Sage = 0; //判断输入的值是否够三个 if(args.length!=3){ System.out.println("需要插入三个字段,但输入的值不够三个!!!"); System.exit(-1); //非正常退出 } Sno = args[0]; Sname=args[1]; try{ Sage=Integer.parseInt(args[2]); }catch(NumberFormatException e){ e.printStackTrace(); System.exit(-1); } //添加驱动 //注册 try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //连接数据库对象 String url="jdbc:sqlserver://183.45.19.233:1433;DatabaseName=JavaStu"; String user="sa"; String password="qsnprac157"; conn=DriverManager.getConnection(url, user, password); //创建语句对象 stmt=conn.createStatement(); //向表中更新(添加、修改、删除)数据 String sql="insert into Student values ('"+Sno+"','"+Sname+"',"+Sage+")"; System.out.println(sql); //判断输入的sql语句是否正确 stmt.executeUpdate(sql); }catch(ClassNotFoundException e ){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } //关闭资源 finally{ try{ if(stmt!=null){ stmt.close(); stmt=null; } if(conn!=null){ conn.close(); conn=null; } }catch(SQLException e){ e.printStackTrace(); } } } }
测试sql语句是否正确:构建完成后把sql语句打印出来
PreparedStatement接口:使用预编译语句.用问号占位符进行占位
import java.sql.*; /** * *程序功能:使用预编译语句处理sql语句 *时间:2014-5-9 * @author Administrator */ public class Demo6{ public static void main(String[] args) { Connection conn=null; PreparedStatement pstmt=null; String Sno=null; String Sname=null; int Sage = 0; //判断输入的值是否够三个 if(args.length!=3){ System.out.println("需要插入三个字段,但输入的值不够三个!!!"); System.exit(-1); //非正常退出 } Sno = args[0]; Sname=args[1]; try{ Sage=Integer.parseInt(args[2]); }catch(NumberFormatException e){ e.printStackTrace(); System.exit(-1); } //添加驱动 //注册 try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //连接数据库对象 String url="jdbc:sqlserver://183.45.19.233:1433;DatabaseName=JavaStu"; String user="sa"; String password="qsnprac157"; conn=DriverManager.getConnection(url, user, password); //创建预编译会话对象 pstmt=conn.prepareStatement("Insert into Student values(?,?,?)"); //设置预编译参数 pstmt.setString(1, Sno); pstmt.setString(2, Sname); pstmt.setInt(3, Sage); pstmt.executeUpdate(); }catch(ClassNotFoundException e ){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } //关闭资源 finally{ try{ if(pstmt!=null){ pstmt.close(); pstmt=null; } if(conn!=null){ conn.close(); conn=null; } }catch(SQLException e){ e.printStackTrace(); } } } }
CallableStatement接口:调用数据库的存储过程
import java.sql.*; /** * *程序功能:调用存储过程 *时间:2014-5-9 * @author Administrator */ public class Demo7 { /** * @param args * @throws ClassNotFoundException * @throws SQLException */ public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub //添加驱动包 // 注册 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // 连接数据库对象 String url="jdbc:sqlserver://183.45.19.233:1433;DatabaseName=JavaStu"; Connection conn=DriverManager.getConnection(url, "sa", "qsnprac157"); // 创建存储过程调用对象 CallableStatement cstmt=conn.prepareCall("{call proc_stu(?,?)}"); // 设置输出参数 cstmt.registerOutParameter(1, Types.INTEGER); // 设置输入参数 cstmt.setInt(2, Types.INTEGER); cstmt.execute(); // 打印输出参数 System.out.println(cstmt.getInt(1)); // 关闭资源 cstmt.close(); conn.close(); } }
参考资料:尚学堂马士兵视频教程。
51CTO使用JDBC连接SQL Server数据库(http://developer.51cto.com/art/200907/134635.htm)