JDBC的增删改写成一个方法,调用一个工具类

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);
    }
}
时间: 2024-10-26 05:08:36

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

迭代器遍历【List、Set、Map】&& 遍历集合的方法总结 && Collections工具类

整理&&总结 迭代器遍历Iterator[List.Set.Map]example 1 package boom.collection; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.HashSet; 6 import java.util.Iterator; 7 import java.util.List; 8 import java.util.Map; 9 import jav

封装一个工具类实现JDBC与MySQL数据库的连接

package com.cn.jdbc; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; public class JDBC_Connection { //加载驱动,链接数据库 public stati

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

实现该方法需要导入一些jar包 可以去一下地址下载: http://pan.baidu.com/s/1hqrJF7m /** * 实用工具类来获取服务器资源 * * get方法传送数据 * * 1.通过path设定传送方式 * 2.创建客户端 * 3.得到输入流 * 4.读取流准备工作 * 5.读取并写入 * @throws IOException * @throws ClientProtocolException * */ 1 public static String getHttpResul

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

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

对HttpClient实现的 HTTP 方法中get、post有无参数方法抽取一个公共类

/** * 抽取一个公共的类 * * @author xz * */ @Service public class ApiService { @Autowired private RequestConfig config; @Autowired private CloseableHttpClient httpClient; /** * 无参的get请求 * * @param url * @return */ public String doGet(String url) { // HttpGet对

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

package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 用于模拟HTTP请求中GET/POST方式 * @author landa *

03-05单例模式_方法调用

方法调用 考虑一种日志情形. 有多个程序会调用一个 MyLog 类来生成日志对象. 日志对象实际上向某大型设备输出. 要求MyLog类使用单例模式,最多只能有两个实例.调用getInstance()获得一个实例. 每个实例有busy或free的状态,表示是否为空闲.假如所有实例都是busy的,则返回空指针. class MyLog { private static MyLog a = new MyLog(); private static MyLog b = new MyLog(); priva

Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)

今天在使用Spring cache的Cacheable注解的过程中遇见了一个Cacheable注解失效的问题,检查问题发生的原因是因为Spring的Cacheable注解是基于Spring AOP实现的,但是类内部方法互相调用时不会被Spring AOP拦截的,所以导致被调用方法的Cacheable注解失效,特此记录. 问题复现 @Service public class UserServiceImpl{ @Override public User detail(Long id) { // 校验

JDBC工具类连接数据库,模仿登录

## 使用JDBC工具类的原因在使用JDBC连接数据库的时候,加载驱动.获取连接.释放资源等代码是重复的,所有为了提高代码的复用性,我们可以写一个工具类,将数据库驱动加载.获取连接.资源释放的代码封装起来.同时,为了使工具类的灵活性,可以将数据库的驱动.url.用户名.密码等信息以键值对的形式存放在properties文件中,工具类初始化时从配置文件中读取所要连接数据库的信息.当需要更改连接的数据库时,只需要更改配置文件即可,而不必改写工具类的代码. ## 工具类实现```import java