java反射+jdbc实现通用的增删改查,打成jar包可以自己用

反射+JDBC实现通用的增删改查


这里是dao层的方法,有些注释可能还没有来的及改,有些地方还可以优化优化,希望对你们能有所帮助!

public class QiaoDao {
private static ResultSet resultSet = null;
private static PreparedStatement preparedStatement = null;
private static Connection conn =null;
/**
连接数据源
/
public static void openSqlSession(){
conn=QiaoDataSourse.getConn();
}
/

* 传入对象查询所有
* @param t
* @param
* @return
*/
public static List SelectAll(T t){
List arr=new ArrayList<>();
try{
String sql="select * from "+t.getClass().getSimpleName().toLowerCase();
preparedStatement = conn.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
Field[] fields = t.getClass().getDeclaredFields();//获取所有的成员
while (resultSet.next()){
T t1 = (T) t.getClass().newInstance();//获取传入对象的实例
for (int i = 0; i <fields.length ; i++) {
String name=fields[i].getName();
fields[i].setAccessible(true);//开启暴力反射
fields[i].set(t1,resultSet.getObject(name));
}
arr.add(t1);
}
}catch (Exception e){
e.printStackTrace();
close();
}
return arr;
}

/**
 * 传入类的class查询所有
 * @param t
 * @param <T>
 * @return
 */
public static <T> List<T> SelectAll(Class<T> t){
    List<T> arr=new ArrayList<>();
    try{
        String sql="select * from "+t.getSimpleName().toLowerCase();
        preparedStatement = conn.prepareStatement(sql);
        resultSet = preparedStatement.executeQuery();
        Field[] fields = t.getDeclaredFields();//获取所有的成员
        while (resultSet.next()){
            T t1 = t.newInstance();//获取传入对象的实例
            for (int i = 0; i <fields.length ; i++) {
                String name=fields[i].getName();
                fields[i].setAccessible(true);//开启暴力反射
                fields[i].set(t1,resultSet.getObject(name));
            }
            arr.add(t1);
        }
    }catch (Exception e){
        e.printStackTrace();
        close();
    }
    return arr;
}

/**
 * 根据条件查询
 */
public static <T> List<T> SelectByParam(Class<T> t,QiaoUtil qiaoNB){//根据条件查询
    StringBuffer buffer=new StringBuffer();//创建字符缓冲区
    buffer.append("select * from "+t.getSimpleName().toLowerCase()+" where ");
    Map<String,Object> map=qiaoNB.map;//接收想要查询的字段和值
    Set<String> strings = map.keySet();//获取映射中包含的键的 Set 视图
    for (String s :strings){//增强for遍历
        Object o = map.get(s);
        if (o instanceof Integer){//类型判断
            buffer.append(s+" = "+o+" and ");
        }else {
            buffer.append(s+" = '"+o+"' and ");
        }
    }
    int and = buffer.lastIndexOf("and");//把最后一个and去掉
    String substring = buffer.substring(0, and);//获取最终的sql语句
    System.out.println(substring);
    List<T> arr=new ArrayList<>();
    Field[] fields = t.getDeclaredFields();//获取所有的属性共有的和私有的
    try {
        preparedStatement = conn.prepareStatement(substring);//sql语句预编译
        resultSet = preparedStatement.executeQuery();//发送sql语句
        while (resultSet.next()){//光标下移动,遍历结果集
            T t1 = (T)t.newInstance();//获取传入对象的实例
            for (Field field : fields) {//增强for遍历出类的属性
                String name=field.getName();//获取属性名
                field.setAccessible(true);//开启暴力反射
                field.set(t1,resultSet.getObject(name));//获取属性的值
            }
            arr.add(t1);
        }
    } catch (Exception e) {
        e.printStackTrace();
        close();
}
    return arr;
}

/**
 * 添加的方法
 * @param t
 * @param <T>
 * @return
 */

public static <T> boolean save(T t){
    Field[] fields = t.getClass().getDeclaredFields();//获取传入对象的数组
    StringBuffer buffer=new StringBuffer();//创建一个字符缓冲区
    buffer.append("insert into "+t.getClass().getSimpleName().toLowerCase()+" (");//拼接sql语句
    String str="";
    boolean flag=false;
    for (Field field:fields) {
        String name = field.getName();//获取属性名称
        field.setAccessible(true);//开启暴力反射
        try {
            Object o = field.get(t);//获取属性的值
            if(o instanceof Integer){//判断类型
                str=str+o+",";
            }else{
                str=str+"'"+o+"',";//拼接sql语句,添加单引号
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            close();
        }

        buffer.append(name+",");//拼接sql语句
    }
    int i2 = str.lastIndexOf(",");//获取最后一个逗号的位置
    String substring = str.substring(0,i2);//截取除逗号以外的字符
    int i1 = buffer.lastIndexOf(",");//获取最后一个逗号的位置
    buffer.replace(i1,buffer.length(),"");//把逗号替换成空格
    buffer.append(") values (");//拼接sql语句
    buffer.append(substring+")");//拼接sql语句
    System.out.println(buffer);//打印sql语句
    try {
        preparedStatement = conn.prepareStatement(buffer+"");//sql语句预编译
        int i = preparedStatement.executeUpdate();//发送sql语句
        if (i==1)
            flag=true;
    }catch (Exception e){
        e.printStackTrace();
        close();
    }

    return flag;
}

/**
 * 更新的方法
 * @param t
 * @param <T>
 * @return
 */
public static <T> boolean update(Class<T> t,QiaoUtil qiaoNB){//根据条件更新
    boolean flag=false;
    StringBuffer buffer=new StringBuffer();//创建字符缓冲区
    Map<String,Object> map=qiaoNB.map;//接收想要修改的字段和值
    Map<String,Object> map2=qiaoNB.map2;//接收想要修改的条件的字段的值
    Set<String> strings = map.keySet();//获取映射中包含的键的 Set 视图
    buffer.append("update "+t.getSimpleName().toLowerCase()+" set ");
    for (String s :strings){//增强for遍历
        Object o = map.get(s);
        if (o instanceof Integer){//类型判断
            buffer.append(s+" = "+o+",");
        }else{
            buffer.append(s+" = '"+o+"',");
        }
    }
    int and = buffer.lastIndexOf(",");//把最后一个and去掉
    buffer.replace(and,buffer.length(),"");//把逗号替换成空格
    buffer.append(" where ");
    Set<String> strings2 = map2.keySet();//获取映射中包含的键的 Set 视图
    for (String s :strings2){//增强for遍历
        Object o = map2.get(s);
        if (o instanceof Integer){//类型判断
            buffer.append(s+" = "+o+" and ");
        }else{
            buffer.append(s+" = '"+o+"' and ");
        }
    }
    int ands = buffer.lastIndexOf("and");//把最后一个and去掉
    buffer.replace(ands,buffer.length(),"");//把逗号替换成空格
    System.out.println(buffer);//打印sql语句
    Field[] fields = t.getDeclaredFields();//获取所有的属性共有的和私有的
    try {
        preparedStatement = conn.prepareStatement(buffer+"");//sql语句预编译
        int i = preparedStatement.executeUpdate();
        if (i==1)
            flag=true;
    } catch (Exception e) {
        e.printStackTrace();
        close();
    }
    return flag;
}
/**
 * 删除的方法
 * @param t
 * @param <T>
 * @return
 */
public static <T> boolean deleteByTerm(Class<T> t,QiaoUtil qiaoNB){//根据条件删除
    boolean flag=false;
    StringBuffer buffer=new StringBuffer();//创建字符缓冲区
    buffer.append("delete from "+t.getSimpleName().toLowerCase()+" where ");
    Map<String,Object> map=qiaoNB.map2;//接收想要查询的字段和值
    Set<String> strings = map.keySet();//获取映射中包含的键的 Set 视图
    for (String s :strings){//增强for遍历
        Object o = map.get(s);
        if (o instanceof Integer){//类型判断
            buffer.append(s+" = "+o+" and ");
        }else {
            buffer.append(s+" = '"+o+"' and ");
        }
    }
    int and = buffer.lastIndexOf("and");//把最后一个and去掉
    String substring = buffer.substring(0, and);//获取最终的sql语句
    System.out.println(substring);
    try{
        preparedStatement = conn.prepareStatement(substring);//sql语句预编译
        int i = preparedStatement.executeUpdate();//发送sql语句
        if (i==1)
            flag=true;
    } catch (Exception e) {
        e.printStackTrace();
        close();
    }
    return flag;
}

public static void close(){关闭数据源
    try {
        if (resultSet!=null){
            resultSet.close();
        }
        if (preparedStatement!=null){
            preparedStatement.close();
        }
        if (conn!=null){
            conn.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

}

这里是QiaoDataSourse类里面的方法和属性,用来注册驱动和获取连接信息的代码,这里需要我们在src下面创建一个jdbc.properties文件,里面有url,name,pwd,ClassName,4个属性,并且根据你的数据库的信息赋予属性对应的值。

public class QiaoDataSourse {
public static String url=null;
public static String name=null;
public static String pwd=null;
public static String ClassName=null;
public static Connection connection ;

private static void getDataMessage(){
    InputStream reader=null;
    try {
        reader = QiaoDataSourse.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        properties.load(reader);
        name= properties.getProperty("name");
        pwd= properties.getProperty("pwd");
        ClassName= properties.getProperty("ClassName");
        url= properties.getProperty("url");
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

public static Connection getConn(){
    getDataMessage();
    try {
        //加载驱动
        Class.forName(ClassName);
        //获取数据库连接
        connection=DriverManager.getConnection(url, name, pwd);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return connection;
}
}

这个是查询和添加传参用的类,setParam这个方法是保存字段对应的值用的,setTerm这个类是保存where后面的条件用的。

public class QiaoUtil {
protected Map<String,Object> map=new HashMap<>();
protected Map<String,Object> map2=new HashMap<>();
@Override
public String toString() {
return “QiaoNB{” +
“map=” + map +
‘}’;
}

public void setParam(String name, Object obj){
    map.put(name,obj);
}
public void setTerm(String name, Object obj){
    map2.put(name,obj);
}

}

写完以后小伙伴们可以打成jar包来运行啦,下面我们来测试一下吧

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

添加,删除,添加查询,全查询,都可以试一试噢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值