(本文主要讲解一些JDBC基础和一个JDBC连接数据库小实例)

JDBC的全称是Java DataBase Connectivity,即Java数据库连接。

JDBC的概念:JDBC是标准的Java访问数据库的API。JDBC定义了数据库的连接、SQL语句的执行以及查询结果集的遍历等。JDBC把这些操作定义为接口,位于包java.sql下面,如java.sql.Connection、java.sql.Statement、java.sql.ResultSet等,各个数据库提供商在自己的JDBC驱动中实现了这些接口。

JDBC支持数据库访问的两层和三层模型。两层模型是Java应用程序或Applet直接与数据库进行交互操作的模型,它需要JDBC驱动将SQL语句发送到数据库,然后将执行结果再返回给客户端应用程序;三层模型是在应用与数据库之间,有一个中间应用服务器。这个应该服务器是将程序解耦合,使得逻辑与数据分离。其具体过程,是使用JDBC驱动把命令发送给中间应用服务器,在此服务器中执行一定的逻辑操作,再将这些命令发送给数据库。数据库接收命令后,执行相关操作,将产生的结果返回给中间服务器,再通过中间服务器将数据发给应用。

JDBC API由两个部分组成,一个是核心的API,其类包路径为java.sql,二是扩展的API,其类包路径为javax.sql。常用的标准类如下。

java.sql.DriverManager:完成驱动程序的装载和建立新的数据库连接。

java.sql.Connection:表示对某一指定数据库的连接。

java.sql.Statement:用于管理在一指定数据库连接上的SQL语句的执行。

java.sql.ResultSet:一个SQL语句的执行结果。

java.sql.PreparedStatement:继承了Statement接口,用于对预编译的SQL语句的执行。

java.sql.CallableStatement:继承了Statement接口,用于对一个数据库存储过程的执行。

java.sql.SQLException:处理数据库访问时的出错信息。

java.sql.SQLWarning:处理数据库访问时的警告信息。

java.sql.Time:用于表示时、分、秒。

java.sql.Timestamp:扩展标准java.util.data类,用于表示SQL的时间戳,增加了一个以纳秒为单位的时间域。

java.sql.Types:定义区分SQL类型的常量。

java.sql.DatabaseMetaData:定义了JDBC元数据接口。

 

Connection连接对象

通过Connection连接对象可以获取Statement语句对象或者PreparedStatement语句对象,通过语句对象可以对数据库进行查询和更新操作。其中,查询是读取数据动作,更新是包括增加、删除、修改数据的操作。Connection的类路径为java.sql.Connection。

close():完成关闭连接

commit():完成提交

rollback():完成回滚

createStatement():该方法返回Statement对象

prepareStatement(String sql):参数sql是执行SQL的语句,该方法返回PrepareStatement对象

setAutoCommit(Boolean autoCommit):参数autoCommit表示是否自动提交,该方法用于设置自动提交。

 

Statement对象

执行数据库的过程是,通过Connection连接对象获取Statement对象,在通过Statement对象执行相关读取或更新操作。Statement对象有两种具体实现,分别为PreparedStatement和CallableStatement。其中,PreparedStatement主要是用来预编译SQL语句,这个对象主要是为了提高程序效率;CallableStatement继承了PreparedStatement接口,用于存储过程。

Statement对象是通过Connection对象的createStatement()方法来创建的。对于不是频繁查询记录的应用而言,使用Statement对象是一个合适的做法。因为他不必像PreparedStatement对象一样,需要预编译。

Statement对象的创建过程如下:

String URL = "jdbc:mysql://localhost:3306/bank?username=root&password=root";
Connection conn = DriverManager.getConnection(URL);
Statement st = conn.createStatement();

Statement的类路劲为java.sql.Statement,它的常用方法如下:

close():完成关闭Statement。

executeQuery(String sql):参数sql表示查询SQL语句,该方法返回ResultSet对象。

executeUpdate(String sql):参数sql表示操作SQL语句,该方法返回更新的行数。

execute(String sql):参数sql表示操作SQL语句,该方法返回一个boolean值,表明是否返回了ResultSet对象。

getResultSet():该方法返回ResultSet对象。

 

通常使用Statement对象的3个基本方法来执行SQL命令。

