BaseJDBC和CRUDDAO的写法实例代码

 更新时间:2017年09月21日 10:25:49   作者:周振宇  
这篇文章主要介绍了BaseJDBC和CRUDDAO的写法实例代码,代码注释十分详细,具有一定参考价值,需要的朋友可以了解下。

我们首先看下BASEJDBC的写法实例:

package com.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.Driver;
public class BaseJDBC {
 // 表示你要操作的是哪种类型的数据库
 private final String DRIVER = "com.mysql.jdbc.Driver";
 // 表示你要连接的是哪一台电脑的服务器端口号是多少数据库的名字是什么
 private final String URL = "jdbc:mysql://localhost:3306/zzy";//有时这里需要加上字符集
 // 登录数据库的用户名
 private final String USERNMAE = "root";
 // 登录数据库的密码
 private final String PASSWORD = "root";
 /**
  * 注册驱动 获取连接
  * 
  * @return
  */
 public Connection getConnection() {
  try {
   //Driver d=new Driver();
   // 注册驱动:反射(是一项很高深的技术)
   Class.forName(DRIVER);
   // 由连接大管家创建连接对象
   return DriverManager.getConnection(URL, USERNMAE, PASSWORD);
  } catch (ClassNotFoundException e) {
   //e.printStackTrace("数据库的驱动文件没有找到");
  } catch (SQLException e) {
   //数据库的连接错误
   e.printStackTrace();
  }
  return null;
 }
 /**
  * 关闭连接释放资源
  * @param con
  * @param st
  * @param rt
  */
 public void closeAll(Connection con, Statement st, ResultSet rt) {
  try {
   if (rt != null) {
    rt.close();
    rt = null;
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
  try {
   if (st != null) {
    st.close();
    st = null;
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
  try {
   if (con != null) {
    con.close();
    con = null;
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
}

CRUDDAO 写法代码实例:

package com.dao;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.*;
import java.util.Map.Entry;
/**
 * 
 * @author zzy
 *
 * 2016年12月1日下午1:49:49
 */
public class CRUDDAO<T> extends BaseJDBC {
 private Connection con = null;
 private PreparedStatement pt = null;
 private Statement st = null;
 private ResultSet rt = null;
 private Class<T> c;
 public CRUDDAO() {
 }
 public CRUDDAO(Class<T> c) {
  this.c = c;
 }
 /**
  * 查询操作要改造的地方 第一:参数必须抽象 第二:返回类型必须抽象
  * 
  * @param <T>
  * @param <T>
  * 
  * @return Map<Integer, List<T>>
  */
 public Map<Integer, List<T>> selectAll(Map<String, Object[]> m) {
  int index = 0;
  Map<Integer, List<T>> map = new LinkedHashMap<Integer, List<T>>();
  List<T> list = null;
  try {
   con = super.getConnection();
   if (con != null) {
    Set<Entry<String, Object[]>> set = m.entrySet();
    for (Entry<String, Object[]> entry : set) {
     list = new ArrayList<T>();
     pt = con.prepareStatement(entry.getKey());
     this.bind(entry.getValue());
     rt = pt.executeQuery();
     while (rt.next()) {
      list.add(this.toBean2());
     }
     map.put(++index, list);
    }
   } else {
    System.out.println("数据库连接失败");
   }
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   super.closeAll(con, pt, rt);
  }
  return map;
 }
 /**
  * 将数据库查询到的数据进行封装 封装成实体类之后再返回给调用者
  * 
  * @return
  */
 private T toBean() {
  T t = null;
  try {
   t = c.newInstance();
   Method[] m = c.getMethods();
   ResultSetMetaData rmt = rt.getMetaData();
   for (int i = 1, count = rmt.getColumnCount(); i <= count; i++) {
    String columName = rmt.getColumnName(i);
    columName = "set" + columName.substring(0, 1).toUpperCase()
      + columName.substring(1);
    for (int j = 0; j < m.length; j++) {
     if (columName.equals(m[j].getName())) {
      m[j].invoke(t, rt.getObject(i));
      break;
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return t;
 }
 private T toBean2() {
  T t = null;
  try {
   // 创建反射类的实例
   t = c.newInstance();
   // 反射出所有字段
   Field[] field = c.getDeclaredFields();
   for (Field f : field) {
    // 根据反射的字段名得到数据库中的字段值
    Object value = rt.getObject(f.getName());
    f.setAccessible(true);// 打开私有字段的操作权限
    f.set(t, value);// 调用这个字段的公有的set方法封装字段的值
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return t;
 }
 /**
  * 绑定参数
  * 
  * @param obj
  */
 private void bind(Object[] obj) {
  try {
   if (obj != null) {
    for (int i = 0, k = obj.length; i < k; i++) {
     pt.setObject(i + 1, obj[i]);
    }
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
 /**
  * 修改操作 进行的事务的控制 所有命令要么同时提交成功 要么同时回滚
  * 
  * @param name
  * @param id
  * @return
  */
 public int[] updateAll(Map<String, Object[]> map) {
  int[] row = new int[map.size()];
  int index = 0;
  int error = 0;
  try {
   con = super.getConnection();
   if (con != null) {
    Set<Entry<String, Object[]>> set = map.entrySet();
    // 关闭连接对象的自动提交的功能
    con.setAutoCommit(false);
    for (Entry<String, Object[]> entry : set) {
     pt = con.prepareStatement(entry.getKey());
     this.bind(entry.getValue());
     row[index] = pt.executeUpdate();
     if (row[index] == 0) {
      throw new Exception("修改失败,数据回滚!");
     }
     index++;
    }
   } else {
    System.out.println("数据库连接失败");
   }
  } catch (Exception e) {
   error++;
   e.printStackTrace();
  } finally {
   if (error > 0) {
    try {
     // 将前面已经执行的命令回滚
     con.rollback();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   } else {
    try {
     // 全部提交
     con.commit();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
   super.closeAll(con, st, null);
  }
  return row;
 }
}

总结

以上就是本文关于BaseJDBC和CRUDDAO的写法实例代码的全部内容,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java中的动态绑定机制

    Java中的动态绑定机制

    这篇文章主要介绍了Java中的动态绑定机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • servlet之ServletContext简介_动力节点Java学院整理

    servlet之ServletContext简介_动力节点Java学院整理

    这篇文章主要介绍了servlet之ServletContext简介,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Java使用非覆盖的方法实现替换PDF中的文本

    Java使用非覆盖的方法实现替换PDF中的文本

    这篇文章主要为大家详细介绍了Java如何使用非覆盖的方法实现替换PDF中的文本,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Spring中的@Conditional注解使用和原理详解

    Spring中的@Conditional注解使用和原理详解

    这篇文章主要介绍了Spring中的@Conditional注解使用和原理详解,@Conditional在Spring4.0中被引入,用于开发"If-Then-Else"类型的bean注册条件检查,在@Conditional之前,也有一个注解@Porfile起到类似的作用,需要的朋友可以参考下
    2024-01-01
  • java中for和forEach的速度比较实例Demo

    java中for和forEach的速度比较实例Demo

    for循环中的循环条件中的变量只求一次值,而foreach语句是java5新增,在遍历数组、集合的时候,foreach拥有不错的性能,这篇文章主要给大家介绍了关于java中for和forEach速度比较的相关资料,需要的朋友可以参考下
    2021-08-08
  • Springmvc restful配置遇到的小坑

    Springmvc restful配置遇到的小坑

    本文是小编给大家带了的Springmvc restful配置遇到的小小坑,小编给大家带来了问题原因及解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07
  • 举例讲解Java的RTTI运行时类型识别机制

    举例讲解Java的RTTI运行时类型识别机制

    这篇文章主要介绍了Java的RTTI运行时类型识别机制,包括泛化的Class引用以及类型检查instanceof等知识点,需要的朋友可以参考下
    2016-05-05
  • 在lambda的foreach遍历中break退出操作(lambda foreach break)

    在lambda的foreach遍历中break退出操作(lambda foreach break)

    这篇文章主要介绍了在lambda的foreach遍历中break退出操作(lambda foreach break),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java如何基于反射机制获取不同的类

    Java如何基于反射机制获取不同的类

    这篇文章主要介绍了Java如何基于反射机制获取不同的类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • RabbitMQ实现Work Queue工作队列的示例详解

    RabbitMQ实现Work Queue工作队列的示例详解

    工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。本篇文章将记录和分享RabbitMQ工作队列相关的知识点,希望对大家有所帮助
    2023-01-01

最新评论