反射+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包来运行啦,下面我们来测试一下吧
添加,删除,添加查询,全查询,都可以试一试噢!