JDBC创建数据库基本连接

//1.加载驱动程序
Class.forName(driveName);
//2.获得数据库连接
Connection connection = DriverManager.getConnection(dbResource,username,password);
//
String sql = "";
//3.获得SQL处理语句
Statement statement = connection.createStatement();
PreparedStatement preparedStatement = connection.prepareStatement(sql); //更为安全
//4.获得SQL执行结果intint
boolean result1 = statement.execute(sql); //执行
int result2 = statement.executeUpdate(sql); //执行更新
ResultSet resultSet = statement.executeQuery(sql);//查询

DBUtil设计

关键问题

  + 通过JDBC实现对数据库记录的增、删、查、改。

  + 如何高效利用好数据库与服务器之间实现通信的有限的数据库连接资源?

    答案:JDBC+数据库连接池

    备注:

      1.每创建一Connection类对象,就是占用一条连接资源。
      2.更佳的设计,可参考开源工具C3P0数据库连接池解决方案。

ComboPooledDataSource pool = new ComboPooledDataSource(“demo”);
//pool.setUser("johnny");// (重新)设置用户姓名
//pool.setPassword("123456");// 用户密码
//pool.setJdbcUrl("databaseUrl");// MySQL数据库连接url
//pool.setDriverClass("com.mysql.jdbc.Driver");
//若是空参,自动到classpath目录下面加载“c3p0-config.xml”配置文件,若是maven项目,则放置于/resources目录下---配置文件的存储位置和名称必须是这样,且使用“默认配置”
Connection con = pool.getConnection();
//连接关闭之后,内存会被释放,下次取时会重新开(内存地址不共用)   

      另,推荐Apache开源工具Commons DBUtils:对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。

  + 如何设计架构良好(可扩展性好、高内聚低耦合、代码重用度高等DAO(Database Access Object)层

    答案:【IBaseDao + BaseDaoImpl】 + IBusinessDao + BusinessDaoImpl

    博文:Java SE 之 DAO层接口设计思想

设计方案

  通过此工具,操纵JDBC基础层的连接和配置。

  依赖工具:Eclipse + mysql-connector-java-5.1.7-bin.jar + junit-4.12.jar[可选项]

//dbutil.properties
user:root
password:123456
driver:com.mysql.jdbc.Driver
url:jdbc:mysql://127.0.0.1:3306/CorporationPropertyMS
//BDUtil.java

package com.cpms.test.junit;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; /**
* 数据库操作工具类【通过配置文件dbutil.properties配置】
*
* @author johnny zen
* @since 2017-11-3 19:43
*
* @param user
* @param password
* @param driver
* @param url
*/
public class DBUtil{
private static String packagePath = "src.com.cpms.test.junit";//default current package's path
private static Connection connection = null;
private static Statement statement = null;
private static Properties properties = null;
private static String _propertiesFilePath = "dbutil.properties";//default properties file's path static{
// get current file's work path(notice:absolute path)
String url = System.getProperty("user.dir") + "\\" + packagePath.replace(".", "\\") + "\\" + _propertiesFilePath; //open property file
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(url);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("[ DBUtil:ERROR ] "+ packagePath +" > open file failed!");
e.printStackTrace();
} properties = new Properties();
try {
properties.load(fileInputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("[ DBUtil:ERROR ] " + packagePath + " > load properties failed!");
e.printStackTrace();
}
try {
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("[DBUtil:ERROR ] " + packagePath + " > close file failed!");
e.printStackTrace();
}
System.out.println("[DBUtil:SUCCESS ] " + packagePath + " > load properties success!");
} //init properties
private static void initProperties(){
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("passsword"); if((driver == null)||(url == null)||(user == null)||(password == null)){
System.out.println("[DBUtil:ERROR ] " + packagePath + " > arguments[url/user/password/driver]'s value is not complete.");
}
} //(lazy) load connection
private static void loadConnection(){ //load Connection
try{
Class.forName(properties.getProperty("driver"));
}catch(ClassNotFoundException e){
System.out.println("[DBUtil:ERROR ] " + packagePath + " > load jdbc driver faild.");
e.printStackTrace();
} //connection database
try {
connection = DriverManager.getConnection(properties.getProperty("url"), properties);
} catch (SQLException e) {
System.out.println("[DBUtil:ERROR ] " + packagePath + " > [loadConnection] connection database faild.");
e.printStackTrace();
} System.out.println("[DBUtil:SUCCESS ] " + packagePath + " > [loadConnection] connection database success!"); } //get connection
public static Connection getConnection(){
if(connection == null){
loadConnection();
}
return connection;
} //reset properties file path
public static void setPropertiesFilePath(String propertiesFilePath){
_propertiesFilePath = propertiesFilePath;
} //get dbutil's proprties
public static Properties getProperties(){
return properties;
} }

测试:

@Test
public void DBUtilTest() {
Connection connection = DBUtil.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
int index = 0;//resultSet's index
String sql = "select * from employee"; //init prepareStatement
try {
preparedStatement = connection.prepareStatement(sql);
} catch (SQLException e) {
System.out.println("[Test:execute error]: load prepareStatement failed!");
e.printStackTrace();
} //execute SQL:get resultSet
try { resultSet = preparedStatement.executeQuery();
} catch (SQLException e) {
System.out.println("[Test:execute error]: execute sql failed!");
e.printStackTrace();
} try {
while(resultSet.next()){
//notice: resultSet.getObject(var):default: from 1 to n
System.out.println("[Test] " + index + ":" + resultSet.getObject(index + 1).toString());
index++;
}
System.out.println("[Test] row total is " + resultSet.getRow() + ".");
} catch (SQLException e) {
System.out.println("[Test:execute error]: iterate resultset failed!");
e.printStackTrace();
} }

  

