JDBC连接数据库

来源:互联网 发布:广联达软件最新版本 编辑:程序博客网 时间:2024/06/07 06:30

使用JDBC连接数据大概可以分为5步操作:

  1. 注册JDBC驱动(只做一次)
  2. 建立连接 Connection
  3. 创建执行SQL的语句(Statement)
  4. 处理执行结果(ResultSet)
  5. 释放资源

1.注册JDBC驱动程序
JDBC驱动程序实现JDBC API中定义的接口,用于与数据库服务器进行 交互。初始化驱动程序,就是打开与数据库的通信通道。
JDBC注册驱动,首先导入对应的驱动包,我在这里使用的是mysql的驱动包mysql-connector-java-5.1.25.jar,如果是连接的是其他的数据库需导入相应的驱动包。
注册的方式大概可以分为三种:
1.第一种方式:
Class.forName(“com.mysql.jdbc.Driver”);
这种方式使用了Class.forName(String className)方法动态的加载驱动程序的类到内存中,在这里使用了类加载器和反射的概念。这种方式不会对具体的驱动类依赖(推荐使用这种方式)
下面的示例使用Class.forName()来注册Oracle驱动程序:

// 静态代码块,初始化一次用于注册驱动static {try {Class.forName("com.mysql.jdbc.Driver");System.out.println("注册jdbc驱动");} catch (ClassNotFoundException e) {throw new ExceptionInInitializerError();}}

2.第二种方式:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
这种方式会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖,至于为什么会有两个驱动,可以结合第一种方式来看一下,这里就细说了。
3.第三种方式:
System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);
通过系统的属性设置注册驱动,如果要注册多个驱动,则System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver:com.oracle.jdbc.Driver”);
虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。
2.建立连接
Connectionconn =DriverManager.getConnection(url,user, password);
url格式:
JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…..
user,password可以用“属性名=属性值”的方式告诉数据库;
其他参数如:
useUnicode=true&characterEncoding=GBK

3.创建sql并执行

Stringsql= “select * from table_namewhere col_name=?”;       PreparedStatement   ps= conn.preparedStatement(sql);  ps.setString(1,“col_value”);  ps.executeQuery();

这是个查询的示例代码,在这里使用了PreparedStatement接口,它继承与Statement 它可以过滤掉参数中的 一些特殊字符,没有sql注入问题比Statement更具有优势,具体的方法可以javaAPI文档。

4.处理结果

// 处理结果while (rs.next()) {System.out.println(rs.getObject("name") + "\t"+ rs.getObject("age") + "\t" + rs.getObject("birthday")+ "\t");}

这里可以根据需求封装成bean或者其他对象返回,提高代码的复用性等。

5.释放资源
释放ResultSet,Statement,Connection.数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。这些接口都有自己的close()方法。

以下是jdbc连接数据库的示例代码:

import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;/** * jdbc工具类 *  * @author Administrator *  */public final class JdbcUtils {    // 常量值    private static String url = "jdbc:mysql://localhost:3306/test?generateSimpleParameterMetadata=true";    private static String user = "root";    private static String password = "root";    // 让构造函数为private,这样该类就不会被实例化    private JdbcUtils() {    }    // 静态代码块,初始化一次用于注册驱动    static {        try {            Class.forName("com.mysql.jdbc.Driver");            System.out.println("注册jdbc驱动");        } catch (ClassNotFoundException e) {            throw new ExceptionInInitializerError();        }    }    // 获取数据库连接    public static  Connection getConnection() throws SQLException{        Connection conn = null;        try {            conn=DriverManager.getConnection(url, user, password);        } catch (SQLException e) {            e.printStackTrace();        }        return conn;    }    // 释放资源    public static void free(ResultSet rs, Statement st, Connection conn) {        try {            if (rs != null)                rs.close();        } catch (SQLException e) {            e.printStackTrace();        } finally {            try {                if (st != null)                    st.close();            } catch (SQLException e) {                e.printStackTrace();            } finally {                try {                    if (conn != null)                        conn.close();                } catch (Exception e) {                    e.printStackTrace();                }            }        }    }}

基本的CRUD操作:

import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;/** * 数据库基本的CRUD操作 * @author Administrator * */public class CRUD {    public static void main(String[] args) {        // create();        // update();        delete();        read();    }    // 查询操作    public static void read() {        Connection conn = null;        //使用Statement这种方式有sql注入的危险,可使用PreparedStatement,例子可参照本包下的SQLInject类        Statement st = null;        ResultSet rs = null;        try {            // 建立连接            conn = JdbcUtils.getConnection();            // 创建语句            st = conn.createStatement();            // 执行语句            rs = st.executeQuery("select * from user");            // 处理结果            while (rs.next()) {                System.out.println(rs.getObject("name") + "\t"                        + rs.getObject("age") + "\t" + rs.getObject("birthday")                        + "\t");            }        } catch (Exception e) {            e.printStackTrace();        } finally {            //释放资源            JdbcUtils.free(rs, st, conn);        }    }    // 插入操作    public static void create() {        Connection conn = null;        Statement st = null;        ResultSet rs = null;        try {            // 建立连接            conn = JdbcUtils.getConnection();            // 创建语句            st = conn.createStatement();            String sql = "insert into user(name,age,birthday)" + "values('天语',"                    + 23 + ",'1990-07-29')";            // 执行语句            int i = st.executeUpdate(sql);            System.out.println("i=" + i);        } catch (Exception e) {            e.printStackTrace();        } finally {            JdbcUtils.free(rs, st, conn);        }    }    // 更新操作    public static void update() {        Connection conn = null;        Statement st = null;        ResultSet rs = null;        try {            // 建立连接            conn = JdbcUtils.getConnection();            // 创建语句            st = conn.createStatement();            String sql = "update user set age=age+1";            // 执行语句            int i = st.executeUpdate(sql);            System.out.println("i=" + i);        } catch (Exception e) {            e.printStackTrace();        } finally {            JdbcUtils.free(rs, st, conn);        }    }    // 删除操作    public static void delete() {        Connection conn = null;        Statement st = null;        ResultSet rs = null;        try {            // 建立连接            conn = JdbcUtils.getConnection();            // 创建语句            st = conn.createStatement();            String sql = "delete from user where id>2";            // 执行语句            int i = st.executeUpdate(sql);            System.out.println("i=" + i);        } catch (Exception e) {            e.printStackTrace();        } finally {            JdbcUtils.free(rs, st, conn);        }    }}
0 0
原创粉丝点击