具体上代码我的BaseDao:

public class BaseDao<T> {
  private Class clazz;
  private Properties pro=null;
  public BaseDao(){
   ParameterizedType pt=(ParameterizedType) this.getClass().getGenericSuperclass(); //按英译意思是获取这个类的泛型父类
   clazz=(Class) pt.getActualTypeArguments()[0];  //得到真实的类型内容
   pro=MainKey.getMainKeyType(clazz);  //静态方法获取的是每个实体类的类名(相当于数据库里的表明)和数据库里的主键自动增长列
  }
 
  //返回数据库连接
  private Connection getConnection() throws IOException{
    try {
  Properties pro=new Properties();
  pro.load(BaseDao.class.getClassLoader().getResourceAsStream("config.Properties"));   //我的连接数据库配置文件   
  Class.forName(pro.getProperty("driver"));
  return DriverManager.getConnection(pro.getProperty("url"), pro.getProperty("user"), pro.getProperty("pwd"));
 } catch (Exception e) {
  e.printStackTrace();
  return null;
 }
  }
  /**
   * 添加
   * @param t
   * 要保存的类
   * @return 成功返回true/失败返回false
   */
  public boolean save(T t){
  Connection con=null;
  try {
   con = getConnection();
  Field[] filds=clazz.getDeclaredFields();   //获取公开的字段包括私有
   StringBuffer sb=new StringBuffer();
   sb.append("INSERT INTO ["+t.getClass().getSimpleName()+ "](");
   for (Field field : filds) {
   if(field.getName().equals(pro.getProperty("idname"))){
    continue;
   }
   sb.append(field.getName()+",");
  }
   sb.deleteCharAt(sb.length()-1);
   sb.append(")VALUES(");
   List<Object> prams=new ArrayList<Object>();
   for (Field field : filds) {
   if(field.getName().equals(pro.getProperty("idname"))){
    continue;
   }
   PropertyDescriptor pd=new PropertyDescriptor(field.getName(),clazz);
   Method mt=pd.getReadMethod();
   Object obj=mt.invoke(t);
   prams.add(obj);
   sb.append("?,");
   }
   sb.deleteCharAt(sb.length()-1);
   sb.append(")");
   PreparedStatement ps=con.prepareStatement(sb.toString(),Statement.RETURN_GENERATED_KEYS);    //Statement.RETURN_GENERATED_KEYS可以获

//得自增列的id号
   for (int i = 0; i < prams.size(); i++) {
   ps.setObject(i+1,prams.get(i));
   }
   int count=ps.executeUpdate();
   ResultSet rs=ps.getGeneratedKeys();  //在这里可以把自增列的ID号读出来
   if(rs.next()){
    System.out.println("key:"+rs.getInt(1));
   }
   if(count>0){
    return true;
   }
 } catch (Exception e) {
  e.printStackTrace();
 }finally{
  try {
   con.close();
  } catch (SQLException e) {  
   e.printStackTrace();
  }
 }
 return false;
 
  
  }
  /**
   * 删除
   * @param ser 参数
   * @return 成功返回true/失败返回false
   */
  public boolean delete(Serializable ser){
  Connection con=null;
  try {
  con=getConnection();
  String sql="DELETE FROM"+pro.getProperty("tableName")+" where "+pro.getProperty("idname")+"=?";
     PreparedStatement ps=con.prepareStatement(sql);
     ps.setObject(1,ser);
     int count=ps.executeUpdate();
     if(count>0){
      return true;
     }
 } catch (Exception e) {
  e.printStackTrace();
 }finally{
    try {
  con.close();
 } catch (SQLException e) {
  e.printStackTrace();
 } 
 }
   return false;
  }
  /**
   * 更新
   * @param t要更新的类
   * @return 成功返回true/失败返回false
   */
 
