package com.util;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class JdbcUtils
{
// 表示定义数据库的用户名
private final String USERNAME = "root";
// 定义数据库的密码
private final String PASSWORD = "admin";
// 定义数据库的驱动信息
private final String DRIVER = "com.mysql.jdbc.Driver";
// 定义访问数据库的地址
private final String URL = "jdbc:mysql://localhost:3306/mydb";
// 定义数据库的链接
private Connection connection;
// 定义sql语句的执行对象
private PreparedStatement pstmt;
// 定义查询返回的结果集合
private ResultSet resultSet;
public JdbcUtils()
{
try
{
Class.forName(DRIVER);
System.out.println("注册驱动成功!!");
}
catch (Exception e)
{
// TODO: handle exception
}
}
// 定义获得数据库的链接
public Connection getConnection()
{
try
{
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
System.out.println("数据库连接成功");
}
catch (Exception e)
{
// TODO: handle exception
}
return connection;
}
/**
* 完成对数据库的表的添加删除和修改的操作
*
* @param sql
* @param params
* @return
* @throws SQLException
*/
public boolean updateByPreparedStatement(String sql, List<Object> params)
throws SQLException
{
boolean flag = false;
int result = -1;// 表示当用户执行添加删除和修改的时候所影响数据库的行数
pstmt = connection.prepareStatement(sql);
int index = 1;
// 填充sql语句中的占位符
if (params != null && !params.isEmpty())
{
for (int i = 0; i < params.size(); i++)
{
pstmt.setObject(index++, params.get(i));
}
}
result = pstmt.executeUpdate();
flag = result > 0 ? true : false;
return flag;
}
/**
* 查询返回单条记录,并保存在map中
*
* @param sql
* @param params
* @return
* @throws SQLException
*/
public Map<String, Object> findSimpleResult(String sql, List<Object> params)
throws SQLException
{
Map<String, Object> map = new HashMap<String, Object>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty())
{
for (int i = 0; i < params.size(); i++)
{
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();// 返回查询结果
// 获取此 ResultSet 对象的列的编号、类型和属性。
ResultSetMetaData metaData = resultSet.getMetaData();
int col_len = metaData.getColumnCount();// 获取列的长度
while (resultSet.next())// 获得列的名称
{
for (int i = 0; i < col_len; i++)
{
String cols_name = metaData.getColumnName(i + 1);
Object cols_value = resultSet.getObject(cols_name);
if (cols_value == null)// 列的值没有时,设置列值为“”
{
cols_value = "";
}
map.put(cols_name, cols_value);
}
}
return map;
}
/**
* 查询返回多行记录,并保存在List<Map<String, Object>>中
*
* @param sql
* @param params
* @return
* @throws SQLException
*/
public List<Map<String, Object>> findMoreResult(String sql,
List<Object> params) throws SQLException
{
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty())
{
for (int i = 0; i < params.size(); i++)
{
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while (resultSet.next())
{
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 0; i < cols_len; i++)
{
String cols_name = metaData.getColumnName(i + 1);
Object cols_value = resultSet.getObject(cols_name);
if (cols_value == null)
{
cols_value = "";
}
map.put(cols_name, cols_value);
}
list.add(map);
}
return list;
}
/**
* jdbc的封装可以用反射机制来封装:取得单条记录并保存在javaBean中(这里使用到了泛型)
*
* @param sql
* @param params
* @param cls
* @return
* @throws Exception
*/
public <T> T findSimpleRefResult(String sql, List<Object> params,
Class<T> cls) throws Exception
{
T resultObject = null;
int index = 1;
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty())
{
for (int i = 0; i < params.size(); i++)
{
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while (resultSet.next())
{
// 通过反射机制创建实例
resultObject = cls.newInstance();
for (int i = 0; i < cols_len; i++)
{
String cols_name = metaData.getColumnName(i + 1);
Object cols_value = resultSet.getObject(cols_name);
if (cols_value == null)
{
cols_value = "";
}
// 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field field = cls.getDeclaredField(cols_name);
field.setAccessible(true);// 打开javabean的访问private权限
field.set(resultObject, cols_value);// 为resultObject对象的field的属性赋值
}
}
return resultObject;
}
/**
* 通过反射机制访问数据库 jdbc的封装可以用反射机制来封装:取得多条记录并保存在javaBean的集合中中(这里使用到了泛型)
*
* @param <T>
* @param sql
* @param params
* @param cls
* @return
* @throws Exception
*/
public <T> List<T> findMoreRefResult(String sql, List<Object> params,
Class<T> cls) throws Exception
{
List<T> list = new ArrayList<T>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty())
{
for (int i = 0; i < params.size(); i++)
{
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while (resultSet.next())
{
T resultObject = cls.newInstance();
for (int i = 0; i < cols_len; i++)
{
String cols_name = metaData.getColumnName(i + 1);
Object cols_value = resultSet.getObject(cols_name);
if (cols_value == null)
{
cols_value = "";
}
Field field = cls.getDeclaredField(cols_name);
field.setAccessible(true);
field.set(resultObject, cols_value);
}
list.add(resultObject);
}
return list;
}
/**
* 释放所用的连接
*/
public void releaseConn()
{
if (resultSet != null)
{
try
{
resultSet.close();
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (pstmt != null)
{
try
{
pstmt.close();
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null)
{
try
{
connection.close();
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 将连接参数写入配置文件
*
* @param url
* jdbc连接域名
* @param user
* 用户名
* @param password
* 密码
*/
public static void writeProperties(String url, String user, String password)
{
Properties pro = new Properties();
FileOutputStream fileOut = null;
try
{
fileOut = new FileOutputStream("Config.ini");
pro.put("url", url);
pro.put("user", user);
pro.put("password", password);
pro.store(fileOut, "My Config");
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if (fileOut != null)
fileOut.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
/**
* 读取配置文件的连接参数
*
* @return 返回list
*/
public static List readProperties()
{
List list = new ArrayList();
Properties pro = new Properties();
FileInputStream fileIn = null;
try
{
fileIn = new FileInputStream("Config.ini");
pro.load(fileIn);
list.add(pro.getProperty("url"));
list.add(pro.getProperty("user"));
list.add(pro.getProperty("password"));
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if (fileIn != null)
fileIn.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
return list;
}
/**
* 测试jdbc工具类
*
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
JdbcUtils jdbcUtils = new JdbcUtils();
jdbcUtils.getConnection();
// String sql = "insert into userinfo(username,pswd) values(?,?)";
// List<Object> params = new ArrayList<Object>();
// params.add("rose");
// params.add("123");
// try {
// boolean flag = jdbcUtils.updateByPreparedStatement(sql, params);
// System.out.println(flag);
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
String sql = "select * from userinfo ";
// List<Object> params = new ArrayList<Object>();
// params.add(1);
/*
* try { List<UserInfo> list = jdbcUtils.findMoreRefResult(sql, null,
* UserInfo.class); System.out.println(list); } catch (Exception e) { //
* TODO: handle exception } finally { jdbcUtils.releaseConn(); }
*/
}
}
JDBC深度封装的工具类(具有高度的可重用性)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.