BaseJDBC和CRUDDAO的写法实例代码

作者:周振宇 时间:2022-09-03 14:13:33 

我们首先看下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;
}
}

来源:http://blog.csdn.net/fvdfsdafdsafs/article/details/53420589

标签:BaseJDBC,CRUDDAO
0
投稿

猜你喜欢

  • Android自定义TextView实现drawableLeft内容居中

    2022-04-24 18:20:14
  • Springboot-Shiro基本使用详情介绍

    2022-10-13 03:02:42
  • Android应用中图片浏览时实现自动切换功能的方法详解

    2023-04-13 15:34:00
  • Android事件冲突解决悬浮窗拖拽处理方案

    2023-12-17 01:51:17
  • Spring Boot 结合 aop 实现读写分离

    2023-09-29 07:53:02
  • Idea配置超详细图文教程(2020.2版本)

    2023-03-13 21:41:04
  • Android中 视频屏幕左半部分上下滑动改变亮度右半部分上下滑动改变声音

    2021-08-13 02:57:12
  • Android用viewPager2实现UI界面翻页滚动的效果

    2023-06-08 02:46:43
  • Java使用ThreadLocal实现当前登录信息的存取功能

    2023-06-06 12:00:34
  • Android 高仿微信朋友圈动态支持双击手势放大并滑动查看图片效果

    2021-08-21 21:16:40
  • c#制作类似qq安装程序一样的单文件程序安装包

    2021-07-22 17:13:31
  • java中文传值乱码问题的解决方法

    2023-11-25 16:26:47
  • 线程阻塞唤醒工具 LockSupport使用详解

    2023-11-29 17:16:10
  • SpringBoot整合mybatis-generator-maven-plugin的方法

    2022-08-14 18:34:22
  • 利用C#实现SSLSocket加密通讯的方法详解

    2023-03-01 02:23:05
  • Kotlin Flow常见场景下的使用实例

    2023-01-30 10:46:25
  • 教你轻松制作java视频播放器

    2023-06-25 06:34:05
  • Unity3D Shader实现镜子效果

    2023-03-17 04:16:07
  • @SpringBootTest 注解报红问题及解决

    2022-08-14 23:24:51
  • java 中sendredirect()和forward()方法的区别

    2021-11-07 18:39:28
  • asp之家 软件编程 m.aspxhome.com