  public boolean update(T t){
   Connection con=null;
   try {
   con=getConnection();
   StringBuffer sb=new StringBuffer();
   sb.append("UPDATE"+pro.getProperty("tableName")+"set");
   Field[] fields=clazz.getDeclaredFields();
   List<Object> prams=new ArrayList<Object>();
   for (Field field : fields) {
    if(pro.getProperty("idname").equals(field.getName())){
     continue;
    }
    sb.append(" "+field.getName()+"=?,");
    PropertyDescriptor pd=new PropertyDescriptor(field.getName(), clazz);
    Method mt=pd.getReadMethod();
    Object obj=mt.invoke(t);
    prams.add(obj);
   }
   sb.deleteCharAt(sb.length()-1);
   sb.append(" where "+pro.getProperty("idname")+"=?");
   PropertyDescriptor pd=new PropertyDescriptor(pro.getProperty("idname"), clazz);
   Method mt=pd.getReadMethod();
   Object obj=mt.invoke(t);
   prams.add(obj);
   PreparedStatement ps=con.prepareStatement(sb.toString());
   for (int i = 0; i < prams.size(); i++) {
    ps.setObject(i+1,prams.get(i));
   }
            int count=ps.executeUpdate();
            if(count>0){
             return true;
            }
  } catch (Exception e) {
   e.printStackTrace();
  }finally{
   try {
    con.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
    return false;
  
  }
  /**
   * 查询所有
   * @return 实体类集合
   */
  public List<T> findAll(){
   Connection con=null;
   PreparedStatement ps=null;
   ResultSet rs=null;
   try {
  con=getConnection();
  String sql="select * from"+pro.getProperty("tableName");
  ps=con.prepareStatement(sql);
  rs=ps.executeQuery();
  List<T> list=new ArrayList<T>();
  while(rs.next()){
   T t=(T) clazz.newInstance();
   Map<String,Field> map=new HashMap<String, Field>();
   for (Field field : clazz.getDeclaredFields()) {
    map.put(field.getName(),field);
   }
   int count=rs.getMetaData().getColumnCount();//每行多少列
   for (int i = 0; i < count; i++) {
    try {
     Field field=map.get(rs.getMetaData().getColumnName(i+1).toLowerCase());
     field.setAccessible(true);
     if (field.getType().getName().equals(int.class.getName())|| field.getType().getName().equals(Integer.class.getName())) {
      field.set(t, Integer.valueOf(rs.getObject(i + 1).toString()));
     } else if (field.getType().getName().equals(Date.class.getName())) {
      field.set(t, new Date(rs.getDate(i + 1).getTime()));
     } else if (field.getType().getName().equals(Double.class.getName())|| field.getType().getName().equals(double.class.getName())) {
      field.set(t, rs.getDouble(i + 1));
     } else if (field.getType().getName().equals(
       String.class.getName())) {
      field.set(t, rs.getObject(i + 1).toString());
     } else {
      field.set(t, rs.getObject(i));
     }
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
   list.add(t);
  }
  return list;
 } catch (Exception e) {
  e.printStackTrace();
 }finally{
    try {
     rs.close();
     ps.close();
     con.close();
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
 return null;
  }
  ****************************************************************************************************************************

每个实体类都配置了个Properties:用来存放每个实体类的类名(相当于数据库里的表明)和数据库里的主键自动增长列

tableName=[user]
MainKeyType=identity
idname=id

***********************************************

我的UserDao只要继承BaseDao就行:

public class UserDao extends BaseDao<User>

**********************************************

我的工具类用来返回  读取每个实体类的类名(相当于数据库里的表明)和数据库里的主键自动增长列的Properties:

public class MainKey {
  
   public static Properties getMainKeyType(Class clazz){
    Properties pro=new Properties();
    String path=clazz.getName().replace(".", "/")+".Properties";
    System.out.println(path);
    try {
  pro.load(MainKey.class.getClassLoader().getResourceAsStream(path));
 } catch (IOException e) {
  e.printStackTrace();
 }
   
 return pro;

*******************************************************

Main方法测试:

public static void main(String[] args) throws IOException {
  UserDao ud=new UserDao();
  User user=new User();
  user.setId(2);
  user.setAge(22);
  user.setName("sp");
  user.setPhone(138438);
  ud.save(user);
//        ud.update(user);
       // System.out.println(ud.delete(1));
       
  //MainKey.getMainKeyType(User.class);
 }
   
   }
}

通过反射封装JDBC的更多相关文章

  1. jdbc操作mysql(四):利用反射封装

    前言 有了前面利用注解拼接sql语句,下面来看一下利用反射获取类的属性和方法 不过好像有一个问题,数据库中的表名和字段中带有下划线该如何解决呢 实践操作 工具类:获取connection对象 publ ...

  2. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...

  5. MySQL JDBC事务处理、封装JDBC工具类

    MySQL数据库学习笔记(十)----JDBC事务处理.封装JDBC工具类 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit. ...

  6. DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...

  7. 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...

  8. Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

    先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...

  9. 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入

    一.JDBC的概述###<1>概念 JDBC:java database connection ,java数据库连接技术 是java内部提供的一套操作数据库的接口(面向接口编程),实现对数 ...

随机推荐

  1. 答CsdnBlogger问-关于安卓入行和开发问题

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 问1:请问大牛对功能和框架的认识有哪些?(提问者:执笔记忆的空白) 比如对于一个小公司来说,什么样的 ...

  2. 关于YARN的HA

    一:准备 1.规划 namenode               namenode ZKFC ZKFC journalnode        journalnode               jou ...

  3. 【Android开发学习笔记】【第四课】基础控件的学习

    通过一个简单的例子来学习下面几种控件: 1.TextView:简单的文本显示控件 2.EditText:可以编辑的文本框 3.Button:按钮 4.Menu:这里指的是系统的Menu 5.Toast ...

  4. node.js的exprots工厂模式

    工厂类: /** * Created by zzq on 2015/5/15. */ module.exports = function(){ this.getProduct = function() ...

  5. 用angularJS实现Bootstrap的“手风琴”

    主页面代码(发现Bootstrap官网上手风琴的实例样式有问题,在这里依然使用3.0.~版本) <!DOCTYPE html> <html ng-app="ct" ...

  6. Android性能优化典范(转)

    转载自oschina. 2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍 ...

  7. 内存分配、C++变量的生命周期和作用域

    1.内存分配 程序的内存分配有以下几个区域:堆区.栈区.全局区.程序代码区,另外还有文字常量区. 栈区 ——存放局部变量,即由auto修饰的变量,一般auto省略.由编译器自动分配释放.局部变量定义在 ...

  8. [LeetCode]题解(python):089 Gray Code

    题目来源 https://leetcode.com/problems/gray-code/ The gray code is a binary numeral system where two suc ...

  9. [转]Android 延迟执行

    开启新线程 new Thread(new Runnable(){ public void run(){ Thread.sleep(XXXX); handler.sendMessage(); //告诉主 ...

  10. [转载]CAD文件版本

    http://blog.sina.com.cn/s/blog_4c9fa4dd0101il1v.html 在工作中会遇到打开一张图纸时出现“图形文件无效”的提示,大部都是因为用低版本软件打开了高版本的 ...