JDBC实现用于操作数据库Mysql的工具类JDBCTools

  下面用一个统一的工具类封装一套用于数据库的JDBC操作:包括 1)获取数据库链接资源  2)释放数据库链接资源,包括Connection,Statement,PreparedStatement,ResultSet等 3)数据库的更新操作,包括插入,删除,修改  4)数据库的查询操作

  首先是1)获取数据库链接资源

     /**
	 * 获取数据库链接的静态方法  这样子就保证了只加载一次文件的操作
	 * @return
	 * @throws Exception
	 */
	public static Connection getConn() throws Exception{

		String jdbcDriver=null;
		String url=null;
		String user=null;
		String password=null;

		Properties p=new Properties();
		InputStream is=
				JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
		p.load(is);

		jdbcDriver=p.getProperty("jdbcDriver");
		url=p.getProperty("url");
		user=p.getProperty("user");
		password=p.getProperty("password");

		Class.forName(jdbcDriver);

		return DriverManager.getConnection(url, user, password);
	}

 

    其中  jdbc.properties  是属性配置文件,因为是通过  类名.class.getClassLoader().getResourceAsStream("jdbc.properties");获取的,所以

该属性配置文件需要放置在src目录下。其内容的例子:

  jdbcDriver=com.mysql.jdbc.Driver
  url=jdbc:mysql://localhost:3306/test
  user=root
  password=root

    接着是2)释放数据库链接资源

        /**
	 * 关闭从数据库服务器等索取的资源:先关闭后获取的
	 * @param conn
	 * @param pstmt
	 */
	public static void closeResource(Connection conn,Statement stmt,ResultSet rs){

		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

  由于PreparedStatement是Statement的子接口,所以该方法也适合传入PreparedStatement的对象

  然后是3)数据库的更新操作,包括插入,删除,修改

        /**
	 * 统一的更新操作 Statement:insert update delete
	 * @param conn
	 * @param sql
	 * @throws Exception
	 */
	public void update(String sql){

		Connection conn=null;
		Statement stmt=null;

		try {

			conn=JDBCTools.getConn();
			stmt=conn.createStatement();
			stmt.executeUpdate(sql);

		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			closeResource(conn, stmt, null);
		}
	}

	/**
	 * 适用于PreparedStatment
	 * @param sql
	 * @param args
	 */
	public void update2(String sql,Object ... args){
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;

		try {

			conn=JDBCTools.getConn();
			pstmt=conn.prepareStatement(sql);

			for(int i=0;i<args.length;i++){
				pstmt.setObject(i+1, args[i]);
			}

			pstmt.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			JDBCTools.closeResource(conn, pstmt, rs);
		}
	}

  其中这段代码:for(int i=0;i<args.length;i++){ pstmt.setObject(i+1, args[i]); } 的意思在于:设置SQL语句中的占位符 ? 的值。

  最后是4)数据库的查询操作:在这里写了通用的方法,目的在于将查询得到的结果集封装在统一的实体中,这里采用了泛型,反射机制的知识

        /**
	 * 泛型方法  反射机制  通用的查询方法存储实体
	 * @param clazz
	 * @param sql
	 * @param args
	 * @return
	 */
	public <T> T getT(Class<T> clazz,String sql,Object ... args){
		T t=null;

		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;

		ResultSetMetaData rsmd=null;

		try {

			conn=JDBCTools.getConn();
			pstmt=conn.prepareStatement(sql);

			for(int i=0;i<args.length;i++){
				pstmt.setObject(i+1, args[i]);
			}

			rs=pstmt.executeQuery();

			if (rs.next()) {
				t=clazz.newInstance();

				Map<String, Object> map=new HashMap<String, Object>();

				//解析sql获取对象
				rsmd = rs.getMetaData();
				int numberOfColumns = rsmd.getColumnCount();

				for(int i=0;i<numberOfColumns;i++)
				{                        //获取列的名字,如果有别名,则获取的是别名
					String columnName=rsmd.getColumnLabel(i+1);
					map.put(columnName, rs.getObject(columnName));
				}

				if (map.size() > 0) {

					for(Map.Entry<String, Object> entry: map.entrySet())
					{
						String columnName=entry.getKey();
						Object columnValue=entry.getValue();

						Field field = t.getClass().getDeclaredField(columnName);
						field.setAccessible(true);
						field.set(t, columnValue);
					}

				}

			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			JDBCTools.closeResource(conn, pstmt, rs);
		}

		return t;
	}
时间: 2024-10-10 03:00:29

JDBC实现用于操作数据库Mysql的工具类JDBCTools的相关文章

07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao

 1  创建day14数据库,创建user.sql表: A 创建数据库 day14 B 创建数据表 users create table users ( id int primary keyauto_increment, username varchar(20), password varchar(20) ); 2  添加依赖的jar包 c3p0-0.9.1.2.jar mysql-connection-java-5.0.8-bin.jar commons-beanutils-1.8.0.j

php 通过mysqli 操作数据库mysql

目录 php mysqli 操作数据库 连接数据库 通过mysqli 创建数据库 通过mysqi 创建数据表 通过mysqli向数据表中插入信息 通过mysqli 读取数据 where语句的应用 通过mysqli删除数据 php mysqli 操作数据库 连接数据库 在php5.3版本之后,想要连接数据库有两种方案,一种是通过mysqli,另外外一种是通过pdo.本文主要说的是如果通过mysqli面向对象的写法操作数据库. 在连接数据库之前,需要先通过变量存储好数据库的基本连接信息. $serv

【原创】POI操作Excel导入导出工具类ExcelUtil

关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.ThreadLocalMap以当前ThreadLocal为key进行存储,设置一次变量,则其他线程也会有上次数据的残留,因此在addMergeArea方法中进行清空的操作.为了保证原子性, 采用ReentrantLock确保一次只有一个线程可以进行添加合并数据的操作. 线程安全性从以上两个方面保证. 水

mysql ----BaseDao工具类

package com.zjw.dao; import java.sql.*; /** * 工具类 */ public class BaseDao { static final String DB_URL = "jdbc:mysql://localhost:3306/数据库"; static final String username = "用户名"; static final String paw = "密码"; protected Conne

Java操作属性文件之工具类

最近空闲时间整理一下平时常用的一下工具类,重复造轮子实在是浪费时间,如果不正确或者有待改善的地方,欢迎指教... package com.hsuchan.business.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Propertie

HttpUtils 用于进行网络请求的工具类

原文:http://www.open-open.com/code/view/1437537162631 import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java

python 操作数据库(mysql)

1.安装插件网上很多不在啰嗦. 2.连接数据库后创建一个表 MySQLdb conn = MySQLdb.connect(         =,         =,         =,         =,         =,         ) cur = conn.cursor() cur.execute() 3.增加一条数据 MySQLdb conn = MySQLdb.connect(         =,         =,         =,         =,     

02_c3p0之c3p0-config.xml配置案例,操作c3p0的jdbcUtil工具类的编写

 c3p0也是一个开源jdbc连接池,我们熟悉的Hibernate和Spring框架使用的都是该数据源. 这里获得数据源使用的方法是:ComboPooledDataSource 它提供的构造方法有: ComboPooledDataSource() ComboPooledDataSource(boolean autoregister) ComboPooledDataSource(java.lang.String configName) 通过第三个构造方法读取配置文件,它的配置文件是一个xml文

java操作数据库的通用的类

package cn.dao; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet;