package com.hx.jdbc.connection;

import java.sql.Connection;
import java.sql.Statement; import com.mysql.jdbc.UpdatableResultSet; import junit.framework.TestCase; public class JDBCText extends TestCase {
/**
* 创建一个insert,update,delete通用的方法
* @param sql
*/
public void upDate(String sql){
Connection conn=null;
Statement statement=null;
try {
conn=JDBCTools.getConnection2();//调用工具类中的getConnection2()方法完成数据库连接
statement=conn.createStatement();
statement.executeUpdate(sql);//执行sql语句
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCTools.guanbi(statement, conn);//调用工具类中的guanbi()方法来完成关闭statement和conn
} }

以上是一个JDBC访问数据库的增加,修改,删除通用的方法。其中完成数据库连接和关闭数据库的***重复且通用***的操作写在了工具类JDBCTools.java中,如下:

package com.hx.jdbc.connection;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; public class JDBCTools { /**
* 这是连接数据库的方法,放到此工具类中
* @return
* @throws Exception
*/
public static Connection getConnection2() throws Exception{
//1.创建数据库的4个字符串 //2.创建Properties对象
Properties properties=new Properties();
//3.获取jdbc.pro对应的输入流
InputStream in=
JDBCTools.class.getClassLoader().getResourceAsStream("com/hx/jdbc/connection/jdbc.properties");
//******此处重点关注******
//**********************
//******因为我出错了******
//**********************
System.out.println(in);//当时我报错上面一行代码空指针异常,此处打印in,输出null,
                  //知道上面一句代码并没访问到jdbc.properties配置文件,开始我直接写的jdbc.properties
                  //应该写根目录下的jdbc.properties
//4.加载输入流
properties.load(in);
//5.具体决定4个字符串的值
String driver=properties.getProperty("driver");
String jdbcUrl=properties.getProperty("jdbcUrl");
String user=properties.getProperty("user");
String password=properties.getProperty("password");
//6.加载数据库驱动程序
Class.forName(driver);
//7.通过DriverManager的getConnection()方法获取数据库连接
Connection conn=DriverManager.getConnection(jdbcUrl, user, password);
return conn; }
  /**
  *这是关闭数据库的工具方法,因为曾删改都需要用,所以写在此工具方法中
  */
public static void guanbi(Statement statement,Connection conn){
if(statement!=null){ try {
statement.close();
} catch (Exception e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (Exception e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
}
}

以上的工具代码中我出错了,出错的原因如下:

首先用类加载资源文件的方式可以有以下三种: (包结构图)

1)InputStreaminStream=DaoFactory.class.getResourceAsStream("dao.properties");

​2)inStream=DaoFactory.class.getResourceAsStream("/com/jdbc/dao/dao.properties")

3)inStream=DaoFactory.class.getClassLoader().getResourceAsStream("com/jdbc/dao/dao.properties");

第一种和第二种方式是采用Class对象去加载,第三种采用ClassLoader对象去加载资源文件,之所以Class对象也可以加载资源文件是因为Class类封装的ClassLoader的getResourceAsStream方法。从Class类中的源码中可以看出:

​​之所以这样做无疑还是方便客户端的调用,省的每次获取ClassLoader才能加载资源文件的麻烦。

路径问题:

1. 第三种是最本质的做法,前两种也是基于第三种去实现的。JVM会使BootstrapLoader去加载资源文件。所以路径还是这种相对于工程的根目录即"com/jdbc/dao/dao.properties"(不需要“/”)。

2. 第一种是采用的相对路径,资源文件相对于当前这个类即(DaoFactory类)的位置,这种方式Class对象做了一些处理。即resloveName(name)这个方法。最终name还是会转换成适合第三方式的name参数

3. 第二种是采用绝对路径,绝对路径是相对于classpath根目录的路径(工程里src目录对应bin目录(存放.class文件的目录))。

然后下面是我的jdbc.properties配置文件

driver=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/students
user=root
password=5678

下面是调用upDate()方法进行增删改操作:

package com.hx.jdbc.connection;

public class Test {
public static void main(String[] args) {
String sql="INSERT INTO t_student(NAME,age,email) VALUES('78878','22','999999999')";
//String sql="DELETE FROM t_student where id=3";
//String sql="UPDATE t_student set name='66666',age='100',email='000' where id=3";
JDBCText j=new JDBCText();
j.upDate(sql);
}
}

JDBC的增删改写成一个方法,调用一个工具类的更多相关文章

  1. 用Java开发一个工具类,提供似于js中eval函数功能的eval方法

    今天在看到<Java疯狂讲义>中一个章节习题: 开发一个工具类,该工具类提供一个eval()方法,实现JavaScript中eval()函数的功能--可以动态运行一行或多行程序代码.例如: ...

  2. Struts2-整理笔记(二)常量配置、动态方法调用、Action类详解

    1.修改struts2常量配置(3种) 第一种 在str/struts.xml中添加constant标签 <struts> <!-- 如果使用使用动态方法调用和include冲突 - ...

  3. 判断状态栏是否显示以及获取状态栏高度的方法,及工具类列子【续:及OnGlobalLayoutListener的利用】

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0731/1640.html 本篇博客是http://www.cnblogs.co ...

  4. 判断一个类到底是从哪个jar包中调用的工具类

    项目中使用的jar包较多时,会出现jar冲突的情况,有时候很难判断当前使用的这个类是从哪个jar包中调用的.因为一般我们只能看到jar包的名称,不清楚其中的类的目录结构. 这个类的作用就是说明当前调用 ...

  5. java Http消息传递之POST和GET两种方法--通过实用工具类来获取服务器资源

    实现该方法需要导入一些jar包 可以去一下地址下载: http://pan.baidu.com/s/1hqrJF7m /** * 实用工具类来获取服务器资源 * * get方法传送数据 * * 1.通 ...

  6. 21.1 Math(数学运算)方法使用 、工具类

    package day21_static.meathDemo; //Math: 包含一些基本的数学运算方法 //从api中搜Math,它都用的static修饰. public class MethDe ...

  7. 简单的main方法调用一个加减法函数背后的细节

    测试程序 /* * AddTest.c * * Created on: 2019年10月13日 * Author: appweb */ #include <stdio.h> int add ...

  8. java调用svnkit工具类上传本地文件到svn服务器

    package org.jenkinsci.plugins.svn.upload.step; import java.io.*; import org.tmatesoft.svn.core.SVNCo ...

  9. Java模拟http请求远程调用接口工具类

    package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRea ...

随机推荐

  1. GO语言练习:多返回值函数

    1.代码 2.运行 1.代码 package main import ( "fmt" "strconv" ) func getValue(n int) (flo ...

  2. 修改linux运行级别

    1.Linux下的7个运行级别 0 系统停机模式,系统默认运行级别不能设置为0,否则不能正常启动,机器关闭. 1 单用户模式,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登 ...

  3. mysql命令行参数(转)

    MySQL命令行参数 Usage: mysql [OPTIONS] [database] //命令方式  -?, --help //显示帮助信息并退出  -I, --help //显示帮助信息并退出  ...

  4. select在各个浏览器中的兼容性问题

    我们知道select标签在各个浏览器中的属性和各浏览器的支持各有些不同,从而造成select选择框在各浏览器的显示有不同. 下面我们通过对主要CSS属性的支持,打造全兼容select. 对select ...

  5. 获取Android studio的SHA1值

    D:\Android\BaiduMapsApiASDemo>c: C:\>cd .android 系统找不到指定的路径. C:\>cd Users C:\Users>cd Ad ...

  6. Odoo Website 替换 Summernote 为第三方富文本编辑器

    随着用odoo的人越来越多,奇葩的需求也是越来越多.... 这不,有同学就想替换掉website forum里边的summernote控件,花了点时间研究了一下,先说结论:替换是可行的. 先上替换之后 ...

  7. cloudsim安装,配置(到eclipse)

    现在基本成功了.所以将这个过程尽量详细的,准确的分享出来,以供大家的需要.       一.Jdk,Eclipse的安装与配置. 本人下载的jdk版本是1.8,jdk的相关配置网上有很多,我就不赘述了 ...

  8. A+B Problem III-(涉及误差)NYOJ-477

    描述求A+B是否与C相等.   输入 T组测试数据. 每组数据中有三个实数A,B,C(-10000.0<=A,B<=10000.0,-20000.0<=C<=20000.0) ...

  9. html 锚点的使用

    html 锚点 到底是干吗的?通俗简单地说,比如一篇很长的文章,你想按分段精确来看,那就可以用到锚点了. 代码:<a href="#001">跳到001</a&g ...

  10. C#编程总结 字符转码

    为了适应某种特殊需要,字符需要根据规则进行转码,便于传输.展现以及其他操作等. 看看下面的转码,就知道他的用处了. 1.字符串转码 根据原编码格式与目标编码格式,完成转换.不过可能出现乱码哦.上一章已 ...