疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

操作数据库的模板方法


 

        关于用操作数据库模板方法如下代码:

  [java]

  jdbc.properties

  url=jdbc:mysql://localhost:3306/cfms

  user=root

  password=123456

  driverClass=com.mysql.jdbc.Driver

  package cn.edu.hactcm.base.utils;

  import java.io.InputStream;

  import java.sql.Connection;

  import java.sql.DriverManager;

  import java.sql.ResultSet;

  import java.sql.SQLException;

  import java.sql.Statement;

  import java.util.Properties;

  /**

  [java] view plaincopyprint?

  * CFMS :Computer files management system

  * version :1.0 2013-2-19 上午08:44:27

  *

  * 操作JDBC的工具类

  */

  public class JdbcUtils {

  private JdbcUtils() {

  }

  private static String url;

  private static String user;

  private static String password;

  /*

  * 静态代码块

  */

  static {

  try {

  // 读取配置文件,通过类加载器的方式读取属性文件

  InputStream in = JdbcUtils.class.getClassLoader()

  .getResourceAsStream("jdbc.properties");

  Properties prop = new Properties();

  prop.load(in);

  url = prop.getProperty("url");

  user = prop.getProperty("user");

  password = prop.getProperty("password");

  // 注册驱动

  String driverClass = prop.getProperty("driverClass");

  Class.forName(driverClass);

  in.close();

  in = null;

  } catch (Exception e) {

  throw new ExceptionInInitializerError(e);

  }

  }

  /**

  * @return 获取与指定数据库的连接

  * @throws SQLException

  */

  public static Connection getConnection() throws SQLException {

  // url,user,password可以直接使用是因为上面定义成静态的了。

  Connection connection = DriverManager

  .getConnection(url, user, password);

  return connection;

  }

  /**

  * @param rs :结果集

  * @param stmt:在程序中将使用PrepareStatement,其中Statement是其父类

  * @param conn:数据库连接

  */

  public static void release(ResultSet rs, Statement stmt, Connection conn) {

  // 判断结果集是否为空,如果不为空,关闭清空

  if (rs != null) {

  try {

  rs.close();

  } catch (SQLException e) {

  e.printStackTrace();

  }

  rs = null;

  }

  // 判断声明是否为空,如果不为空,关闭清空

  if (stmt != null) {

  try {

  stmt.close();

  } catch (SQLException e) {

  e.printStackTrace();

  }

  stmt = null;

  }

  // 判断连接是否为空,如果不为空,关闭清空

  if (conn != null) {

  try {

  conn.close();

  } catch (SQLException e) {

  e.printStackTrace();

  }

  conn = null;

  }

  }

  }

  package cn.edu.hactcm.base.dao;

  import java.sql.ResultSet;

  /**

  * CFMS :Computer files management system

  * version :1.0 2013-2-19 上午10:02:31

  */

  public interface ResultSetHandler {

  //处理结果集的方法

  public Object handle(ResultSet rs);

  }

  /**

  *

  */

  package cn.edu.hactcm.base.dao.impl;

  import java.sql.ResultSet;

  import java.sql.ResultSetMetaData;

  import cn.edu.hactcm.base.dao.ResultSetHandler;

  /**

  * CFMS :Computer files management system

  * version :1.0 2013-2-19 上午10:38:37

  *

  * 取出第一行的所有记录存入一个Object数组

  */

  @SuppressWarnings( { "unchecked", "unused" })

  public class ArrayHandler implements ResultSetHandler {

  private Class clazz;

  public ArrayHandler(Class clazz) {

  this.clazz = clazz;

  }

  public Object handle(ResultSet rs) {

  try {

  if (rs.next()) {

  // 指向了第一行的记录

  // 获得元数据

  ResultSetMetaData metaData = rs.getMetaData();

  // 获得用于查询的sql中的字段列数

  int count = metaData.getColumnCount();

  // 创建数组

  Object[] arr = new Object[count];

  // 迭代所有列的值,存入数组

  for (int i = 1; i <= count; i++) {

  Object value = rs.getObject(i); // 获得指定列的值

  arr[i - 1] = value;

  }

  return arr;

  }

  return null;

  } catch (Exception e) {

  throw new RuntimeException(e);

  }

  }

  }

  /**

  *

  */

  package cn.edu.hactcm.base.dao.impl;

  import java.lang.reflect.Field;

  import java.sql.ResultSet;

  import java.sql.ResultSetMetaData;

  import cn.edu.hactcm.base.dao.ResultSetHandler;

  /**

  * CFMS :Computer files management system

  * version :1.0 2013-2-19 上午10:38:37

  *

  * 此助手类用于取得结果集中的第一条记录

  */

  @SuppressWarnings("unchecked")

  public class BeanHandler implements ResultSetHandler {

  private Class clazz;

  public BeanHandler(Class clazz) {

  this.clazz = clazz;

  }

  public Object handle(ResultSet rs) {

  // 不知道有几列数据,不知道列名,不知道封装到什么样的bean

  // 表的列明和javabean的字段名一致

  try {

  if(rs.next()) {

  // 创建bean

  Object bean = clazz.newInstance();

  // 封装数据

  // 获得结果集的元数据

  ResultSetMetaData metaData = rs.getMetaData();

  int count = metaData.getColumnCount();

  // 迭代取每一列的数据

  for(int i=1; i<=count; i++) {

  // 获得列名 username

  String columnName = metaData.getColumnName(i);

  // 获得数据 ddd

  Object value = rs.getObject(columnName);

  // 根据列名反射出映射的属性 username

  Field field = clazz.getDeclaredField(columnName);

  // 为属性赋值

  field.setAccessible(true);

  field.set(bean, value);

  }

  return bean;

  }

  return null;

  } catch (Exception e) {

  throw new RuntimeException(e);

  }

  }

  }

  package cn.edu.hactcm.base.dao.impl;

  import java.lang.reflect.Field;

  import java.sql.ResultSet;

  import java.sql.ResultSetMetaData;

  import java.util.ArrayList;

  import java.util.List;

  import cn.edu.hactcm.base.dao.ResultSetHandler;

  /**

  * CFMS :Computer files management system

  * version :1.0 2013-2-19 上午10:07:19

  *

  * 此助手类用于取得结果集中的记录的list列表集合,集合中的每个元素是数据库中的一条记录

  */

  @SuppressWarnings("unchecked")

  public class BeanListHandler implements ResultSetHandler {

  private Class clazz;

  public BeanListHandler(Class clazz) {

  this.clazz = clazz;

  }

  public Object handle(ResultSet rs) {

  try {

  // 取出结果集所有的记录,封装到bean,存入list返回

  List list = new ArrayList();

  while (rs.next()) {

  Object bean = clazz.newInstance();

  // 获得元数据

  ResultSetMetaData metaData = rs.getMetaData();

  // 获得列的数量

  int count = metaData.getColumnCount();

  // 遍历列

  for (int i = 1; i <= count; i++) {

  // 取列名

  String columnName = metaData.getColumnName(i);

  // 取这列的值

  Object value = rs.getObject(columnName);

  // 反射出属性

  Field field = clazz.getDeclaredField(columnName);

  // 设置属性

  field.setAccessible(true);

  field.set(bean, value);

  }

  // 加入list

  list.add(bean);

  }

  return list;

  } catch (Exception e) {

  throw new RuntimeException(e);

  }

  }

  }

  package cn.edu.hactcm.base.dao.impl;

  import java.sql.Connection;

  import java.sql.PreparedStatement;

  import java.sql.ResultSet;

  import java.sql.SQLException;

  import cn.edu.hactcm.base.dao.ResultSetHandler;

  import cn.edu.hactcm.base.utils.JdbcUtils;

  public class GenericDaoImpl {

  /**

  * 用于处理公共的insert,update,delete操纵

  * @param sql :这里是传入的sql语句

  * @param params :这里是参数数组

  * @return

  * @throws SQLException

  */

  public static int update(String sql, Object[] params) throws SQLException {

  Connection conn = null;

  PreparedStatement pstmt = null;

  ResultSet rs = null;

  try {

  conn = JdbcUtils.getConnection();

  //预编译sql

  pstmt = conn.prepareStatement(sql);

  //将参数设置进去

  for (int i = 0; i < params.length; i++) {

  pstmt.setObject(i+1, params[i]);

  }

  //发送sql

  int num = pstmt.executeUpdate();

  return num;

  } finally {

  JdbcUtils.release(rs, pstmt, conn);

  }

  }

  /**

  * 用于处理公共"查询所有"的操作

  * @param sql :查询参数

  * @param params :出入的id值

  * @param rsh :表示要实现那个结果封装类

  * @return

  * @throws SQLException

  */

  public static Object query(String sql,Object[] params,ResultSetHandler rsh) throws SQLException{

  Connection conn = null;

  PreparedStatement pstmt = null;

  ResultSet rs = null;

  try {

  //获得连接

  conn = JdbcUtils.getConnection();

  //预编译sql

  pstmt = conn.prepareStatement(sql);

  //将参数设置进去

  for (int i = 0; params != null && i < params.length; i++) {

  pstmt.setObject(i+1, params[i]);

  }

  //发送sql

  rs = pstmt.executeQuery();

  //不知道别人想如何处理结果集

  //干脆想别人所要一个结果集的处理器

  //为了让当前代码继续,定义一个结果集处理器接口

  //策略模式,规定算法,具体的算法留给将来的调用者实现

  Object obj = rsh.handle(rs);

  return obj;

  } finally {

  //释放资源

  JdbcUtils.release(rs, pstmt, conn);

  }

  }

  }