输出:

[DBUtil:SUCCESS ] src.com.cpms.test.junit > load properties success!
[DBUtil:SUCCESS ] src.com.cpms.test.junit > [loadConnection] connection database success!
[Test] 0:employeeabcdefghijklmnopqrstvuwa
[Test] 1:department005abcdefghijklmnopqrs
[Test] 2:201611389
[Test] 3:毕雨兰
[Test] 4:123456
[Test] 5:M
[Test] 6:19
[Test] 7:501928199205291867
[Test] 8:2012-08-10 08:23:59.0
[Test] 9:1
[Test] row total is 0.

推荐文献

[1] JDBC详解

[2] Java SE 之 数据库操作工具类(DBUtil)设计

[3] Java SE 之 DAO层接口设计思想

[4] Dao层与连接池 

[5] ComboPooledDataSource(C3P0连接池配置)

Java SE 之 数据库操作工具类(DBUtil)设计的更多相关文章

  1. JAVA 数据库操作工具类----sqllite

    package com.asc.db; import android.content.ContentValues; import android.content.Context; import and ...

  2. 2017.11.5 Java Web ----案例:数据库访问JavaBean的设计

    (12)案例----数据库访问JavaBean的设计 例题:数据库操作在一个Web应用程序中的后台处理中占有大比重,设计一组JavaBean封装数据库的基本操作供上层模块调用,提高程序的可移植性. [ ...

  3. JavaWeb网上图书商城完整项目-数据库操作工具类2-MapHandle的高级用法

    1.现在在上面一章的基础上,我们引入一个address表,该表记录person类的地址,address表的格式如下所示 现在person类要和address表想关联,得到当前联系人的住宅地址,我们应该 ...

  4. JavaWeb网上图书商城完整项目-数据库操作工具类

    1.首先安装数据库,在windows上安装和在unix上面安装环境不一样,我在自己的本地电脑上安装,安装成功之后,如果使用navicat远程工具访问,需要允许mysql远程能被访问 方法二.直接授权( ...

  5. Java SE学习笔记 --->高级类特性 ---> toString() 方法

    概述: toString() 方法在面向对象当中十分常见,使用频率很高,和equals() 方法一样,也是Object类中定义的方法. jdk中 源码: java.lang.Object类中ToStr ...

  6. Mysqlutil.JDBCutil.Dtabaseutil数据库操作工具类[批量操作]

    一个用来操作数据库的常用工具类. 提供批量操作,生成建表,插入语句等 操作示例: // 1.获取连接 DataBaseUtil jdbc = new DataBaseUtil(); jdbc.getC ...

  7. 用泛型写Redis缓存与数据库操作工具类

    功能描述: 先从缓存获取数据,如果缓存没有,就从数据库获取数据,并设置到缓存中,返回数据. 如果数据库中没有数据,需要设置一个缓存标记flagKey,防止暴击访问数据库,用缓存保护数据库. 当删除缓存 ...

  8. JAVA开发中如何优化类的设计

    具体类依赖于抽象类,而非抽象类依赖于具体类.这样做有利于一个抽象类扩展多个具体类. 开放封闭原则:对扩展开放,对修改封闭. 1.永远保持数据私有 保持数据的私有是设计类时,必须重点考虑的问题.保持私有 ...

  9. Java SE 之 DAO层接口设计思想

    用图说话 好处 1.只需要定义好IBaseDao的接口方法,并只需要实现BaseDaoImpl的方法,而具体的业务类和业务类/接口的方法的基本方法(IBaseDao已定义的)并不需要再考虑实现. 2. ...

随机推荐

  1. rabbitmq线上服务器与项目结合的问题总结

    一.特殊字符需要转义 只需要加个\反斜杠就可以了 二.zk的connectString 在rabbit web页面上登录上去,新增queue就可以了

  2. 【Java】初始化

    默认域初始化 如果在构造器中没有显示地给域赋予初值,那么就会被自动赋予默认值:数值为0,布尔值为false,对象引用为null. 无参数构造器 很多类都包含一个无参数的构造函数,对象由无参数构造函数创 ...

  3. Quartz.Net—MisFire

    什么是misfire misfire就是哑火,就是trigger没有得到正常的触发. 1.所有的threadpool都在工作,而且工作时间很长,导致trigger没有threadpool去执行. 2. ...

  4. python 从filelist.txt中拷贝文件到另一文件夹中

    #! python #coding:utf-8 ##!/usr/bin/python # Filename : fileCp.py import sys import os import shutil ...

  5. BZOJ4822[Cqoi2017]老C的任务——树状数组(二维数点)

    题目描述 老 C 是个程序员.     最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C 轻松 地完成了系统的大部分功能,并把其中一个功能交给你来实 ...

  6. npm指向淘宝源

    临时 npm --registry https://registry.npm.taobao.org install express1 持久 npm config set registry https: ...

  7. 日志收集-Elk6

    一:前言 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件.新增了一个FileBeat,它是一个轻量级的日志收集处理工具(A ...

  8. Spring的编程式事务和声明式事务

    事务管理对于企业应用来说是至关重要的,当出现异常情况时,它也可以保证数据的一致性. Spring事务管理的两种方式 spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务使用Transa ...

  9. Navicat的使用技巧

    1.快速查找表:选中一个数据库,然后在右侧会弹出如下的搜索框,搜索表名即可 2.快速清空表的内容:在窗口选中一张表,右键,选择“清空表”

  10. Java 8 的 Metaspace

    Java 8 的 Metaspace https://www.cnblogs.com/xrq730/p/8688203.html 被废弃的持久代 想起之前面试的时候有面试官问起过我一个问题:Java ...