DButils工具类能够用来获取数据库连接向数据库插入更新删除对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DButils工具类能够用来获取数据库连接向数据库插入更新删除对象相关的知识,希望对你有一定的参考价值。

package com.ctl.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.lang.reflect.*;
import java.sql.*;
import java.util.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

/**
 * @author Administrator
 * @category
 
 
 
 
 
 */
public class DButils {
	private static String driver;
	private static String url;
	private static String username;
	private static String password;
	private static Connection conn;
	private static ThreadLocal<Connection> connHolder = new ThreadLocal<Connection>();
	static {
		driver = RegisterUtil.getStringFromSystemRoot("mysql.driver");
		url = RegisterUtil.getStringFromSystemRoot("mysql.url");
		username = RegisterUtil.getStringFromSystemRoot("mysql.username");
		password = RegisterUtil.getStringFromSystemRoot("mysql.password");
		try {
			Runtime.getRuntime().exec("net start mysql");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	static class KeyValue {
		Object key;
		Object value;

		public Object getKey() {
			return key;
		}

		public void setKey(Object key) {
			this.key = key;
		}

		public Object getValue() {
			return value;
		}

		public void setValue(Object value) {
			this.value = value;
		}

		public KeyValue() {
			super();
		}

		public KeyValue(Object key, Object value) {
			super();
			this.key = key;
			this.value = value;
		}

		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return this.key + ":" + this.value;
		}

	}

	/**
	 * 
	 * @return Connection
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */

	public static Connection getConnection() {
		conn = connHolder.get();
		try {
			if (conn == null || conn.isClosed()) {
				Class.forName(driver);
				conn = DriverManager.getConnection(url, username, password);
				conn.setAutoCommit(false);
				connHolder.set(conn);
			}
		} catch (Exception e) {
			init();
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * @category 依据sql得到记录总数
	 * @param sql
	 * @return int 假设返回-1代表出错
	 */
	public static int getCount(String sql) {
		try {
			ResultSet rs = getConnection().createStatement().executeQuery(sql);
			if (rs.next()) {
				return rs.getInt(1);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return -1;

	}

	/**
	 * @see 获取某张表的总记录数
	 * @param c
	 *            Person.class
	 * @return -1 出错 >=0 right
	 */
	public static int getCount(Class c) {
		String tableName = c.getSimpleName().toLowerCase();// person 表的名字
		if (!isTableExist(tableName)) {
			System.err.println("表‘" + tableName + "‘不存在");
			return -1;
		}
		try {
			ResultSet rs = getConnection().prepareStatement(
					"select count(" + getColumns(c).get(0) + ") from "
							+ tableName).executeQuery();
			if (rs.next()) {
				return rs.getInt(1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1;
	}
public static void init(){
	Font fontGlobal = new Font("楷体", 11, 10);
	JFrame jf=new JFrame("数据库初始化操作");
	jf.setVisible(true);
	jf.setBounds(600 , 260, 266, 166);
	jf.setVisible(true);
	jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	jf.setResizable(false);
	
	JPanel jpanel=new JPanel();
	jpanel.setBounds(0, 0, 300, 600);
	jf.add(jpanel);
	jpanel.setBackground(new Color(199, 237, 204));
	jpanel.setLayout(null);
	
	
//	JLabel jls1 = new JLabel("mysql 数据库初始化操作");
//	jls1.setBounds(30, 0, 140, 20);
//	jpanel.add(jls1);
//	jls1.setFont(fontGlobal);

	JLabel jls2 = new JLabel("主机名/ip:");
	jls2.setBounds(0, 5, 50, 45);
	jpanel.add(jls2);
	jls2.setFont(fontGlobal);

	// IP框
	final JTextField jtfip = new JTextField(18);
	jtfip.setBounds(50, 17, 100, 20);
	jpanel.add(jtfip);
	jtfip.setText("127.0.0.1");

	JLabel jls3 = new JLabel("端口:");
	jls3.setBounds(155, 5, 50, 45);
	jpanel.add(jls3);
	jls3.setFont(fontGlobal);

	// 端口框
	final JTextField jtfport = new JTextField(15);
	jtfport.setBounds(180, 17, 45, 20);
	jpanel.add(jtfport);
	jtfport.setText("3306");

	

	
	
	
	
	
	JLabel jls4= new JLabel("用户名:");
	jls4.setBounds(16, 35, 50, 45);
	jpanel.add(jls4);
	jls4.setFont(fontGlobal);

	final JTextField jtfip1 = new JTextField(18);
	jtfip1.setBounds(50, 46, 58, 20);
	jpanel.add(jtfip1);
	jtfip1.setText("root");

	JLabel jls5= new JLabel("密码:");
	jls5.setBounds(125, 35, 50, 45);
	jpanel.add(jls5);
	jls5.setFont(fontGlobal);
  
	// 端口框
	 final JPasswordField jtfport1 = new JPasswordField(15);
	jtfport1.setBounds(150, 46,75, 20);
	jpanel.add(jtfport1);
	jtfport1.setText("root");
	
	
	
	JLabel jls6= new JLabel("数据库名:");
	jls6.setBounds(6, 65, 50, 45);
	jpanel.add(jls6);
	jls6.setFont(fontGlobal);

	// IP框
	final JTextField jtfip11 = new JTextField(18);
	jtfip11.setBounds(50, 77, 58, 20);
	jpanel.add(jtfip11);
	jtfip11.setText("test");

	JLabel jls51= new JLabel("编码:");
	jls51.setBounds(125, 65, 50, 45);
	jpanel.add(jls51);
	jls51.setFont(fontGlobal);
  
	// 端口框
	final JTextField jtfport11 = new JTextField(15);
	jtfport11.setBounds(150, 77,75, 20);
	jpanel.add(jtfport11);
	jtfport11.setText("utf-8");
	
	
	final JButton linkBtn = new JButton("初始化DButils工具类");
	linkBtn.setBounds(56, 111, 150, 20);
	jpanel.add(linkBtn);
	linkBtn.setMargin(new Insets(0,0,0,0));// 这样设置button中的字体与button无上下边距
	linkBtn.setFont(fontGlobal);
	MouseAdapter linkServerListener = new MouseAdapter() {
		public void mouseClicked(MouseEvent e) {
			//linkClick(e);// 点击连接
			String ip=jtfip.getText().trim();
			int port=Integer.parseInt(jtfport.getText().trim());
			String username=jtfip1.getText().trim();
			String password=jtfport1.getText().trim();
			String databaseName=jtfip11.getText().trim();
			String code=jtfport11.getText().trim();
		
			String mysqlDriver="com.mysql.jdbc.Driver";
			String mysqlUrl="jdbc:mysql://"+ip+":"+port+"/"+databaseName
					+"?unicode\\=true&characterEncoding\\="+code;
	
			
			
			RegisterUtil.putStringSystemRoot("mysql.driver", mysqlDriver);
			RegisterUtil.putStringSystemRoot("mysql.url", mysqlUrl);
			RegisterUtil.putStringSystemRoot("mysql.username", username);
			RegisterUtil.putStringSystemRoot("mysql.password", password);
			
			System.out.println(RegisterUtil.getStringFromSystemRoot("mysql.driver"));
			
			System.out.println(mysqlUrl);
			System.out.println(username);
			System.out.println(password);
			
			try {
				conn = DriverManager.getConnection(RegisterUtil.getStringFromSystemRoot("mysql.url"),
						RegisterUtil.getStringFromSystemRoot("mysql.username"),
						RegisterUtil.getStringFromSystemRoot("mysql.password"));
				if(conn!=null)
					{
					linkBtn.setText("初始化成功!

请关闭窗口"); } } catch (Exception e2) { // TODO: handle exception } //System.exit(0); } }; linkBtn.addMouseListener(linkServerListener); } /** * @category close Connection * @throws SQLException */ public static void close() throws SQLException { conn.close(); connHolder.set(null); } public static int createTable(Class c) { String tableName = c.getSimpleName().toLowerCase();// person return 0; } /** * * @param c * 參数比如Person.class * @param obj * 參数比如 person obj为某一实例对象 // Person person=new Person(); * @category 该方法用于向数据库中插入条数据 插入的对象是一个实体类的对象 */ public static void insertEntity(Class c, Object obj) { // System.out.println("1"); if (obj == null || c.getSimpleName().equals(obj.getClass().getName())) return; Field[] fields = obj.getClass().getDeclaredFields(); int fieldSize = fields.length; String tableName = c.getSimpleName().toLowerCase();// person String[] types1 = { "int", "java.lang.String", "boolean", "char", "float", "double", "long", "short", "byte", "date" }; String[] types2 = { "java.lang.Integer", "java.lang.String", "java.lang.Boolean", "java.lang.Character", "java.lang.Float", "java.lang.Double", "java.lang.Long", "java.lang.Short", "java.lang.Byte", "java.util.Date" }; StringBuffer sql = new StringBuffer("replace into " + tableName + " values("); for (int i = 0; i < fieldSize; i++) { sql.append("?,"); } sql.deleteCharAt(sql.length() - 1); sql.append(")"); System.out.println(sql); PreparedStatement ps = null; try { ps = getConnection().prepareStatement(sql.toString()); for (int j = 0; j < fieldSize; j++) { fields[j].setAccessible(true); for (int i = 0; i < types1.length; i++) { if (fields[j].getType().getName() .equalsIgnoreCase(types1[i]) || fields[j].getType().getName() .equalsIgnoreCase(types2[i])) { if (fields[j].get(obj) != null && !"".equals(fields[j].get(obj)) && !"null".equals(fields[j].get(obj))) { System.out.print(fields[j].getName() + ":" + fields[j].get(obj) + " "); ps.setObject(j + 1, fields[j].get(obj)); } else { System.out.print(fields[j].getName() + ":" + fields[j].get(obj) + " "); ps.setObject(j + 1, null); } } } } ps.executeUpdate(); getConnection().commit(); System.out.println("\nsql:" + ps.toString().split(":")[1].trim()); } catch (Exception e1) { e1.printStackTrace(); } } /** * @category 依据传入的主键值返回一个实体对象 * @param c * for example Person.class * @param primaryKeys * primaryKeys为主键,參数顺序和表中保持一致 假设id, name 为主键 类名为Person 则 * getEntity(Person.class,1,"name") * @return Object */ public static Object getEntity(Class c, Object... primaryKeys) { PreparedStatement ps = null; ResultSet rs = null; DatabaseMetaData dmd = null; Object obj = null;// 要返回的对象 String tableName = c.getSimpleName().toLowerCase();// person 表的名字 List primaryKeyNameList = new ArrayList();// 存放从表中获取的主键 Field[] fields = c.getFields();// 获取全部的属性 Method[] methods = null; if (fields.length == 0) {// 当类的属性都是private时 // fields=c.getDeclaredFields();//获取全部的private属性 methods = c.getDeclaredMethods();// 获取get set 方法 } StringBuilder sql = new StringBuilder("select * from " + tableName + " where "); try { obj = c.newInstance(); if (!isTableExist(tableName)) { System.err.println("表不存在"); return obj; } dmd = getConnection().getMetaData(); rs = dmd.getPrimaryKeys(null, null, tableName); while (rs.next()) {// 获取全部的主键 sql.append(rs.getObject(4) + "=?

"); sql.append(" and "); primaryKeyNameList.add(rs.getObject(4));// 将从表中获取的 主键字段存到 list中, // 主键位于表中第几列=rs.getString(5) } sql.delete(sql.length() - 4, sql.length()); if (!sql.toString().contains("where")) { System.err.println("没有找到主键"); return obj; } ps = (PreparedStatement) getConnection().prepareStatement( sql.toString()); for (int l = 0; l < primaryKeyNameList.size(); l++) { ps.setObject(l + 1, primaryKeys[l]); } rs = ps.executeQuery(); System.out.println(ps.toString().split(":")[1]); List<String> tableColumns = getColumns(c); if (rs.next()) { if (fields.length > 0) {// 假设类 的属性为public for (int k = 0; k < fields.length; k++) { fields[k].set(obj, rs.getObject(k + 1)); } } else {// 假设类 的属性为private for (int k = 0; k < methods.length; k++) { for (int i = 0; i < tableColumns.size(); i++) { if (methods[k].getName().equalsIgnoreCase( "set" + tableColumns.get(i))) { methods[k].invoke(obj, rs.getObject(tableColumns.get(i))); } } } } } rs.close(); ps.close(); rs = null; ps = null; } catch (Exception e) { e.printStackTrace(); } finally { } return obj; } /** * * @param tableName * 标的名字 * @category 表不存在 1表存在 * @return 0表不存在 >=1表存在 */ public static boolean isTableExist(String tableName) { int v = getCount("SELECT count(table_name) FROM information_schema.TABLES WHERE table_name=‘" + tableName + "‘ "); if (v >= 1) { return true; } else { System.err.println("表 不存在 table not exist"); return false; } } /** * * @category 获取某个表中全部的列名 * @param c * Person.class (类名与表名一致) * @return List */ public static List<String> getColumns(Class c) { List<String> list = new ArrayList<String>(); String tableName = c.getSimpleName().toLowerCase();// person 表的名字 if (!isTableExist(tableName)) { System.err.println("talbe is not exist"); return list; } String sql = "select COLUMN_NAME from information_schema.columns where table_name=‘" + tableName + "‘"; try { ResultSet rs = getConnection().createStatement().executeQuery(sql); while (rs.next()) { if (!list.contains(rs.getString(1))) { list.add(rs.getString(1));// 防止不同数据库中有同样的表名 } } } catch (Exception e) { e.printStackTrace(); } return list; } /** * @category 返回数据库的名字 * @param Person * .class * @return database name */ public static String getDatabaseName(Class c) { String tableName = c.getSimpleName().toLowerCase();// person 表的名字 try { ResultSet rs = getConnection().getMetaData().getPrimaryKeys(null, null, tableName); if (rs.next()) { System.out.println("database:"+rs.getString(1)); return rs.getString(1); } } catch (Exception e) { e.printStackTrace(); } return null; } /** * @category 返回 int auto_increment的下一个自增值 * @param c * Person。class * @return int 下一个自增值 假设没有则返回null */ public static int getAutoIncremet(Class c) { String tableName = c.getSimpleName().toLowerCase();// person 表的名字 if (!isTableExist(tableName)) { System.err.println("表‘" + tableName + "‘不存在"); return -1; } try { ResultSet rs = getConnection().prepareStatement( "SELECT auto_increment FROM information_schema.`TABLES` WHERE TABLE_SCHEMA=‘" + getDatabaseName(c) + "‘ AND TABLE_NAME=‘" + tableName + "‘").executeQuery(); if (rs.next()) { return rs.getInt(1); } } catch (Exception e) { e.printStackTrace(); } return -1; } /** * @category 查找某一列的全部值 * @param c * Person.class * @param columnName * 要查找的某一列的列名 * @return List<String> 返回某一列的全部值 */ public static List<String> getColumnData(Class c, String columnName) { if (!getColumns(c).contains(columnName)) { System.err.println("列名‘" + columnName + "‘不存在"); return null; } List<String> list = new ArrayList<String>(); String tableName = c.getSimpleName().toLowerCase();// person 表的名字 if (!isTableExist(tableName)) { System.err.println("talbe is not exist"); return list; } String sql = "select " + columnName + " from " + tableName; try { ResultSet rs = getConnection().createStatement().executeQuery(sql); while (rs.next()) { list.add(rs.getString(1)); } } catch (Exception e) { e.printStackTrace(); } return list; } /** * @category 依据条件查询 返回where columnName=value * @param c * Person.class 且Person 全部的属性必须全为为public类型或者全部为private * @param columnName * 表中的某字段 * @param value * columnName相应的值 * @return List */ public static List getEntitys(Class c, String columnName, Object value) { if (!getColumns(c).contains(columnName)) { System.err.println("列名‘" + columnName + "‘不存在"); return null; } List list = new ArrayList(); PreparedStatement ps = null; ResultSet rs = null; String tableName = c.getSimpleName().toLowerCase();// person 表的名字 Field[] fields = c.getFields();// 获取全部的public属性 Method[] methods = null; if (fields.length == 0) { fields = c.getDeclaredFields();// 获取全部的private属性 methods = c.getDeclaredMethods();// 获取get set 方法 } StringBuilder sql = new StringBuilder("select * from " + tableName + " where " + columnName + "=?

"); try { if (!isTableExist(tableName)) { System.err.println("表不存在"); return list; } ps = (PreparedStatement) getConnection().prepareStatement( sql.toString()); ps.setObject(1, value); rs = ps.executeQuery(); System.out.println("\n" + ps.toString().split(":")[1]); Object obj = null; while (rs.next()) { obj = c.newInstance(); if (fields.length > 0) {// 假设类 的属性为public for (int k = 0; k < fields.length; k++) { fields[k].setAccessible(true); fields[k].set(obj, rs.getObject(k + 1)); } } else {// 假设类 的属性为private for (int k = 0; k < methods.length / 2; k++) { methods[k * 2].invoke(obj, rs.getObject(k + 1)); } } list.add(obj); } rs.close(); ps.close(); } catch (Exception e) { e.printStackTrace(); } finally { rs = null; ps = null; } return list; } /** * @see 获取全部的数据 * @param c * Person.class * @return List全部的数据 */ public static List getAllEntitys(Class c) { String tableName = c.getSimpleName().toLowerCase();// person 表的名字 if (!isTableExist(tableName)) { System.err.println("表‘" + tableName + "‘不存在"); return null; } List list = new ArrayList(); PreparedStatement ps = null; ResultSet rs = null; Field[] fields = c.getFields();// 获取全部的public属性 if (fields.length == 0) { // fields=c.getDeclaredFields();//获取全部的private属性 fields = c.getDeclaredFields();// 获取get set 方法 } StringBuilder sql = new StringBuilder("select * from " + tableName); try { if (!isTableExist(tableName)) { System.err.println("表不存在"); return list; } ps = (PreparedStatement) getConnection().prepareStatement( sql.toString()); rs = ps.executeQuery(); System.out.println("\n" + ps.toString().split(":")[1]); Object obj = null; while (rs.next()) { obj = c.newInstance(); for (int k = 0; k < fields.length; k++) { fields[k].setAccessible(true); fields[k].set(obj, rs.getObject(k + 1)); } list.add(obj); } rs.close(); ps.close(); } catch (Exception e) { e.printStackTrace(); } finally { rs = null; ps = null; } return list; } /** * @see 获取数据中的某几条记录 * @param c * Person.class * @param fromNumber * 从数据库的第几条開始(0,1,2。3) * @param number * 从fromNumber開始获取多少行 * @return List */ public static List getEntitysLimit(Class c, int fromNumber, int number) { String tableName = c.getSimpleName().toLowerCase();// person 表的名字 if (!isTableExist(tableName)) { System.err.println("表‘" + tableName + "‘不存在"); return null; } List list = new ArrayList(); PreparedStatement ps = null; ResultSet rs = null; Field[] fields = c.getFields();// 获取全部的public属性 if (fields.length == 0) { // fields=c.getDeclaredFields();//获取全部的private属性 fields = c.getDeclaredFields();// 获取get set 方法 } StringBuilder sql = new StringBuilder("select * from " + tableName) .append(" limit ?

,?

"); try { if (!isTableExist(tableName)) { System.err.println("表不存在"); return list; } ps = (PreparedStatement) getConnection().prepareStatement( sql.toString()); ps.setInt(1, fromNumber); ps.setInt(2, number); rs = ps.executeQuery(); System.out.println("\n" + ps.toString().split(":")[1]); Object obj = null; while (rs.next()) { obj = c.newInstance(); for (int k = 0; k < fields.length; k++) { fields[k].setAccessible(true); fields[k].set(obj, rs.getObject(k + 1)); } list.add(obj); } rs.close(); ps.close(); } catch (Exception e) { e.printStackTrace(); } finally { rs = null; ps = null; } return list; } /** * @category 返回表中全部的主键 * @param c * Person.class * @return list */ public static List<String> getPrimaryKeys(Class c) { String tableName = c.getSimpleName().toLowerCase();// person 表的名字 ResultSet rs = null; List<String> list = new ArrayList<String>(); try { rs = getConnection().getMetaData().getPrimaryKeys(null, null, tableName); while (rs.next()) { list.add(rs.getString(4)); } } catch (Exception e) { e.printStackTrace(); } return list; } /** * @category 依据主键删除数据 * @param c * Person.class * @param primaryKey * 按表中主键删除 假设主键为id。name * 则deleteByPrimaryKey(Person.class,1,"ctl"); */ public static void deleteByPrimaryKey(Class c, Object... primaryKey) { String tableName = c.getSimpleName().toLowerCase();// person 表的名字 List<String> primaryKeysList = getPrimaryKeys(c); StringBuilder sb = new StringBuilder("delete from " + tableName + " where "); for (int i = 0; i < primaryKeysList.size(); i++) { sb.append(primaryKeysList.get(i) + "=? and "); } sb.delete(sb.length() - 4, sb.length()); PreparedStatement ps = null; try { ps = getConnection().prepareStatement(sb.toString()); for (int i = 0; i < primaryKeysList.size(); i++) { ps.setObject(i + 1, primaryKey[i]); } ps.executeUpdate(); getConnection().commit(); System.out.println(ps.toString().split(":")[1].trim()); } catch (Exception e) { e.printStackTrace(); } } /** * @see 删除列名为columnName列值为columnValue的数据 * @param c * Person.class * @param columnName * 列名 * @param columnValue * 列名相应的值 */ public static void deleteByColumn(Class c, String columnName, Object columnValue) { if (!getColumns(c).contains(columnName)) { System.err.println("列名‘" + columnName + "‘" + "不存在"); return; } String tableName = c.getSimpleName().toLowerCase();// person 表的名字 StringBuilder sql = new StringBuilder("delete from ").append(tableName) .append(" where ").append(columnName + "=?

"); try { PreparedStatement ps = getConnection().prepareStatement( sql.toString()); ps.setObject(1, columnValue); // ps.setObject(2,columnValue ); int result = ps.executeUpdate(); System.out.println(ps.toString().split(":")[1].trim()); if (result >= 1) { getConnection().commit(); System.out.println("删除" + result + "条记录"); } else { System.out.println("删除" + result + "条记录"); getConnection().rollback(); } } catch (Exception e) { System.err.println("delete error"); e.printStackTrace(); } } /** * @category 从实体类对象中获取主键的列名和value 利用的是filed获取 * @param c * Person.class * @param obj * 实体对象 * @return 从数据库中获取主键 然后与实体类相匹配。返回对象中的主键名和值 */ public static List<KeyValue> getEntityPrimaryKeyValueField(Class c, Object obj) { List<KeyValue> keyValues = new ArrayList<KeyValue>(); List<String> primaryKeys = getPrimaryKeys(c); Field[] fields = c.getFields();// 获取全部的属性 for (int i = 0; i < fields.length; i++) {// 全部属性为public try { for (int j = 0; j < primaryKeys.size(); j++) { if (primaryKeys.get(j) .equalsIgnoreCase(fields[i].getName())) { KeyValue kv = new KeyValue(); kv.setKey(fields[i].getName()); kv.setValue(fields[i].get(obj)); keyValues.add(kv); System.out.println(fields[i].getName() + ":" + fields[i].get(obj)); } } } catch (Exception e) { e.printStackTrace(); } } if (fields.length == 0) {// 当类的属性都是private时 // fields=c.getDeclaredFields();//获取全部的private属性 fields = c.getDeclaredFields();// //获得对象全部属性 for (int i = 0; i < fields.length; i++) { try { fields[i].setAccessible(true);// 改动訪问权限 能够訪问private for (int j = 0; j < primaryKeys.size(); j++) { if (primaryKeys.get(j).equalsIgnoreCase( fields[i].getName())) { KeyValue kv = new KeyValue(); kv.setKey(fields[i].getName()); kv.setValue(fields[i].get(obj));// 读取属性值 keyValues.add(kv); System.out.println(fields[i].getName() + ":" + fields[i].get(obj)); } } } catch (Exception e) { e.printStackTrace(); } } } return keyValues; } /** * @category 从实体类对象中获取主键的列名和value 利用的是Method get方法获取 * @param c * Person.class * @param obj * 实体对象 * @return 从数据库中获取主键 然后与实体类相匹配,返回对象中的主键名和值 */ public static List<KeyValue> getEntityPrimaryKeyValueMethod(Class c, Object obj) { List<KeyValue> keyValues = new ArrayList<KeyValue>(); List<String> primaryKeys = getPrimaryKeys(c); Field[] fields = c.getFields();// 获取全部的属性 for (int i = 0; i < fields.length; i++) {// 全部属性为public try { for (int j = 0; j < primaryKeys.size(); j++) { if (primaryKeys.get(j) .equalsIgnoreCase(fields[i].getName())) { KeyValue kv = new KeyValue(); kv.setKey(fields[i].getName()); kv.setValue(fields[i].get(obj)); keyValues.add(kv); System.out.println(fields[i].getName() + ":" + fields[i].get(obj)); } } } catch (Exception e) { e.printStackTrace(); } } if (fields.length == 0) {// 当类的属性都是private时 // fields=c.getDeclaredFields();//获取全部的private属性 fields = c.getDeclaredFields();// //获得对象全部属性 for (int i = 0; i < fields.length; i++) { try { fields[i].setAccessible(true);// 改动訪问权限 能够訪问private for (int j = 0; j < primaryKeys.size(); j++) { if (primaryKeys.get(j).equalsIgnoreCase( fields[i].getName())) { KeyValue kv = new KeyValue(); kv.setKey(fields[i].getName()); kv.setValue(fields[i].get(obj));// 读取属性值 keyValues.add(kv); System.out.println(fields[i].getName() + ":" + fields[i].get(obj)); } } } catch (Exception e) { e.printStackTrace(); } } } return keyValues; } /** * @category 从实体类对象中按顺序获取全部主键的value * @param c * Person.class * @param obj * 实体对象 * @return 从数据库中获取主键 然后与实体类相匹配,返回对象中的主键值 */ public static List<Object> getEntityPKValues(Class c, Object obj) { List<Object> keyValues = new ArrayList<Object>(); List<String> primaryKeys = getPrimaryKeys(c); Field[] fields = c.getFields();// 获取全部的属性 for (int i = 0; i < fields.length; i++) {// 全部属性为public try { for (int j = 0; j < primaryKeys.size(); j++) { if (primaryKeys.get(j) .equalsIgnoreCase(fields[i].getName())) { keyValues.add(fields[i].get(obj)); System.out.println(fields[i].getName() + ":" + fields[i].get(obj)); } } } catch (Exception e) { e.printStackTrace(); } } if (fields.length == 0) {// 当类的属性都是private时 // fields=c.getDeclaredFields();//获取全部的private属性 fields = c.getDeclaredFields();// //获得对象全部属性 for (int i = 0; i < fields.length; i++) { try { fields[i].setAccessible(true);// 改动訪问权限 能够訪问private for (int j = 0; j < primaryKeys.size(); j++) { if (primaryKeys.get(j).equalsIgnoreCase( fields[i].getName())) { keyValues.add(fields[i].get(obj)); System.out.println(fields[i].getName() + ":" + fields[i].get(obj)); } } } catch (Exception e) { e.printStackTrace(); } } } return keyValues; } /** * @see 假设有主键则运行更行,没有主键则运行插入操作 * @category 将实体类对象跟新到数据库中。假设对象中的属性与数据中不一致则更新。对象某属性为空则不更改该属性 * @param c * Person.class * @param obj * person */ public static void updateEntity(Class c, Object obj) { String tableName = c.getSimpleName().toLowerCase();// person 表的名字 List<String> primaryKeys = getPrimaryKeys(c); List<KeyValue> keyValues = getEntityPrimaryKeyValueField(c, obj); List<String> columns = getColumns(c); List<Object> values = getEntityPKValues(c, obj); Object tableDate = getEntity(c, values.toArray(new Object[] {})); // System.out.println(o); Field[] fields = c.getFields();// 获取全部的属性 System.out.println("数据库比对前:" + obj); System.out.println("数据库中数据:" + tableDate); for (int i = 0; i < fields.length; i++) {// 全部属性为public try { for (int j = 0; j < columns.size(); j++) { if (columns.get(j).equalsIgnoreCase(fields[i].getName())) { System.out.println(fields[i].getName() + ":" + fields[i].get(obj)); if (fields[i].get(obj) == null) { fields[i].set(obj, fields[i].get(tableDate)); } else if (!fields[i].get(obj).equals( fields[i].get(tableDate))) { continue; } } } } catch (Exception e) { e.printStackTrace(); } } if (fields.length == 0) {// 当类的属性都是private时 // fields=c.getDeclaredFields();//获取全部的private属性 fields = c.getDeclaredFields();// //获得对象全部属性 for (int i = 0; i < fields.length; i++) { try { fields[i].setAccessible(true);// 改动訪问权限 能够訪问private for (int j = 0; j < columns.size(); j++) { if (columns.get(j) .equalsIgnoreCase(fields[i].getName())) { System.out.println(fields[i].getName() + ":" + fields[i].get(obj)); if (fields[i].get(obj) == null) { fields[i].set(obj, fields[i].get(tableDate)); } else if (!fields[i].get(obj).equals( fields[i].get(tableDate))) { continue; } } } } catch (Exception e) { e.printStackTrace(); } } } System.out.println("数据库比对后:" + obj); insertEntity(c, obj); } public static void main(String[] args) { Class c = null; try { c = Class.forName("com.ctl.bean.Person"); // c = Class.forName("com.ctl.bean.Test"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(getAutoIncremet(c)); } }



以上是关于DButils工具类能够用来获取数据库连接向数据库插入更新删除对象的主要内容,如果未能解决你的问题,请参考以下文章

使用DbUtils工具类连接mysql数据库

java基础之JDBC九:DbUtils的简介及使用

DBUtils和连接池

30_数据库_第30天java_jdbc_(DBUtils)_讲义

Java-jdbc工具类DBUtils

数据库——DBUtils和连接池