`
Passager009
  • 浏览: 14418 次
  • 性别: Icon_minigender_1
  • 来自: 日照
社区版块
存档分类
最新评论

JDBC工具类 带有编码转换

    博客分类:
  • JDBC
阅读更多

JDBC工具类 不多解释了 注释写的挺全的

package com.sdu.utils;

import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @类功能说明:JDBC工具类
 * @公司名称:jinhou
 * @作者:WeiYC
 * @创建时间:2015-1-26 上午10:41:52
 */
public class JDBCUtility {
	private Connection conn;
	private Statement st;
	private PreparedStatement pps;
	private ResultSet rs;
	public String url = DBPropertiesUtility.getUrl();
	private String user = DBPropertiesUtility.getUser();
	private String password = DBPropertiesUtility.getPwd();
	private static String driver1 = "oracle.jdbc.driver.OracleDriver";
	
	private static String driver2 = "com.mysql.jdbc.Driver";
	
	// 加载驱动、放在静态代码块中,保证驱动在整个项目中只加载一次,提高效率
	static {
		try {
//			String driver = DBPropertiesUtility.getDriver(); 
			Class.forName(driver1);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取连接的方法
	 * 
	 * @return Connection 一个有效的数据库连接
	 */
	public Connection getConnection() {
		try {
			// 注意链接时,要换成自己的数据库名,数据库用户名及密码
			Connection con = DriverManager.getConnection(url, user, password);
			return con;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 用于执行更新的方法,包括(insert delete update)操作
	 * 
	 * @param sql
	 *            String 类型的SQL语句
	 * @return Integer 表示受影响的行数
	 */
	public int update(String sql) {
		// 定义变量用来判断更新操作是否成功,如果返回-1说明没有影响到更新操作的数据库记录条数,即更新操作失败
		int row = -1;
		try {
			// 如果数据库链接被关闭了,就要既得一个新的链接
			if (conn == null || conn.isClosed()) {
				conn = getConnection();
			}
			// 使用Connection对象conn的createStatement()创建Statement(数据库语句对象)st
			st = conn.createStatement();
			// 执行更新操作,返回影响的记录条数row
			row = st.executeUpdate(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return row;
	}

	/**
	 * 基于PreparedStatement的修改方法 PreparedStatement:表示预编译的 SQL 语句的对象
	 * 
	 * @param sql
	 *            String 类型的SQL语句(insert delete update)
	 * @param obj
	 *            存放动态参数的数组
	 * @return Integer 表示受影响的行数
	 */
	public int update(String sql, Object... obj) {
		try {
			// 获取链接
			if (conn == null || conn.isClosed()) {
				conn = getConnection();
			}
			// 创建预编译的 SQL 语句对象
			pps = conn.prepareStatement(sql);
			// 定义变量length代表数组长度,也就是预处理的sql语句中的参数个数
			int length = 0;
			// ParameterMetaData:用于获取关于 PreparedStatement 对象中每个参数的类型和属性信息的对象
			ParameterMetaData pmd = pps.getParameterMetaData();
			length = pmd.getParameterCount();
			// 循环将sql语句中的?设置为obj数组中对应的值,注意从1开始,所以i要加1
			for (int i = 0; i < length; i++) {
				pps.setObject(i + 1, obj[i]);
			}
			// 执行更新操作
			return pps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}

		return -1;
	}

	/**
	 * 获取一条记录的方法,要依赖于下面的queryToList方法,注意泛型的使用
	 * 
	 * @param sql
	 * @return Map<String,Object>
	 */
	public Map<String, Object> getOneRow(String sql) {
		// 执行下面的queryToList方法
		List<Map<String, Object>> list = queryToList(sql);
		// 三目运算,查询结果list不为空返回list中第一个对象,否则返回null
		return list.size() > 0 ? list.get(0) : null;
	}

	/**
	 * 返回查询结果列表,形如:[{TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}, {TEST_NAME=bbb,
	 * TEST_NO=3, TEST_PWD=bbb}...]
	 * 
	 * @param sql
	 * @return List<Map<String,Object>>
	 */
	public List<Map<String, Object>> queryToList(String sql) {
		// 创建集合列表用以保存所有查询到的记录
		List<Map<String, Object>> list = new LinkedList<Map<String, Object>>();
		try {
			if (conn == null || conn.isClosed()) {
				conn = getConnection();
			}
			st = conn.createStatement();
			rs = st.executeQuery(sql);
			// ResultSetMetaData 是结果集元数据,可获取关于 ResultSet 对象中列的类型和属性信息的对象
			// 例如:结果集中共包括多少列,每列的名称和类型等信息
			ResultSetMetaData rsmd = rs.getMetaData();
			// 获取结果集中的列数
			int columncount = rsmd.getColumnCount();
			// while条件成立表明结果集中存在数据
			while (rs.next()) {
				// 创建一个HashMap用于存储一条数据
				HashMap<String, Object> onerow = new HashMap<String, Object>();
				// 循环获取结果集中的列名及列名所对应的值,每次循环都得到一个对象,形如:{TEST_NAME=aaa, TEST_NO=2,
				// TEST_PWD=aaa}
				for (int i = 0; i < columncount; i++) {
					// 获取指定列的名称,注意orcle中列名的大小写
					String columnName = rsmd.getColumnName(i + 1);
					//进行编码设置
					int type = rsmd.getColumnType(i+1);
					if(type==Types.CHAR||type==Types.VARCHAR||type==Types.LONGVARCHAR){
						if(!CommonUtility.isEmpty(rs.getString(i+1))){
							String value="";
							try {
								 value = new String(rs.getString(i+1).getBytes("ISO-8859-1"),"GBK");
							} catch (UnsupportedEncodingException e) {
								e.printStackTrace();
							}
							onerow.put(columnName, value);
							System.out.println("列名:"+columnName+"   值:"+value);
						}
					}else{
						onerow.put(columnName, rs.getObject(i + 1));
						System.out.println("列名:"+columnName+"   值:"+rs.getObject(i + 1));
					}
				}
				// 将获取到的对象onewrow={TEST_NAME=aaa, TEST_NO=2,
				// TEST_PWD=aaa}放到集合列表中
				list.add(onerow);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return list;
	}

	/**
	 * 返回查询结果列表,使用的是预编绎SQL 语句对象PreparedStatement 形如:[{TEST_NAME=aaa, TEST_NO=2,
	 * TEST_PWD=aaa}, {TEST_NAME=bbb, TEST_NO=3, TEST_PWD=bbb}]
	 * 
	 * @param sql
	 * @param paramValues
	 * @return List<Map<String,Object>>
	 */
	public List<Map<String, Object>> queryWithParam(String sql,
			Object... paramValues) {
		// 创建集合列表用以保存所有查询到的记录
		List<Map<String, Object>> list = new LinkedList<Map<String, Object>>();
		try {
			if (conn == null || conn.isClosed()) {
				conn = getConnection();
			}
			pps = conn.prepareStatement(sql);
			for (int i = 0; i < paramValues.length; i++) {
				pps.setObject(i + 1, paramValues[i]);
			}
			rs = pps.executeQuery();
			// ResultSetMetaData 是结果集元数据,可获取关于 ResultSet 对象中列的类型和属性信息的对象
			// 例如:结果集中共包括多少列,每列的名称和类型等信息
			ResultSetMetaData rsmd = rs.getMetaData();
			// 获取结果集中的列数
			int columncount = rsmd.getColumnCount();
			// while条件成立表明结果集中存在数据
			while (rs.next()) {
				// 创建一个HashMap用于存储一条数据
				HashMap<String, Object> onerow = new HashMap<String, Object>();
				// 循环获取结果集中的列名及列名所对应的值,每次循环都得到一个对象,形如:{TEST_NAME=aaa, TEST_NO=2,
				// TEST_PWD=aaa}
				for (int i = 0; i < columncount; i++) {
					// 获取指定列的名称,注意orcle中列名的大小写
					String columnName = rsmd.getColumnName(i + 1);
					//进行编码设置
					int type = rsmd.getColumnType(i+1);
					if(type==Types.CHAR||type==Types.VARCHAR||type==Types.LONGVARCHAR){
						if(!CommonUtility.isEmpty(rs.getString(i+1))){
							String value="";
							try {
								 value = new String(rs.getString(i+1).getBytes("ISO-8859-1"),"GBK");
							} catch (UnsupportedEncodingException e) {
								e.printStackTrace();
							}
							onerow.put(columnName, value);
						}
					}else{
						onerow.put(columnName, rs.getObject(i + 1));
					}
				}
				// 将获取到的对象onewrow={TEST_NAME=aaa, TEST_NO=2,
				// TEST_PWD=aaa}放到集合列表中
				list.add(onerow);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return list;
	}

	/**
	 * 关闭数据库各种资源Connection Statement PreparedStatement ResultSet的方法
	 */
	private void close() {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		if (st != null) {
			try {
				st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (pps != null) {
			try {
				pps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		try {
			if (conn != null && !conn.isClosed()) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String args[]){
		JDBCUtility db = new JDBCUtility();
		Map<String,Object> map = db.getOneRow("select * from HIS_BASE_DEPARTMENT");
		System.out.println(map.get("DESCN"));
	}
		
}

配置文件获取类

package com.sdu.utils;
import java.io.IOException;
import java.util.Properties;

import com.sdu.utils.mail.PropertiesUtil;
/**
 * @类功能说明:静态读取数据库配置文件
 * @作者:WeiYC
 * @创建时间:2015-1-26 上午11:31:14
 */
public class DBPropertiesUtility {
	private static Properties pros = new Properties();				
	private static String CONFIG_FILE = "res/jdbc.properties";		//配置文件路径
	/**
	 * 静态执行一段代码,将配置文件读入到内存中
	 */
	static{
		try {
			pros.load(PropertiesUtil.class.getClassLoader().getResourceAsStream(CONFIG_FILE));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
    public static String getDriver(){
    	return pros.getProperty("oracle.driver");
    }
	
    public static String getUrl(){
    	return pros.getProperty("oracle.url");
    }
	
    public static String getUser(){
    	return pros.getProperty("oracle.user");
    }
	
    public static String getPwd(){
    	return pros.getProperty("oracle.password");
    }	
    
    public static void main(String args[]){
    	System.out.println(DBPropertiesUtility.getDriver());
    }
}

 

 

配置文件

#oracle数据库参数
oracle.driver=oracle.jdbc.driver.OracleDriver 
oracle.url=jdbc:oracle:thin:@192.168.1.120:1521:db
oracle.user=dbuser
oracle.password=123456 


#mysql数据库参数
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://192.168.1.120:3306/db
mysql.username=root
mysql.password=123456
mysql.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

 

项目目录结构

 

 

  • 大小: 175.9 KB
1
2
分享到:
评论

相关推荐

    04-完整JdbcUtils工具类.pdf

    JdbcUtils是一个封装了对数据库操作的Java工具类,主要使用JDBC(Java Database Connectivity)API来实现数据库操作。JDBC是Java的一个标准扩展,它提供了一组API用于执行SQL语句。以下是对JdbcUtils工具类的知识点...

    SupplyunittableUtil.java(中文乱码解决之道)

    `SupplyunittableUtil.java` 这个文件名暗示了这是一个Java工具类,专门用于处理“供应单位表”(可能是一个数据库表格或数据结构)的业务逻辑,并且这个类可能包含了针对中文乱码问题的解决方案。 中文乱码问题...

    Java程序员需要的面试笔试题目

    Java程序员在面试或笔试中可能遇到的...对于JDBC操作,理解编码转换的重要性;对于Servlet,掌握响应内容的正确编码设置;以及对于Web服务器,知道如何调整CLASSPATH以加载自定义类。这些都是Java开发者的必备技能。

    Java工程师必知必会.docx

    5. 掌握DBUtils工具类的使用、初步体会ORM思想 6. 初步具有独立阅读Java doc的能力 7. 能通过大公司的Java基础测试、数据库面试题 适合目标群体: 1. 在校的本专科院校大学生,有无基础均可,但必须对软件开发有...

    【SparkSql篇01】SparkSql之DataFrame和DataSet1

    从RDD转换为DataFrame有两种常见方式:手动转换和样例类转换。手动转换通常涉及创建一个Schema并使用`toDF()`方法。样例类转换更为推荐,因为它提供了类型安全和编译时检查。首先,定义一个样例类,然后使用...

    dbf格式文件导入orcle

    2. **第三方工具**: 如压缩包中的"DBF to Oracle v1.0 英文版",这类工具通常提供了图形化的界面,简化了导入过程。用户只需指定DBF文件和目标Oracle表,工具会自动处理数据转换和加载。这种方法对于不熟悉SQL*...

    空间数据库所需jar.rar

    Oracle 11g是一款强大的关系型数据库管理系统,它支持空间数据类型,使得存储和管理带有地理坐标的数据变得可能。 首先,我们需要理解什么是空间数据。空间数据是指包含地理空间位置信息的数据,如地图、地理坐标、...

    JAVA案例开发集锦(带源码)

    4. **IO流**:JAVA的IO流用于读写文件、网络通信等,案例可能会有文件读取、数据复制、字符编码转换等实际操作。 5. **多线程**:JAVA提供了强大的多线程支持,案例可能包含线程同步、线程池的使用,以及并发控制...

    Spring JdbcTemplate api

    在Spring框架中,`JdbcTemplate`是一个用于简化JDBC编程的工具类,它采用了模板模式来分离数据库访问中的不变和可变部分,提供了一种更加健壮且易于使用的数据访问机制。`JdbcTemplate`负责处理资源的获取、关闭以及...

    Java相关

    - **java.util**:熟悉List、Set、Map等集合框架,以及正则表达式、压缩、日期时间处理、随机数生成等工具类。 - **java.io**:理解输入输出流的概念,熟练使用File、BufferedReader/Writer、InputStream/...

    myBatis自动生成器

    生成的代码会带有清晰的注释,方便理解其功能和用法。 在实际应用中,使用MyBatis自动生成器需要注意以下几点: 1. 配置文件:需要正确配置数据库的URL、用户名、密码以及驱动类名,确保生成器能成功连接到数据库...

    Java程序员必备技能

    遵循一定的编码规范有助于提高代码的可读性和可维护性。例如,类名通常采用驼峰命名法(Camel Case),方法名以动词开头等。 #### 十、广度学习 除了以上技能之外,Java程序员还应当具备一定的广度知识。例如,...

    如何成为一个合格的Java程序员

    这要求对Java异常处理机制有深入理解,并能够运用调试工具和日志分析来排查问题。 ### 面向对象思想 面向对象编程(OOP)是Java的核心理念之一。理解封装、继承、多态等原则,能够设计出模块化、易于扩展和维护的...

    core java入门知识点汇总

    文档注释特别适用于自动生成API文档,可通过JDK自带的`javadoc`工具将这些注释转换成HTML格式的文档。 #### 五、标识符命名规则与约定 在Java中,标识符用于命名类、变量和方法。命名规则包括:以字母、下划线“_”...

    spring-demo:带有Spring框架的RESTful API

    本项目"spring-demo:带有Spring框架的RESTful API"是基于Spring框架创建的一个示例,展示了如何利用Spring来开发RESTful API。RESTful API是现代Web服务的标准设计模式,它强调了资源的概念并通过HTTP协议进行操作...

    myBatis3.2.2带源码和文档

    `mybatis-3.2.2-javadoc.jar` 提供了MyBatis的API文档,其中详细列出了所有类、接口、方法及注解的说明,是开发者快速查找和理解MyBatis功能的必备工具。通过文档,开发者可以了解如何配置SqlSessionFactory,创建...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例084 温度单位转换工具 105 实例085 域的默认初始化值 106 实例086 编写同名的方法 107 实例087 构造方法的应用 108 5.2 修饰符的使用 109 实例088 单例模式的应用 109 实例089 祖先的止痒药方 110 实例090 统计...

Global site tag (gtag.js) - Google Analytics