Java_(jdbc dbutile c3p0)

具体代码如下:

(1)操作JDBC的步骤口诀:

贾琏欲执事:
1:载注册驱动.
2:获取接对象.
3:创建/获取句对象.
4:行SQL语句.
5:放资源.

properties配置文件

开发中获得连接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可。
通常情况下,我们习惯使用properties文件,此文件我们将做如下要求:

  • 文件位置:任意,建议src下
  • 文件名称:任意,扩展名为properties
  • 文件内容:一行一组数据,格式是"key=value"
    key命名自定义,如果是多个单词,习惯使用点分隔。例如:jdbc.driver
    value值不支持中文,如果需要使用非英文字符,将进行unicode转换
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class Test3 { // final static String userName = "root"; final static String pass = "root"; final static String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf-8"; public static Connection getConnect() { Connection connectuin = null; try { Class.forName("com.mysql.jdbc.Driver"); connectuin =DriverManager.getConnection(url, userName, pass); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } return connectuin; } public static void main(String[] args) { Connection connection = Test3.getConnect(); PreparedStatement stmt = null; ResultSet set = null; try { stmt = connection.prepareStatement("select name from stu where age < ?"); stmt.setInt; set =stmt.executeQuery(); while (set.next { String name = set.getString; System.out.println; } } catch (SQLException e) { e.printStackTrace(); } finally{ try { set.close(); stmt.close(); connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}}

4.JDBC的DDL(创建表和异常处理)

需求:
创建一张t_student表:id/name/age:

CREATE TABLE `t_student` (`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,`name` varchar(20),`age` int(11));
  • 创建一张表

public void createTable() throws Exception{
        String sql="CREATE TABLE `t_student` (`id` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
        //1.加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.创建/获取语句对象
        Statement st=conn.createStatement();
        //4.执行SQL语句
        st.executeUpdate(sql);
        st.close();
        conn.close();
    }
  • 如何正确的处理JDBC异常

    public void createTableException(){
        String sql="CREATE TABLE `t_student` (`id1` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
        //声明资源
        Connection conn = null;
        Statement st = null;
        try{
            //可能出现异常
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
            st=conn.createStatement();
            st.executeUpdate(sql);

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //释放资源
            try {
                if(st!=null){
                    st.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }finally {
                try {
                    if(conn!=null){
                        conn.close();
                    }
                } catch (Exception e3) {
                    e3.printStackTrace();
                }
            }
        }
    }
  • 使用Java7的自动资源关闭

    public void createEXceptionByJava7(){
        String sql="CREATE TABLE `t_student` (`id2` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
        try {
            //1.获取连接对象
            Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
            //2.创建/获取语句对象
            Statement st=conn.createStatement();
            //3.执行SQL语句,可能会出现异常
            st.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

API详解:获得链接

代码:

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");

获取连接需要方法
DriverManager.getConnection(url, username, password),三个参数分别表示,url
需要连接数据库的位置(网址user用户名 password 密码

url比较复杂,下面是mysql的url:
jdbc:mysql://localhost:3306/mydb

JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。

第一部分是jdbc,这是固定的;
第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了;
第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(mydb)组成。

3.SQL语言的分类

SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML*,数据定义语言DDL,数据控制语言DCL

    1. 数据查询语言DQL:数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
      子句组成的查询块: SELECT <字段名表> FROM
      <表或视图名> WHERE <查询条件>
    1. 数据操纵语言DML 数据操纵语言DML主要有三种形式: 1)
      插入:INSERT 2) 更新:UPDATE 3) 删除:DELETE
    1. 数据定义语言DDL:数据定义语言DDL用来创建数据库中的各种对象—–表、视图、
      索引、同义词、聚簇等如: CREATE TABLE/VIEW/INDEX/SYN/CLUSTER | |
      | | | 表 视图 索引 同义词 簇
      DDL操作是隐性提交的!不能rollback
    1. 数据控制语言DCL:
      数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制
      数据库操纵事务发生的时间及效果,对数据库实行监视等。

如:

  1. GRANT:授权。
  2. ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。 回滚—ROLLBACK
    回滚命令使数据库状态回到上次最后提交的状态。其格式为:
    SQL>ROLLBACK;
  3. COMMIT [WORK]:提交。

创建配置文件

在项目跟目录下,创建文件,输入”db.properties”文件名
在”db.properties”文件中写下配置

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
user=root
password=123456

图片 1数据库表.PNG

5.JDBC的DML操作(增、删、改)

  • 增加

    public void insert() throws Exception{
        String sql="INSERT INTO t_student(name,age) VALUES('jarry',20)";
        //1.加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.创建/获取语句对象
        Statement st=conn.createStatement();
        //4.执行SQL
        st.execute(sql);
        //5.释放资源
        st.close();
        conn.close();
    }
  • 修改

public void update()throws Exception{
        String sql="UPDATE t_student SET name='jihang' ,age=18 WHERE name='jarry'";
        //1.加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.创建/获取语句对象
        Statement st=conn.createStatement();
        //4.执行SQL
        st.execute(sql);
        //5.释放资源
        st.close();
        conn.close();
    }
  • 删除

public void delete()throws Exception{
        String sql="DELETE FROM t_student WHERE name ='jihang'";
        //1.加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.创建/获取语句对象
        Statement st=conn.createStatement();
        //4.执行SQL
        st.execute(sql);
        //5.释放资源
        st.close();
        conn.close();
    }

发现:执行DDL和DML的语句的操作模板是一模一样的,仅仅是SQL语句不一样.

API详解:注册驱动

代码:

Class.forName("com.mysql.jdbc.Driver");

JDBC规范定义驱动接口:java.sql.Driver,MySql驱动包提供了实现类:com.mysql.jdbc.Driver
DriverManager工具类,提供注册驱动的方法
registerDriver(),方法的参数是java.sql.Driver,所以我们可以通过如下语句进行注册:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

以上代码不推荐使用,存在两方面不足
1.硬编码,后期不易于程序扩展和维护
2.驱动被注册两次。
通常开发我们使用Class.forName() 加载一个使用字符串描述的驱动类。
如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行。
通过查询com.mysql.jdbc.Driver源码,我们发现Driver类“主动”将自己进行注册

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
   ...
}
  • c3p0是一种连接池,概念与线程池类似.通俗点说;就是有一个池子
    里面有好几个连接,需要用连接的时候 取走,不用
    就放回.这样就可以节省创建连接的时间.
  • 导入jar包.

(3)备注

  • 从Java6开始:JDBC4.0: (了解)JDBC4.0有一个新特性-无需加载注册驱动.

  • 规范要求:从JDBC 4.0所有的驱动都必须包括
    META-INF/services/java.sql.Driver 文件。此文件包含 java.sql.Driver
    的 JDBC 驱动程序实现的名称。
    程序会自动从
    META-INF/services/java.sql.Driver去读取当前的驱动类的全限定名,此时程序员不再需要显示的编写
    Class.forName(“com.mysql.jdbc.Driver”)代码.

  • 在Web开发中,还是得使用手动加载注册驱动.

  • PS:有的时候,MySQL的驱动类也也会看到使用org.gjt.mm.mysql.Driver的情况,org.gjt.mm.mysql.Driver是早期的驱动名称,后来就改名为com.mysql.jdbc.Driver,现在一般都推荐使用
    com.mysql.jdbc.Driver。

  • 在最新版本的mysql
    jdbc驱动中,为了保持对老版本的兼容,仍然保留了org.gjt.mm.mysql.Driver,但是实际上
    org.gjt.mm.mysql.Driver中调用了com.mysql.jdbc.Driver,因此现在这两个驱动没有什么区别。

图片 2

注册驱动规范.png

JDBC开发步骤

  • 注册驱动.
  • 获得连接.
  • 获得语句执行平台
  • 执行sql语句
  • 处理结果
  • 释放资源.
import java.sql.SQLException;import java.util.List;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanListHandler;import com.mchange.v2.c3p0.ComboPooledDataSource;import dbutiles.Student;//c3p0 与 Dbutile一起用public class Test2 { public static void main(String[] args) throws SQLException { //获取数据库连接池 ComboPooledDataSource dataSource = new ComboPooledDataSource(); //创建dbutile操作对象 QueryRunner query = new QueryRunner(dataSource); //执行语句 List<Student> list = query.query("select * from stu",new BeanListHandler<Student>(Student.class)); System.out.println; }}

1.获取数据库连接

JDBC原理

ava提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动

图片 3

image.png

JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供

首先声明 我的数据库叫student 表名stu 具体:

(1)使用JDBC的准备环境:

  • 1):拷贝MySQL的JDBC驱动,到Java项目中:mysql-connector-java-5.1.26-bin.jar。(注意:是jar包,不是zip包.)
  • 2):选择jar,[buil path],把jar添加到classpath路径.

图片 4

驱动包.png

JDBC工具类

“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。
该工具类提供方法:public static Connection getConnection ()。
代码如下:

package com.cuzz;
/*
 *  实现JDBC的工具类
 *  定义方法,直接返回数据库的连接对象
 *  
 *  写关闭方法
 */

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

public class JDBCUtils {
    private JDBCUtils(){}
    private static Connection con ;

    static{
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mybase";
            String username="root";
            String password="123";
            con = DriverManager.getConnection(url, username, password);
        }catch(Exception ex){
            throw new RuntimeException(ex+"数据库连接失败");
        }
    }

    /*
     * 定义静态方法,返回数据库的连接对象
     */
    public static Connection getConnection(){
        return con;
    }


    public static void close(Connection con,Statement stat){

         if(stat!=null){
             try{
                 stat.close();
             }catch(SQLException ex){}
         }

         if(con!=null){
             try{
                 con.close();
             }catch(SQLException ex){}
         } 
    }


    public static void close(Connection con, Statement stat, ResultSet rs){
         if(rs!=null){
             try{
                 rs.close();
             }catch(SQLException ex){}
         }

         if(stat!=null){
             try{
                 stat.close();
             }catch(SQLException ex){}
         }

         if(con!=null){
             try{
                 con.close();
             }catch(SQLException ex){}
         } 
    }
}

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website