zoukankan      html  css  js  c++  java
  • JDBC 简明教程

    虽然在平时的开发过程中我们不会直接使 JDBC 的 API 来操作数据库,但是 JDBC 是大多数 ORM 框架的基础。只有掌握了 JDBC 的使用才能更好的掌握 ORM 框架。本篇博客就对 JDBC 做下介绍,以及使用 JDBC 操作数据库的一般流程。


    JDBC(Java 数据库连接)是 Sun 公司提供的一组操作数据库的接口。各个数据库厂商提供具体的数据库驱动实现类。开发者就可以通过统一的 JDBC API 来访问各类数据库了。JDBC 可以帮我们完成下面三件事:

    • 建立数据库连接;
    • 执行各类 SQL 语句;
    • 获得 SQL 语句执行的结果。

    常用类

    • DriverManager:主要使用该类获取数据库连接对象;
    public static Connection getConnection(String url,String user, String password) throws SQLException
    
    • Connection:代表数据库连接对象,每个对象代表一个数据库物理连接,在操作数据库之前必须先获得该对象;该接口常用的方法如下:
    //返回一个 Statement 对象
    Statement createStatement() throws SQLException;
    //返回一个预编译的 Statement 对象,也就是先将 Sql 语句提交到数据库进行预编译
    PreparedStatement prepareStatement(String sql) throws SQLException;
    //该对象用于调用存储过程
    CallableStatement prepareCall(String sql) throws SQLException;
    

    另外 Connection 对象还提供了如下对象来对事务进行操作:

    //设置回滚点
    Savepoint setSavepoint() throws SQLException;
    Savepoint setSavepoint(String name) throws SQLException;
    //设置隔离级别
    void setTransactionIsolation(int level) throws SQLException;
    //设置回滚点
    void rollback() throws SQLException;
    void rollback(Savepoint savepoint) throws SQLException;
    void setAutoCommit(boolean autoCommit) throws SQLException;
    //提交事务
    void commit();
    
    • Statement:用于执行 SQL 语句的工具接口,可以执行 DDL、DML 和查询语句,常用方法如下:
    //执行查询 SQL,并返回结果集
    ResultSet executeQuery(String sql) throws SQLException;
    //执行 DML,并返回影响的条数,也可以执行 DDL,返回0
    int executeUpdate(String sql) throws SQLException;
    //可以执行所有 SQL,如果 SQL 是查询语句并能查到结果返回 true,否则返回 false
    boolean execute(String sql) throws SQLException;
    
    • PreparedStatement:预编译的 Statement,不需要每次去数据库编译 SQL 语句,只要给 SQL 执行参数就可以了 。
    • ResultSet:结果集。

    JDBC 编程步骤

    /**
     * step1:加载驱动;
     * step2:获得连接;
     * step3:创建 Statement;
     * step4:执行语句,获取结果集;
     * step5:处理结果集;
     * step6:关闭资源(ResultSet、Statement和Connection)
     */
    

    事务处理

    //开启事务
    setAutoCommit(fasle);
    //遇到异常回滚
    //提交事务
    commit();
    

    数据库连接池

    每次创建数据库的连接是比较耗费资源的,所以将数据库连接资源缓存起来,重复利用。

    • DBCP
    • C3P0
    • Durid

    JDBC列子代码

    下面是一个最简单的 JDBC 列子代码,是一个最典型的 JDBC 查询过程。

    
    public class JDBCUtil {
    
        public static final Logger log = LoggerFactory.getLogger(JDBCUtil.class);
    
        public static final String URL = "jdbc:mysql://127.0.0.1/mysql";
        public static final String DRIVER = "com.mysql.jdbc.Driver";
        public static final String USERNAME = "root";
        public static final String PASSWORD = "root";
    
    
        private Connection getConnection(){
            Connection conn = null;
            try {
                Class.forName(DRIVER);
                conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
            } catch (ClassNotFoundException e) {
                log.error("get connection exception",e);
            }catch (SQLException e) {
                log.error("get connection exception",e);
            }
            return conn;
        }
    
        public void queryAndEchoUser(String userName){
            String sql = "select * from user where user = ?";
            Connection connection = getConnection();
            PreparedStatement preparedStatement;
            ResultSet resultSet=null;
            try {
                preparedStatement = connection.prepareStatement(sql);
                preparedStatement.setString(1,"root");
                resultSet = preparedStatement.executeQuery();
                while (resultSet.next()){
                    log.info("host-->"+resultSet.getString(1));
                }
            } catch (SQLException e) {
                //
            }finally {
                //close resultSet
                //close preparedStatement
                //close connection
            }
        }
    
    }
    
    

    使用 Apache 的 JDBC 工具类

    上面的代码略微显得复杂,特别是将查出来的结果集转换为 Bean 对象,关闭资源那块。使用 Apache 提供的工具类能适当减少这样的模板代码:

    public class DbUtilsUseBeanMySQL {     
      public static void main(String[] args) {     
        Connection conn = null;     
        String jdbcURL = "jdbc:mysql://localhost/octopus";     
        String jdbcDriver = "com.mysql.jdbc.Driver";     
        String user = "root";     
        String password = "root";     
        
        try {     
          DbUtils.loadDriver(jdbcDriver);     
          conn = DriverManager.getConnection(jdbcURL, user, password);     
        
          QueryRunner qRunner = new QueryRunner();     
          List beans = (List) qRunner.query(conn, "select id, name from animals_table",     
              new BeanListHandler(Employee.class));     
        
          for (int i = 0; i < beans.size(); i++) {     
            Employee bean = (Employee) beans.get(i);     
            bean.print();     
          }     
        } catch (SQLException e) {     
          // handle the exception     
          e.printStackTrace();     
        } finally {     
          DbUtils.closeQuietly(conn);     
        }     
      }     
    }     
    
    

    当然以上只是 DbUtil 最简单的使用,这个工具还支持数据源,事务管理等高级特性,需要的时候可以查询 API 使用。

    公众号推荐

    欢迎大家关注我的微信公众号「程序员自由之路」

    人生的主旋律其实是苦难,快乐才是稀缺资源。在困难中寻找快乐,才显得珍贵~
  • 相关阅读:
    20169305 2016-2017-2《网络攻防技术与实践》课程总结
    20169305 2016-2017-2 《网络攻防技术与实践》第11周学习总结
    20169305 2016-2017-2 《网络攻防技术与实践》第10周学习总结
    20169305 2016-2017-2《网络攻防与实践》第九周 学习总结
    20169305 2016-2017-2 《网络攻防技术与实践》第8周学习总结
    20169305 2016-2017-2 《网络攻防技术与实践》第7周学习总结
    20169305 2016-2017-2 《网络攻防技术与实践》第6周学习总结
    20169305 2016-2017-2 《网络攻防技术与实践》第5周学习总结
    20169305 2016-2017-2《网络攻击与防范》第四周学习总结
    20169305 2016-2017-2《网络攻击与防范》第三周学习总结
  • 原文地址:https://www.cnblogs.com/54chensongxia/p/11427136.html
Copyright © 2011-2022 走看看