JDBC连接数据库

使用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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值