文档章节

JDBC 使用总结

wow863597
 wow863597
发布于 2016/05/02 16:31
字数 1391
阅读 39
收藏 0

JDBC  

  1. 简介 : 数据存储于数据库中,应用程序的使用需要访问数据库 ,各个数据库厂商不同 ,数据库 访问方式不同 ,因此 JAVA 开发提供一套标准的API 借口 用来解决应用程序访问数据库的问题 ,JDBC 是 应用程序访问数据库的解决方案 ,虽然JDBC 在一定程度上影响了访问数据库的速度,并且会导致 更改源数据较复杂,但是实现了跨平台,面向对象,通用性好。JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。

  2. JDBC 连接数据库 步骤:

①加载驱动(数据库的实现类),

//使用CLASS下forName() 方法  oracle实现
Class.forName("oracle.jdbc.driver.OracleDriver") ;
// mysql 实现
Class.forName("com.mysql.jdbc.Driver");

②建立连接:

String url="jdbc:oracle:thin:@localhost:1521:boson1"; //oracle 实现
String url="com/tarena/dms/daodemo/v2/db.properties";//mysql 实现
String user="userid";//账号
String password="password"; //密码
Connection  conn= DriverManager.getConnection(url,user,password);

③创建语句对象

Statement st=conn.createStatement();

④执行SQL语句

String sql= "insert (name ,age ,hiredate) into emp values ('TOM',18,sysdate)";
ResultSet rs = st.executeQuery(sql); //结果集合
boolean rs1 =st.execute(); // 操作是否成功

⑤处理结果集

// 获取结果集
while(rs.next()){
String name =rs.getString ("name");
Integer age =   rs.getInt ("age");
Date date =rs.getDate("date");
System.out.println( name+""+age+""+hiredate);
}

⑥关闭连接

conn.close();// 需要处理异常

3.完整代码举例 : 

例一:

创建配置文件db.properties保存 URL,USER ,PASSWORD ,CLASSNAME 等属性 。

# DB.properties 配置文件
jdbc.drive="oracle.jdbc.driver.OracleDriver"
jdbc.url="jdbc:oracle:thin:@localhost:1521:boson1";
jdbc.user="admin";
jdbc.password="password";

JAVA代码部分 -1 ,

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtility {
    private static Properties properties =new Properties() ;
    private static String driver = null;
    private static String url = null;
    private static String user = null;
    private static String pwd = null;

    static {
        try {
            // 加载配置文件
            properties.load(DBUtility.class.getClassLoader().getResourceAsStream(
                    "db.properties"));
            driver = properties.getProperty("jdbc.driver");
            url = properties.getProperty("jdbc.url");
            user = properties.getProperty("jdbc.user");
            pwd = properties.getProperty("jdbc.password");
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static Connection openConnection() throws SQLException {
        return DriverManager.getConnection(url, user, pwd);
    }
    public static void closeConnection(Connection con) {
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                System.out.println("关闭连接时发生异常");
            }
        }
    }
}

DAO 类

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

public class EmpDAO {
    public static void main(String[] args) {
        EmpDAO dao = new EmpDAO();
        dao.findAll();
    }

    public void findAll() {
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            con = DBUtility.openConnection();
            stmt = con.createStatement();
            rs = stmt
                .executeQuery("select empno, ename, sal, hiredate from emp");
            while (rs.next()) {
                System.out.println(rs.getInt("empno") + ","
                        + rs.getString("ename") + "," + ","
                        + rs.getDouble("sal") + "," + rs.getDate("hiredate"));
            }
        } catch (SQLException e) {
            System.out.println("数据库访问异常!");
            throw new RuntimeException(e);
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
                System.out.println("释放资源时发生异常");
            }
            DBUtility.closeConnection(con);
        }
    }
}

直接使用JDBC访问数据库时,需要避免以下隐患:

1.每一次数据操作请求都需要建立数据库连接、打开连接、存取数据和关闭连接等步骤。而建立和打开数据库连接是一件既耗资源又费时的过程,如果频繁发生这种数据库操作,势必会使系统性能下降。

2. 连接对象代表着数据库系统的连接进程,是有限的资源。如果系统的使用用户非常多,有可能超出数据库服务器的承受极限,造成系统的崩溃。

数据库连接池是解决上述问题最常用的方法。所谓连接池,即可以创建并持有数据库连接的组件。连接池可以预先创建并封装一些连接对象并将其缓存起来,当需要使用连接对象时可以向连接池“借”一个连接,用完之后将其“归还”到连接池中。数据库连接池的主要功能如下:

1. 连接池对象的创建和释放。

2. 服务器启动时,创建指定数量的数据库连接。

3. 为用户请求提供可用连接。如果没有空闲连接,且连接数没有超出最大值,创建一个新的数据库连接。

4. 将用户不再使用的连接标识为可用连接,等待其他用户请求。

5. 当空闲的连接数过多时,释放连接对象。

例二:(使用连接池)

配置文件内容:

jdbc.driverClassName=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=scott
jdbc.password=tiger