executeQuery()方法主要是用来执行查询命令,返回一个ResultSet对象。

String sql = "select * from user";
ResultSet  rs =  statememt.executeQuery(sql);

executeUpdate()方法主要是用来执行增加,删除及修改记录操作,返回一个int整型值,此整型值是被更新的行数。

String sql = "insert into user(name ,age ,sex)values('jack',25,'男')"
int num = statement.executeUpdate(sql);    

execute()方法主要是用来执行一般的SQL命令,包括增删改查以及数据定义,返回一个布尔值,它显示了是否返回一个查询结果集ResultSet对象。

String sql = "select * from user";
boolean   value =  statement.execute(sql);


 

PreparedStatement对象

PreparedStatement继承了Statement接口。所谓预编译,就是在创建语句对象时,将SQL执行语句一起进行编译,然后写入缓冲,只保留参数动态输入。这样在执行相同的数据库操作时,如查询某条记录的信息,就不必总是查询SQL命令进行编译,而只是修改相应的参数即可,如根据某个标识查询记录,就能获得查询结果,达到了提高效率的目的。

PreparedStatement对象是通过Connection对象的preparedStatement()方法来创建的。preparedStatement()方法有一个参数,这个参数需要输入所要执行的SQL语句。该SQL语句可以保留一个或多个参数作为动态输入。如果需要有参数动态输入,则此SQL语句的参数位置需要用“?“代替。然后需要根据参数的序号位置,分别调用不同类型的set方法将参数值动态输入。

复制代码
复制代码
String URL = "jdbc:mysql://localhost:3306/bank?username=root&password=root";
Connection conn = DriverManager.getConnection(URL);
String sql = "select * from user where name = ? and age < ? and sex = ?";
PreparedStatement  pstmt = conn.preparedStatement(sql);
pstmt.setString(1,"jack");
pstmt.setInt(2,"20");
pstmt.setString(3,"男");
ResultSet  rs = pstmt.executeQuery();
复制代码
复制代码

PreparedStatement的常用方法如下:

close():该方法完成关闭Statement

executeQuery():该方法输出ResultSet对象

executeUpdate():该方法输出数据更新的行数

execute():该方法输出boolean值,表明是否返回了ResultSet对象

 

 

ResultSet结果集对象

java.sql.ResultSet接口封装了这个结果集对象,其中的每条记录结果代表了一个数据库行。通常可以通过一个Statement对象、PreparedStatement对象及一些其他子接口对象的executeQuery()方法,获得结果集对象。通过Statement对象的execute()方法,执行一个SQL查询命令,也可以获得一个结果集对象,但不是直接获取。它首先通过execute()方法返回的布尔值,判断是否返回一个结果集对象,然后通过getResultSet()方法获取一个ResultSet对象。有些场合,需要同时返回多个结果集对象,这时就需要通过Statement对象的getMoreResults()方法来实现对结果集集合的遍历。

 

一个JDBC操作数据库的实例

1.实现JDBC连接MySQL数据库

