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

设计方案

通过此工具,操纵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.

推荐文献

java mysql 工具类_Java SE 之 数据库操作工具类(DBUtil)设计相关推荐

  1. java mysql 回滚_Java 中对数据库操作时的 回滚

    Connection conn=null; conn.rollback()就可以回滚 //用jdbc连接数据库 //举例子,比如你在写一个级联删除的方法的时候,为了保证数据完整性,删除的时候一定要确定 ...

  2. Java写一个excel工具类_Java中Excel写操作工具类--Java免费学习网

    核心提示:package com.common.excel;import com.common.excel.exception.WriteExcelException;import jxl.Workb ...

  3. Mysql和Oracle 数据库操作工具类

    适配Mysql和Oracle数据源 文章目录 1. 适配Mysql和Oracle数据源 2. 适配于Mysql数据源 3. 适配Oeacle数据源 1. 适配Mysql和Oracle数据源 packa ...

  4. java mysql教程基于_java基于jdbc连接mysql数据库功能实例详解

    本文实例讲述了java基于jdbc连接mysql数据库的方法.分享给大家供大家参考,具体如下: 一.JDBC简介 Java 数据库连接,(Java Database Connectivity,简称JD ...

  5. java mysql工具_Java开源数据库管理工具

    SQuirreL SQL Client SQuirreL SQL Client 是一个用 Java 编写的程序,它允许您查看数据库的内容.发出 SQL 命令,以及如您将看到的,执行许多其他功能.构建该 ...

  6. java mysql自动备份_java定时备份数据之二_MySQL

    以mysql为例: BackupDb.java数据库备份类: public class BackupDb { public static boolean sqlDump(String cmd,Stri ...

  7. java mysql 插入 乱码_java向mysql插入数据乱码问题的解决方法

    遇到java向mysql插入数据乱码问题,如何解决? MySQL默认编码是latin1 mysql> show variables like 'character%'; +----------- ...

  8. java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  9. java封装对象实体类_Java 接口自动化系列--实体类之entity封装

    实体包entity下面有4个类,主要存放java对象,每个类必须有私有属性,空参构造,get set方法 具体excel中数据信息见---工具类excel文章 1.API类 解析excel中接口信息的 ...

最新文章

  1. 展望数据中心市场未来十年发展趋势
  2. Dubbo 注解驱动(Annotation-Driven)
  3. C# WebProxy POST 或者 GET
  4. 2019-02-28-算法-进化(盛最多水的容器)
  5. c语言主函数名用户指定,C语言允许main函数带形参,且形参个数和形参名均可由用户指定。()...
  6. 软工网络15团队作业8——Beta阶段项目总结
  7. 2021-09-02最大矩形
  8. moviepy音视频开发:音频拼接函数concatenate_audioclips介绍
  9. UBUNTU完美运行TM,RTX,MSOffice,迅雷
  10. 【LwM2M】LwM2M协议官方文档
  11. webgl天空盒边界缝隙_基于webGL技术的3D库ThingJS支持天空盒技术实现
  12. 2022-03-11 工作记录--PHP-eq(表示等于)、 neq(表示不等于)
  13. python基本写法_Python的表达式写法
  14. 关于打麻将的高大上语言艺术
  15. 2D降噪3D降噪(NR:Noise Reduce)
  16. 所有科技人员是懂计算机的,指出违反什么规律.PDF
  17. 基于java springboot android安卓点餐外卖系统源码(毕设)
  18. 测试工程师常见面试题
  19. PowerBi - TopN+帕累托
  20. 小米手机NFC复制门禁卡读取芯片信息失败,报错103解决办法。

热门文章

  1. div弹窗页面onClick方法未定义原因分析
  2. 写CSDN博客时,调节字体、大小、颜色
  3. 队列、栈、BFS、DFS
  4. 了解奥迪品牌之百年传奇
  5. Moore型状态机和Mealy状态机
  6. B1000波状挡边大倾角皮带机 下运带式输送机 自清式U型刮板机 链板螺旋输送机 7.5螺旋输送机 翻转机械手 …CAD
  7. ITK输出mhd文件
  8. csgo职业选手config网站
  9. GDB调试利器-单步调试与查看变量
  10. 微信免密支付服务器忙,微信免密支付 查询用户授权记录,调起商家预授权 都返回系统繁忙...