#<!-- 初始化连接 -->
dataSource.initialSize=10
#<!-- 最大空闲连接 -->
dataSource.maxIdle=20
#<!-- 最小空闲连接 -->
dataSource.minIdle=5
#最大连接数量
dataSource.maxActive=50
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
dataSource.maxWait=1000

JAVA代码部分

DButil 类:

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import org.apache.commons.dbcp.BasicDataSource;

public class ConnectionSource {
    private static BasicDataSource dataSource = null;

    public ConnectionSource() {
    }
    public static void init() {

        Properties dbProps = new Properties();
        // 取配置文件可以根据实际的不同修改
        try {
            dbProps.load(ConnectionSource.class.getClassLoader().getResourceAsStream(
                    "day01/v4/db.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            String driveClassName = dbProps.getProperty("jdbc.driverClassName");
            String url = dbProps.getProperty("jdbc.url");
            String username = dbProps.getProperty("jdbc.username");
            String password = dbProps.getProperty("jdbc.password");

            String initialSize = dbProps.getProperty("dataSource.initialSize");
            String minIdle = dbProps.getProperty("dataSource.minIdle");
            String maxIdle = dbProps.getProperty("dataSource.maxIdle");
            String maxWait = dbProps.getProperty("dataSource.maxWait");
            String maxActive = dbProps.getProperty("dataSource.maxActive");

            dataSource = new BasicDataSource();
            dataSource.setDriverClassName(driveClassName);
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);

            // 初始化连接数
            if (initialSize != null)
                dataSource.setInitialSize(Integer.parseInt(initialSize));

            // 最小空闲连接
            if (minIdle != null)
                dataSource.setMinIdle(Integer.parseInt(minIdle));

            // 最大空闲连接
            if (maxIdle != null)
                dataSource.setMaxIdle(Integer.parseInt(maxIdle));

            // 超时回收时间(以毫秒为单位)
            if (maxWait != null)
                dataSource.setMaxWait(Long.parseLong(maxWait));

            // 最大连接数
            if (maxActive != null) {
                if (!maxActive.trim().equals("0"))
                    dataSource.setMaxActive(Integer.parseInt(maxActive));
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("创建连接池失败!请检查设置!!!");
        }
    }

    public static synchronized Connection getConnection() throws SQLException {
        if (dataSource == null) {
            init();
        }
        Connection conn = null;
        if (dataSource != null) {
            conn = dataSource.getConnection();
        }
        return conn;
    }
}

DAO类:

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

public class EmpDAO {
    public static void main(String[] args) {
        EmpDAO dao = new EmpDAO();
        dao.findAll();
    }

    public void findAll() {
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            con = ConnectionSource.getConnection();
            stmt = con.createStatement();
            rs = stmt
                    .executeQuery("select empno, ename, sal, hiredate from emp");
            while (rs.next()) {
                System.out.println(rs.getInt("empno") + ","
                        + rs.getString("ename") + "," + ","
                        + rs.getDouble("sal") + "," + rs.getDate("hiredate"));
            }
        } catch (SQLException e) {
            System.out.println("数据库访问异常!");
            throw new RuntimeException(e);
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (SQLException e) {
                System.out.println("释放资源时发生异常");
            }
        }
    }
  }


© 著作权归作者所有

wow863597
粉丝 3
博文 38
码字总数 23132
作品 0
济南
程序员
私信 提问
【Java学习路线】新手该如何一步步的学习 Java

新手该如何一步步的学习 Java? 如果真的想学Java,最好要循序渐进,有章有法的学习它! 今天小慕就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容。 首先,给大家分享一张以 企业...

Eddie_yang
2018/11/15
1K
0
java 时间戳和PHP时间戳 的转换 php time()

最近在弄discuz,数据库mysql,时间类型int 10 原文http://hi.baidu.com/yuquan0405/item/ec4f804ac7e01c08e935046c 总结一下java 时间戳和PHP时间戳 的转换问题: 由于精度不同,导致长度不一...

干死it
2013/08/04
2.4K
0
Prometheus监控实践:使用Prometheus监控Java应用

之前在《Prometheus监控实践:Kubernetes集群监控》一本中总结了我们目前基于Prometheus对Kubernetes集群的监控,除了监控Kubernetes集群本身的关键指标之外,也对部署在Kubernetes集群上应用...

xiaomin0322
06/27
147
0
82% 用户仍在使用 Java 8,这对 Java 10 意味着什么?

Java 10 发布之后,不少开发者纷纷发声:Java 迭代太快了,我还停留在 Java 5,6,7,8......呢! 就这一现象,Jaxenter 对众多 Java 用户进行了调查,收集了近 300 条的反馈,并对数据进行的...

达尔文
2018/03/24
13.7K
56
JDBC连接各种数据库的字符串

JDBC连接各种数据库的字符串大同小异,在此总结一下,备忘。 oracle driverClass:oracle.jdbc.driver.OracleDriver url:jdbc:oracle:thin:@127.0.0.1:1521:dbname mysql driverClass:com...

长平狐
2012/08/27
877
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
8
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部