jdbc连接数据库工具类
2016-02-24 21:38
501 查看
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; public class DBUtils { // 表示定义数据库的用户名 private static String USERNAME = "root"; // 定义数据库的密码 private static String PASSWORD = "root"; // 定义数据库的驱动信息 private static String DRIVER = "com.mysql.jdbc.Driver"; // 定义访问数据库的地址 private static String URL = "jdbc:mysql://localhost:3306/db"; private static DBUtils per = null; // 定义数据库的链接 private Connection con = null; // 定义sql语句的执行对象 private PreparedStatement pstmt = null; // 定义查询返回的结果集合 private ResultSet resultSet = null; private DBUtils() { } /** * 单例模式,获得工具类的一个对象 * * @return */ public static DBUtils getInstance() { if (per == null) { per = new DBUtils(); per.registeredDriver(); } return per; } private void registeredDriver() { // TODO Auto-generated method stub try { Class.forName(DRIVER); System.out.println("注册驱动成功!"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 获得数据库的连接 * * @return */ public Connection getConnection() { try { con = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("连接数据库成功!!"); return con; } /** * 完成对数据库的表的添加删除和修改的操作 * * @param sql * @param params * @return * @throws SQLException */ public boolean executeUpdate(String sql, List<Object> params) throws SQLException { boolean flag = false; int result = -1; // 表示当用户执行添加删除和修改的时候所影响数据库的行数 pstmt = con.prepareStatement(sql); if (params != null && !params.isEmpty()) { int index = 1; for (int i = 0; i < params.size(); i++) { pstmt.setObject(index++, i); } } result = pstmt.executeUpdate(); flag = result > 0 ? true : false; return flag; } /** * 从数据库中查询数据 * * @param sql * @param params * @return * @throws SQLException */ public List<Map<String, Object>> executeQuery(String sql, List<Object> params) throws SQLException { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); int index = 1; pstmt = con.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的封装可以用反射机制来封装,把从数据库中获取的数据封装到一个类的对象里 * * @param sql * @param params * @param cls * @return * @throws Exception */ public <T> List<T> executeQueryByRef(String sql, List<Object> params, Class<T> cls) throws Exception { List<T> list = new ArrayList<T>(); int index = 1; pstmt = con.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); // 打开javabean的访问private权限 field.set(resultObject, cols_value); } list.add(resultObject); } return list; } public void closeDB() { 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 (con != null) { try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
测试:
import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub DBUtils db = DBUtils.getInstance(); db.getConnection(); String sql = "SELECT name,introduction,location FROM activity WHERE id IN(SELECT activityId from mem_act_collect where memberId = ?)"; List<Activity> reslist = new ArrayList<Activity>(); List<Object> list = new ArrayList<Object>(); list.add(2014303342); try { reslist = db.executeQueryByRef(sql,list,Activity.class); for(Activity ac:reslist){ System.out.println(ac.toString()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ db.closeDB(); } } }
相关文章推荐
- C++ 自制Redis数据库(十三) 持久化AOF日志模块测试完毕
- oracle spool 导出纯数据文本
- Oracle_11g桌面版 中解决被锁定的scott 教学数据库的方法
- oracle 死锁问题
- 通过源码安装Redis
- django+mysql实现一个简单的博客系统
- 查看各个参数名称:服务器名,数据库名,实例名等
- mysql数据类型
- MySQL入门(一)
- MySQL 多实例搭建
- 各种数据库取前几行数据的例子
- 用memcache做session共享
- Java 访问 MongoDB (使用Spring-Data-MongoDB)
- centos import cx_oracle ImportError: No module named cx_Oracle 解决方法
- mysql常用监控脚本命令整理
- 最近踩的一个小坑
- Mysql异常问题处理
- cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle
- postgreSQL数据类型转换字符串和数值
- Sql Server 强制断开数据库已有连接的方法