复制代码
复制代码
package com.cn.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC_Connection {
    static String drivername = "com.mysql.jdbc.Driver";
    static String url = "jdbc:mysql://localhost:3306/bank";
    static String username = "root";
    static String password = "123456";
    
    static {
        try{
            Class.forName(drivername);            //创建驱动
            System.out.println("创建驱动成功!");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }
    
    public static Connection getConnection(){
        Connection conn = null;
        try{
            //使用DriverManager来获取连接
            conn = (Connection)DriverManager.getConnection(url,username,password);
            System.out.println("连接数据库成功!");
        }catch(SQLException e){
            e.printStackTrace();
        }
        return conn;
    }
    
    public static void main(String[] args){
        JDBC_Connection.getConnection();
    }
    
    public static void free(ResultSet rs,Connection conn,Statement stmt){
        try{
            if(rs != null)
                rs.close();                        //关闭结果集
        }catch(SQLException e){
            System.out.println("关闭ResultSet失败!");
            e.printStackTrace();
        }finally{

            try{
                if(conn != null)
                    conn.close();                //关闭连接
            }catch(SQLException e){
                System.out.println("关闭Connection失败!");
                e.printStackTrace();
            }finally{
                try{
                    if(stmt != null)
                        stmt.close();            //关闭Statement对象
                }catch(SQLException e){
                    System.out.println("关闭Statement失败!");
                    e.printStackTrace();
                }
            }
        }
    }
}
复制代码
复制代码

在控制台打印

使用JDBC向数据库表插入数据

实体类:UserVo.java

复制代码
复制代码
/*每一张数据库表要对应一个实体类,
 * 实体类中的属性对应着表的字段名。同时数据类型转化要正确**/

package com.cn.jdbc;

public class UserVo {
    private int id;
    private String name;
    private int age;
    private String tel;
    private String address;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    
}
复制代码
复制代码

AddUser.java

复制代码
复制代码
package com.cn.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class AddUser {
    public void add(UserVo userVo){
        Connection conn = null;
        PreparedStatement pstm = null;
        ResultSet rs = null;
        
        try{
            //调用JDBC_Connection类的getConnection方法连接数据库
            conn = JDBC_Connection.getConnection();
            //添加数据库的SQL语句
            String sql = "insert into users(id,name,age,tel,address)values(?,?,?,?,?)";
            pstm = conn.prepareStatement(sql);
            //把添加的id值存入pstm对象中,int类型的值用setInt方法
            pstm.setInt(1, userVo.getId());
            pstm.setString(2, userVo.getName());
            pstm.setInt(3, userVo.getAge());
            pstm.setString(4, userVo.getTel());
            pstm.setString(5, userVo.getAddress());
            pstm.executeUpdate();        //提交pstm对象
            
            System.out.println("添加成功!添加的内容如下:");
            System.out.println("id:"+userVo.getId()+"\t name:"+userVo.getName()
                    +"\t age:"+userVo.getAge()+"\t tel:"+userVo.getTel()+
                    "\t address:"+userVo.getAddress());
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBC_Connection.free(rs, conn, pstm);
        }
    }
    
    public static void main(String[] args){
        AddUser addUser = new AddUser();
        UserVo userVo = new UserVo();
        int id = 1;
        String name = "赵六";
        int age = 22;
        String tel = "123456";
        String address = "北京";
        //下面是设置要添加的变量值,放入UserVo对象中
        userVo.setId(id);
        userVo.setName(name);
        userVo.setAge(age);
        userVo.setTel(tel);
        userVo.setAddress(address);
        //调用add()方法,把UserVo对象作为参数传递
        addUser.add(userVo);
    }
}
复制代码
复制代码

在控制台打印

查询数据库表数据

复制代码
复制代码
package com.cn.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class Query {
    public List<UserVo> showUser(){
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<UserVo> list = new ArrayList<UserVo>();    //声明一个List集合,用于存放查询出的数据
        try{
            conn = JDBC_Connection.getConnection();        //连接数据库
            stmt = conn.createStatement();                //建立Statement对象
            rs = stmt.executeQuery("select * from users");
            while(rs.next()){                            //结果集存在,则进行循环遍历
                UserVo userVo = new UserVo();
                userVo.setId(rs.getInt("id"));
                userVo.setName(rs.getString("name"));
                userVo.setAge(rs.getInt("age"));
                userVo.setTel(rs.getString("tel"));
                userVo.setAddress(rs.getString("address"));
                list.add(userVo);                        //把每次获得的对象数据放入list集合中
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            JDBC_Connection.free(rs, conn, stmt);        //关闭连接
        }
        return list;
    }
    
    public static void main(String[] args){
        Query query = new Query();
        List<UserVo> list = query.showUser();            //调用查询方法
        //如果list集合不为空,则循环遍历打印出所有的信息
        if(list != null){
            System.out.print("id    ");
            System.out.print("name    ");
            System.out.print("age    ");
            System.out.print("tel    ");
            System.out.print("address    ");
            System.out.println();
            for(int i=0;i<list.size();i++){
                System.out.print(list.get(i).getId()+"\t");
                System.out.print(list.get(i).getName()+"\t");
                System.out.print(list.get(i).getAge()+"\t");
                System.out.print(list.get(i).getTel()+"\t");
                System.out.print(list.get(i).getAddress()+"\t");
                System.out.println();
            }
        }
    }
}
复制代码
复制代码

在控制台打印:

查询指定条件的数据

复制代码
复制代码
package com.cn.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class QueryById {
    public UserVo queryUserById(int id){
        UserVo userVo = null;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        
        try{
            conn = JDBC_Connection.getConnection();
            pstmt = conn.prepareStatement("select *from users where id = ?");
            pstmt.setInt(1, id);                                        //设置条件id
            rs = pstmt.executeQuery();
            while(rs.next()){                      //结果集存在,则遍历结果,放入UserVo对象中
                userVo = new UserVo();
                userVo.setId(rs.getInt("id"));
                userVo.setName(rs.getString("name"));
                userVo.setAge(rs.getInt("age"));
                userVo.setTel(rs.getString("tel"));
                userVo.setAddress(rs.getString("address"));
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            JDBC_Connection.free(rs, conn, pstmt);        //关闭连接
        }
        return userVo;
    }
    
    public static void main(String[] args){
        QueryById byId = new QueryById();
        int id = 1;
        UserVo vo = byId.queryUserById(id);
        if(vo != null){
            System.out.print("id\t");
            System.out.print("name\t");
            System.out.print("age\t");
            System.out.print("tel\t");
            System.out.print("address\t");
            System.out.println();
            System.out.print(vo.getId()+"\t");
            System.out.print(vo.getName()+"\t");
            System.out.print(vo.getAge()+"\t");
            System.out.print(vo.getTel()+"\t");
            System.out.print(vo.getAddress()+"\t");
            System.out.println();
        }else{
            System.out.println("id为"+id+"的用户不存在!");
        }
    }
}
复制代码
复制代码

在控制台打印

删除表数据

复制代码
复制代码
package com.cn.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DeleteUser {
    public void deleteUser(int id){
        Connection conn = null;
        PreparedStatement pstmt = null;
        try{
            conn = JDBC_Connection.getConnection();
            String sql = "DELETE FROM users where id =?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, id);                //给SQL语句中的id赋值
            pstmt.executeUpdate();
            System.out.println("删除成功!删除了id值为"+id+"数据");
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            JDBC_Connection.free(null, conn, pstmt);        //关闭连接
        }
    }
    
    public static void main(String[] args){
        DeleteUser deleteUser = new DeleteUser();
        int id = 1;
        UserVo userVo = new UserVo();
        QueryById queryById = new QueryById();            
        userVo = queryById.queryUserById(id);                //调用根据id查询的方法查询出id的数据
        if(userVo != null){                                    //如果查询出的数据不为空,则执行删除方法
            deleteUser.deleteUser(id);
        }else{
            System.out.println("删除失败!原因:id为"+id+"的数据不存在!");
        }
    }
}
复制代码
复制代码

在控制台打印

 修改表数据

复制代码
复制代码
package com.cn.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UpdateUser {
    public void update(UserVo userVo){
        Connection conn = null;
        PreparedStatement pstmt = null;
        String sql = "UPDATE users set id=?,name=?,age=?,tel=?,address=? where id =?";
        try{
            conn = JDBC_Connection.getConnection();            //连接数据库
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, userVo.getId());
            pstmt.setString(2, userVo.getName());
            pstmt.setInt(3, userVo.getAge());
            pstmt.setString(4, userVo.getTel());
            pstmt.setString(5, userVo.getAddress());
            pstmt.setInt(6, userVo.getId());
            pstmt.executeUpdate();
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            JDBC_Connection.free(null, conn, pstmt);        //关闭连接
        }
    }
    
    public static void main(String[] args){
        UpdateUser updateUser = new UpdateUser();
        int id = 2;
        String name ="张三";
        int age = 19;
        String tel = "123456";
        String address = "上海";
        QueryById queryById = new QueryById();
        UserVo vo = new UserVo();
        vo = queryById.queryUserById(id);                    //调用QueryById类中根据id查询的方法
        if(vo != null){                                        //判断查询的结果不为空,则执行修改操作
            UserVo userVo = new UserVo();
            //把修改的变量值放入UserVo对象中

            userVo.setId(id);
            userVo.setName(name);
            userVo.setAge(age);
            userVo.setTel(tel);
            userVo.setAddress(address);
            updateUser.update(userVo);
            System.out.println("修改成功!修改了id值为"+id+"数据");
        }else{
            System.out.println("修改失败!原因:id为"+id+"的数据不存在!");
        }
    }
}
复制代码
复制代码

在控制台打印