在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程。尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了。

这些参数本来可以是在调用的时候再给的。以前学习过将工具类和测试类分开写的好处,下面就介绍数据库的工具类,它可以避免代码的臃肿的缺点。学会自己写一个数据库工具类,方便以后直接用。关键还是学会其中的编写思路。

一、创建数据库工具类

创建工具类的内容:

1.私有化构造方法

(防止别人欠欠new本类实例,也就是说这段程序也不是单例模式,工具运行时一个实例都没有)

2.工具类里面有得到连接的方法

3.工具类里面有关闭资源的方法

4.工具类里面有注册驱动类

二、创建数据库工具类具体操作及注意事项

1.私有化构造方法

public class DBUtil {
// 私有化构造方法
private DBUtil() {
}
}

2.工具类里面有得到连接的方法

//得到連接(Connection需导包)
public static Connection getConn(){
//return null;(先这样顶一下,不然编译器会报错)
try {
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/t_employee","root","root");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

注意:当有执行语句之后,return null;要放在执行语句的后面。这个错误我找了3分钟。

    public static Connection getConn(){
try {
Connection conn=DriverManager.getConnection(url,user,password);//注意:这里就不要加双引号了。
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

升级版代码:

public static Connection getConn(){
Connection conn=null;
try {
conn=DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
//这里异常可以按照需求再设置一下,将问题反馈给用户
throw new RuntimeException("获取连接失败");
}
return null;
}

注意:

在getConnection中,三个参数(url,用户名、密码)都写死了,不是很使用。解决:可以在前面声明)。另外,考虑到在public static Connection getConn(){}这个静态的方发里,静态方法不可以访问实例对象成员,所以,在前面声明三个参数的时候,都要加上static修饰(static写在private的左边或者右边,都可以。编译器不会不报错)。

    private static String url="";
private static String user="";
private static String password="";
Connection conn=DriverManager.getConnection(url,user,password);

3.工具类里面有关闭资源的方法

    public static void close(ResultSet rs, Statement stm, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (stm != null) {
try {
stm.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
} }
}

4.工具类里面有注册驱动类

一般来说,驱动类可以写在private DBUtil(){}这个构造方发里,但是,这个构造方法在创建时的初衷是为了不让别人new本类实例,驱动加载这里,就违背了这一点。

在写注册驱动类时,考虑把它写在单独的静态代码块里面。

好处:静态代码块只加载一次!!!恰好符合驱动类只需加载一次的特性。

    static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

注意:"com.mysql.jdbc.Driver"又是写死的状态,不实用。解决办法——在前面声明。

private static String className="";
static{
try {
Class.forName(className);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

注意:

在加载驱动类的时候,如果忘记加jar包,就会抛出如下的异常。(这种错误很常见!)

Could not initialize class.DBUtil

三、测试类就会变得很轻盈

import java.sql.Connection;
import java.sql.Statement; public class TestDemo {
public static void main(String[] args) {
add();
} static void add() {
Connection conn = null;
Statement stm = null; try {
conn = DBUtil.getConn();
stm = conn.createStatement();
String sql = "insert into t_employee(name,age,salary) values('阿三',23,90000)";
// 切记:阿三要用单引号!!!
stm.executeQuery(sql); System.out.println("执行成功");// 加一句,打印到控制台,验证程序没挂 } catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(null, stm, conn);
// 第一个参数rs会报错:rs cannot be resolved to a variable,这里用null顶一下。
} }
}

注意:下面这条代码

stm.executeQuery(sql);

当上面的add(){}被设置为void(无返回值)即,static void add(){}时,用stm.executeQuery(sql);

当上面的add(){}被设置为有返回值时,比如static add(){}时,用stm.executeQueryUpdate(sql);

Java JDBC的基础知识(三)的更多相关文章

  1. Java JDBC的基础知识(二)

    在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...

  2. Java JDBC的基础知识(五)

    本文主要记录JDBC基础知识之后的部分内容.另外,我看到<Java核心基础2>中第四章是主要介绍数据库编程的.里面有一些说明和应用特别灵活,有些部分也太容易理解,建议大家看一下.这篇是依然 ...

  3. Java JDBC的基础知识(一)

    一.为什么引入JDBC 在学习JDBC之前,抛开它的概念,我先按照我的理解解释一下,为什么要引入JDBC.在我看来,引入JDBC跟我之前学过的引入JVM(Java虚拟机)有些相似之处.当然,关于JVM ...

  4. Java JDBC的基础知识(四)

    之前学习了如何创建一个数据库工具类,如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...

  5. java 基础知识三 java变量

    java  基础知识 三 变量 1.作用域 {} 包围起来的代码 称之为代码块,在块中声明的变量只能在块中使用 2.常量 就是固定不变的量,一旦被定义,它的值就不能再被改变. 3.变量 变量必须在程序 ...

  6. 第76节:Java中的基础知识

    第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...

  7. JAVA核心技术I---JAVA基础知识(工具类Arrays和Collections类)

    一:工具类 –不存储数据,而是在数据容器上,实现高效操作 • 排序 • 搜索 –Arrays类 –Collection类 二:Arrays类(处理数组) (一)基本方法 –排序:对数组排序, sort ...

  8. JAVA核心技术I---JAVA基础知识(static关键字)

    一:static特殊关键字用处 –变量 –方法 –类 –匿名方法 二:静态变量:类共有成员 –static变量只依赖于类存在(通过类即可访问),不依赖于对象实例存在. –所有的对象实例,对于静态变量都 ...

  9. Java并发(基础知识)—— Executor框架及线程池

    在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有 ...

随机推荐

  1. 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

    在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及 ...

  2. 企业项目开发--cookie(2)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2.1.3.CookieUtil:(cookie的基本操作:增删查,注意没有改)  1 package co ...

  3. docker容器备份、恢复和迁移volume方案

    volume作为数据的载体,在很多情况下需要对其中的数据进行备份.迁移或是恢复.下面一docker容器的volume为例,说一下备份的技巧. 我们先建立一个容器vol_simple,该容器在/date ...

  4. python3 os.path.realpath(__file__) 和 os.path.cwd() 方法的区别

    python3 os.path.realpath(__file__) 和 os.path.cwd() 方法的区别 os.path.realpath 获取当前执行脚本的绝对路径. os.path.rea ...

  5. Liferay开发实战(2):Service Builder生成持久化层,及开发服务层

    本文Liferay适用版本:v6.2.ce-ga6版 Liferay的插件体系是:模型-视图-控制器的portlet MVC框架.MVC是一个伟大的用于Web应用程序的设计模式,在实际应用中还应处理持 ...

  6. oracle RAC srvctl命令关闭节点实例的时候 不能正常执行

    场景描述: [oracle@oracle01 admin]$ srvctl stop database -d oradb1 PRCD- : The resource for database ORAD ...

  7. 剑指offer十四之链表中倒数第k个结点

    一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结 ...

  8. 剑指offer九之变态跳台阶

    一.题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.思路 1.关于本题,前提是n个台阶会有一次n阶的跳法.分析如下: f(1) ...

  9. awk将某个字段按照分隔符分割之后统计次数

    cat label_movie2|grep BBD252CC0A4FE7D10C990261D5CEACB5|awk -F "," '{for(i=2;i<NF;i++) p ...

  10. (转载)es进行聚合操作时提示Fielddata is disabled on text fields by default

    原文地址:http://blog.csdn.net/u011403655/article/details/71107415 根据es官网的文档执行 GET /megacorp/employee/_se ...