JDBC数据库编程总结

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

posted @ 2014-05-07 17:57  shangshicc  阅读(372)  评论(0编辑  收藏  举报