基于JDBC封装的BaseDao(实例代码)_java

最近闲暇时萌发写一写dao的封装的例子,就将以前写的整理一下。

public class BaseDao<T> {

	Connection conn;
	PreparedStatement st;
	ResultSet rs;

	JdbcUtil jdbcUtil = new JdbcUtil();

	int result = 0;

	private Class<T> persistentClass;

	@SuppressWarnings("unchecked")
	public BaseDaoUtil(){
		conn = jdbcUtil.getConnection();
		ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
		persistentClass = (Class<T>) type.getActualTypeArguments()[0];
	}

  /**
   * 保存
    * @param entity
   * @return
   */
	public int save(T entity) throws Exception{

		String sql = "INSERT INTO "+ entity.getClass().getSimpleName().toLowerCase() +" (";

		List<Method> list = this.matchPojoMethods(entity,"get");

		Iterator<Method> iter = list.iterator();

		Object obj[] = new Object[list.size()];
		int i = 0;
		//拼接字段顺序 insert into table name(id,name,email,
         while(iter.hasNext()) {
            Method method = iter.next();
            sql += method.getName().substring(3).toLowerCase() + ",";
            if (method.getReturnType().getSimpleName().indexOf("Date") !=-1) {
				SimpleDateFormat sbf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				obj[i] = sbf.format(method.invoke(entity, new Object[]{}));
		   }else {
				obj[i] = method.invoke(entity, new Object[]{});
		   }
      i++;
    }

    //去掉最后一个,符号insert insert into table name(id,name,email) values(
    sql = sql.substring(0, sql.lastIndexOf(",")) + ") values(";

    //拼装预编译SQL语句insert insert into table name(id,name,email) values(?,?,?,
    for(int j = 0; j < list.size(); j++) {
    	sql += "?,";
    }

    //去掉SQL语句最后一个,符号insert insert into table name(id,name,email) values(?,?,?);
    sql = sql.substring(0, sql.lastIndexOf(",")) + ")";

    //到此SQL语句拼接完成,打印SQL语句
    System.out.println(sql);

    try {
    	st = conn.prepareStatement(sql);
    	for (int j = 0; j < obj.length; j++) {
				st.setObject(j+1, obj[j]);
			}
			result = st.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		jdbcUtil.getClose(rs, st, conn);

		return result;
	}

	/**
	 * 删除
	 * @param object
	 * @return
	 * @throws SQLException
	 */
	public int deleteId(Object object) throws Exception{

		String sql = "delete from "+ persistentClass.getSimpleName().toLowerCase() +" where ";

		//通过子类的构造函数,获得参数化类型的具体类型.比如BaseDAO<T>也就是获得T的具体类型
    T entity = persistentClass.newInstance();

    //存放Pojo(或被操作表)主键的方法对象
    Method idMethod = null;

    List<Method> list = this.matchPojoMethods(entity, "set");
    Iterator<Method> iter = list.iterator();

    //过滤取得Method对象
    while(iter.hasNext()) {
      Method tempMethod = iter.next();
      if(tempMethod.getName().indexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) {
        idMethod = tempMethod;
      } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))){
        idMethod = tempMethod;
      }
    }
    //第一个字母转为小写
    sql += idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4) + " = ?";

		System.out.println(sql);

		st = conn.prepareStatement(sql);

		//判断id的类型
    if(object instanceof Integer) {
      st.setInt(1, (Integer)object);
    } else if(object instanceof String){
      st.setString(1, (String)object);
    }

		result = st.executeUpdate();

		jdbcUtil.getClose(rs, st, conn);

		return result;
	}

	/**
	 * 修改
	 * @param entity
	 * @return
	 * @throws Exception
	 */
	public int update(T entity) throws Exception{

		String sql = "update "+ entity.getClass().getSimpleName().toLowerCase() +" set ";

		List<Method> list = this.matchPojoMethods(entity, "get");

		//装载参数
		Object obj[] = new Object[list.size()];
		int i = 0;

		//临时Method对象,负责迭代时装method对象.
    Method tempMethod = null;

    //由于修改时不需要修改ID,所以按顺序加参数则应该把Id移到最后.
    Method idMethod = null;
    Iterator<Method> iter = list.iterator();
    while(iter.hasNext()) {
      tempMethod = iter.next();

      //如果方法名中带有ID字符串并且长度为2,则视为ID.
      if(tempMethod.getName().lastIndexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) {
      	obj[list.size()-1] = tempMethod.invoke(entity, new Object[]{});
        //把ID字段的对象存放到一个变量中,然后在集合中删掉.
        idMethod = tempMethod;
        iter.remove();
      //如果方法名去掉set/get字符串以后与pojo + "id"想符合(大小写不敏感),则视为ID
      } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))) {
      	obj[list.size()-1] = tempMethod.invoke(entity, new Object[]{});
      	idMethod = tempMethod;
        iter.remove();
      }
    }

    //把迭代指针移到第一位
    iter = list.iterator();
    while(iter.hasNext()) {
      tempMethod = iter.next();
      sql += tempMethod.getName().substring(3).toLowerCase() + "= ?,";
      obj[i] = tempMethod.invoke(entity, new Object[]{});
      i++;
    }

    //去掉最后一个,符号
    sql = sql.substring(0,sql.lastIndexOf(","));

    //添加条件
    sql += " where " + idMethod.getName().substring(3).toLowerCase() + " = ?";

    //SQL拼接完成,打印SQL语句
    System.out.println(sql);

    st = conn.prepareStatement(sql);

    for (int j = 0; j < obj.length; j++) {
			st.setObject(j+1, obj[j]);
		}

    result = st.executeUpdate();

    jdbcUtil.getClose(rs, st, conn);

		return result;

	}

	public T findById(Object object) throws Exception{

		String sql = "select * from "+ persistentClass.getSimpleName().toLowerCase() +" where ";

		//通过子类的构造函数,获得参数化类型的具体类型.比如BaseDAO<T>也就是获得T的具体类型
    T entity = persistentClass.newInstance();

    //存放Pojo(或被操作表)主键的方法对象
    Method idMethod = null;

    List<Method> list = this.matchPojoMethods(entity, "set");
    Iterator<Method> iter = list.iterator();

    //过滤取得Method对象
    while(iter.hasNext()) {
      Method tempMethod = iter.next();
      if(tempMethod.getName().indexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) {
        idMethod = tempMethod;
      } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))){
        idMethod = tempMethod;
      }
    }
    //第一个字母转为小写
    sql += idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4) + " = ?";

		System.out.println(sql);

		st = conn.prepareStatement(sql);

		//判断id的类型
    if(object instanceof Integer) {
      st.setInt(1, (Integer)object);
    } else if(object instanceof String){
      st.setString(1, (String)object);
    }

    rs = st.executeQuery();

    //把指针指向迭代器第一行
    iter = list.iterator();

    //封装
    while(rs.next()) {
      while(iter.hasNext()) {
        Method method = iter.next();
        if(method.getParameterTypes()[0].getSimpleName().indexOf("String") != -1) {
          //由于list集合中,method对象取出的方法顺序与数据库字段顺序不一致(比如:list的第一个方法是setDate,而数据库按顺序取的是"123"值)
          //所以数据库字段采用名字对应的方式取.
          this.setString(method, entity, rs.getString(method.getName().substring(3).toLowerCase()));
        } else if(method.getParameterTypes()[0].getSimpleName().indexOf("Date") != -1){
          this.setDate(method, entity, rs.getDate(method.getName().substring(3).toLowerCase()));
        }else {
          this.setInt(method, entity, rs.getInt(method.getName().substring(3).toLowerCase()));
        }
      }
    }

    jdbcUtil.getClose(rs, st, conn);

		return entity;

	}

	/**
   * 过滤当前Pojo类所有带传入字符串的Method对象,返回List集合.
   */
  private List<Method> matchPojoMethods(T entity,String methodName) {
    //获得当前Pojo所有方法对象
    Method[] methods = entity.getClass().getDeclaredMethods();

    //List容器存放所有带get字符串的Method对象
    List<Method> list = new ArrayList<Method>();

    //过滤当前Pojo类所有带get字符串的Method对象,存入List容器
    for(int index = 0; index < methods.length; index++) {
      if(methods[index].getName().indexOf(methodName) != -1) {
        list.add(methods[index]);
      }
    }
    return list;
  }

  /**
   * 参数类型为String时,为entity字段设置参数,对应set
   */
  public String setString(Method method, T entity, String arg) throws Exception{
    return (String)method.invoke(entity, new Object[]{arg});
  }

  /**
   * 参数类型为Date时,为entity字段设置参数,对应set
   */
  public Date setDate(Method method, T entity, Date arg) throws Exception{
    return (Date)method.invoke(entity, new Object[]{arg});
  }

  /**
   * 参数类型为Integer或int时,为entity字段设置参数,对应set
   */
  public Integer setInt(Method method, T entity, Integer arg) throws Exception{
    return (Integer)method.invoke(entity, new Object[]{arg});
  }

}

以上这篇基于JDBC封装的BaseDao(实例代码)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, jdbc
basedao
jdbc basedao、jdbc basedao的设计、spring jdbc basedao、java jdbc basedao、mybatis basedao 封装,以便于您获取更多的相关知识。

时间: 2024-07-29 17:47:12

基于JDBC封装的BaseDao(实例代码)_java的相关文章

基于jQuery实现返回顶部实例代码_jquery

效果图展示如下所示: 使用方法: 只需引用jQuery库和YesTop插件,然后一句代码就可以实现返回顶部: 引用代码: <script type="text/javascript" src="http://hovertree.com/ziyuan/jquery/jquery-1.11.3.min.js"></script> <script type="text/javascript" src="http:

Android基于HttpUrlConnection类的文件下载实例代码

废话不多说了,直接给大家贴代码了,具体代码如所示: /** * get方法的文件下载 * <p> * 特别说明 android中的progressBar是google唯一的做了处理的可以在子线程中更新UI的控件 * * @param path */ private void httpDown(final String path) { new Thread() { @Override public void run() { URL url; HttpURLConnection connectio

java实现连接mysql数据库单元测试查询数据的实例代码_java

1.按照javaweb项目的要求逐步建立搭建起机构,具体的类包有:model .db.dao.test; 具体的架构详见下图: 2.根据搭建的项目架构新建数据库test和数据库表t_userinfo并且添加对应的测试数据; (这里我使用的是绿色版的数据库,具体的下载地址:http://pan.baidu.com/s/1mg88YAc) 具体的建立数据库操作详见下图: 开发实例"> 3.编写包中的各种类代码,具体参考代码如下: UserInfo.java /** * FileName: Us

SpringMVC整合mybatis实例代码_java

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 一.逆向工程生成基础信息 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis G

简述Mybatis增删改查实例代码_java

编写一个简单的mybatis进行插入数据的实例 1 数据库建表 其中建表dob=Date of Birth 的意思 create table students (stud_id number primary key, name varchar2(20), email varchar2(20), dob date ); Oracle数据库中出现表已创建,则表示创建成功,如果出现名称已被使用,则可在建表之前进行删除操作:drop table students;或者进行级联删除drop table s

Java Web 简单的分页显示实例代码_java

本文通过两个方法:(1)计算总的页数. (2)查询指定页数据,实现简单的分页效果. 思路:首先得在 DAO 对象中提供分页查询的方法,在控制层调用该方法查到指定页的数据,在表示层通过 EL 表达式和 JSTL 将该页数据显示出来. 先给大家展示下效果图: 题外话:该分页显示是用 "表示层-控制层-DAO层-数据库"的设计思想实现的,有什么需要改进的地方大家提出来,共同学习进步.废话不多说了,开始进入主题,详细步骤如下所示: 1.DAO层-数据库 JDBCUtils 类用于打开和关闭数据

java基于swing实现的五子棋游戏代码_java

本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

Java基于swing实现的弹球游戏代码_java

本文实例讲述了Java基于swing实现的弹球游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: package Game; import java.awt.Graphics; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Random;

Java实现FTP文件的上传和下载功能的实例代码_java

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件.在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)."下载"文件就是从远程主机拷贝文件至自己