java反射機制編寫簡單萬能DAO類
阿新 • • 發佈:2019-01-29
由於在搭建編寫萬能DAO時,已經寫了大量的程式碼
在此只給出部分的測試原始碼
如有需要完整專案或者有任何建議聯絡973639421
package com.oman.bean; public class Person { private int id; private String name; private int age; private int type; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getType() { return type; } public void setType(int type) { this.type = type; } }
package com.oman.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import com.oman.bean.Person; import com.oman.util.BaseConnection; public class PersonDao { //編寫普通查詢方法 public ArrayList<Person> getList(){ ArrayList<Person> list = new ArrayList<Person>(); Connection conn = BaseConnection.getConnection(); PreparedStatement ps = null; ResultSet rs = null; String sql = "select * from Person"; try { ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while(rs.next()){ Person person = new Person(); person.setId(rs.getInt("id")); person.setName(rs.getString("name")); person.setAge(rs.getInt("age")); person.setType(rs.getInt("type")); list.add(person); } } catch (Exception e) { e.printStackTrace(); }finally{ BaseConnection.closeRec(conn, ps, rs); } return list; } //編寫普通插入方法 public boolean insert(Person person){ boolean flag = false; Connection conn = BaseConnection.getConnection(); PreparedStatement ps = null; String sql = "insert into Person(name,age,type) values(?,?,?)"; try { ps = conn.prepareStatement(sql); ps.setString(1, person.getName()); ps.setInt(2, person.getAge()); ps.setInt(3, person.getType()); int a = ps.executeUpdate(); if(a > 0){ flag = true; } } catch (Exception e) { e.printStackTrace(); }finally{ BaseConnection.closeRec(conn, ps); } return flag; } //編寫普通修改方法 public boolean update(Person person){ boolean flag = false; Connection conn = BaseConnection.getConnection(); PreparedStatement ps = null; String sql = "update person set name = ?,age = ?,type = ? where id = ?"; try { ps = conn.prepareStatement(sql); ps.setString(1, person.getName()); ps.setInt(2, person.getAge()); ps.setInt(3, person.getType()); ps.setInt(4, person.getId()); int a = ps.executeUpdate(); if(a>0){ flag = true; } } catch (Exception e) { e.printStackTrace(); }finally{ BaseConnection.closeRec(conn, ps); } return flag; } }
package com.oman.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class BaseConnection { //首先編寫一個獲取Connection的方法 public static Connection getConnection (){ Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/school","root","root"); } catch (Exception e) { e.printStackTrace(); } return conn; } //其次編寫關閉資源的方法 public static void closeRec(Connection conn,PreparedStatement ps){ try { if(ps!=null){ ps.close(); } if(conn!=null){ conn.close(); } } catch (Exception e) { e.printStackTrace(); } } public static void closeRec(Connection conn,PreparedStatement ps,ResultSet rs){ try { if(ps!=null){ ps.close(); } if(conn!=null){ conn.close(); } if(rs!=null){ rs.close(); } } catch (Exception e) { e.printStackTrace(); } } }
package com.oman.util;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import com.oman.bean.Person;
//編寫萬能DAO類
public class BaseDao {
//查詢所有
public ArrayList getList(Class cl){
ArrayList list = new ArrayList();
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
//由於資料庫中的表名對應的是實體類的類名,所以可以通過傳入的類得到表名cl.getSimpleName()
String sql = "select * from " + cl.getSimpleName();
//獲取類物件的所有屬性
Field[] fi = cl.getDeclaredFields();
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
Object object = cl.newInstance();//例項化類物件
for(Field ff:fi){
ff.setAccessible(true);//開啟控制訪問許可權
ff.set(object, rs.getObject(ff.getName()));
}
list.add(object);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
BaseConnection.closeRec(conn, ps, rs);
}
return list;
}
//根據表的主鍵查詢表的物件
public Object getObjectById(Class cl,int id){
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
Field[] fi = cl.getDeclaredFields();
//由於類中不一定用id表示編號,但是通常類中的第一個屬性為編號id
String sql = "select * from " + cl.getSimpleName() + " where " + fi[0].getName() + " = " + id;
Object object = null;
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
object = cl.newInstance();
for(Field ff:fi){
ff.setAccessible(true);
ff.set(object, rs.getObject(ff.getName()));
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
BaseConnection.closeRec(conn, ps, rs);
}
return object;
}
//根據特定條件查詢
public ArrayList getListByCondition(Class cl,String name,Object value){
ArrayList list = new ArrayList();
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from " + cl.getSimpleName() + " where " + name + " = '" + value+"'";
Field[] fi = cl.getDeclaredFields();
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
Object object = cl.newInstance();//例項化類物件
for(Field ff:fi){
ff.setAccessible(true);//開啟控制訪問許可權
ff.set(object, rs.getObject(ff.getName()));
}
list.add(object);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
BaseConnection.closeRec(conn, ps, rs);
}
return list;
}
//插入物件
public boolean insert(Object object){
boolean flag = false;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
//獲取物件的類
Class cl = object.getClass();
Field[] fi = cl.getDeclaredFields();
//insert into Person(name) values(?,?,?)
//以下開始拼接sql語句
//兩個String物件的連線是很耗費資源的,以下方法可以通過StringBuffer優化,
//可以減少資源利用,使用apand對StringBuffer進行拼接
String sql = "insert into " + cl.getSimpleName() + " (";
for (int i = 1; i < fi.length; i++) {
sql = sql + fi[i].getName();
if (i < fi.length-1) {
sql = sql + ",";
}
}
sql = sql + ") values(";
for (int i = 1; i < fi.length; i++) {
sql = sql + "?";
if (i < fi.length-1) {
sql = sql + ",";
}
}
sql = sql + ")";
try {
ps = conn.prepareStatement(sql);
for(int i = 1;i<fi.length;i++){
fi[i].setAccessible(true);
ps.setObject(i, fi[i].get(object));
}
int a = ps.executeUpdate();
if(a > 0){
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
BaseConnection.closeRec(conn, ps);
}
return flag;
}
//優化插入
public boolean insert1(Object object){
boolean flag = false;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
Class cl = object.getClass();
Field[] fi = cl.getDeclaredFields();
StringBuffer sb = new StringBuffer();
sb.append("insert into ");
sb.append(cl.getSimpleName());
sb.append(" (");
for(int i = 1;i<fi.length;i++){
sb.append(fi[i].getName());
if(i!=fi.length-1){
sb.append(" , ");
}
}
sb.append(") values (");
for(int i = 1;i<fi.length;i++){
sb.append(" ? ");
if(i!=fi.length-1){
sb.append(" , ");
}
}
sb.append(" ) ");
try {
ps = conn.prepareStatement(sb.toString());
for(int i = 1;i<fi.length;i++){
fi[i].setAccessible(true);
ps.setObject(i, fi[i].get(object));
}
int a = ps.executeUpdate();
if(a>0){
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
BaseConnection.closeRec(conn, ps);
}
return flag;
}
//更新
public boolean update(Object object){
boolean flag = false;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
Class cl = object.getClass();
Field[] fi = cl.getDeclaredFields();
StringBuffer sb = new StringBuffer();
//update person set name = ?,age = ?,type = ? where id = ?
sb.append(" update ");
sb.append(cl.getSimpleName());
sb.append(" set ");
for(int i = 1;i<fi.length;i++){
fi[i].setAccessible(true);
sb.append(fi[i].getName());
sb.append(" = ? ");
if(i!=fi.length-1){
sb.append(" , ");
}
}
sb.append(" where ");
sb.append(fi[0].getName());
sb.append("=?");
try {
ps = conn.prepareStatement(sb.toString());
for(int i = 1;i<fi.length;i++){
fi[i].setAccessible(true);
ps.setObject(i, fi[i].get(object));
}
fi[0].setAccessible(true);
ps.setObject(fi.length, fi[0].get(object));
int a = ps.executeUpdate();
if(a>0){
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
BaseConnection.closeRec(conn, ps);
}
return flag;
}
//根據id刪除
public boolean delete(Class cl , int id){
boolean flag = false;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
Field[] fi = cl.getDeclaredFields();
String sql = "delete from "+cl.getSimpleName()+" where "+fi[0].getName()+" = ?";
try {
ps = conn.prepareStatement(sql);
ps.setObject(1, id);
int a = ps.executeUpdate();
if(a>0){
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
BaseConnection.closeRec(conn, ps);
}
return flag ;
}
//根據特定條件刪除
public boolean deleteByCondition(Class cl , String name,Object value){
boolean flag = false;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
Field[] fi = cl.getDeclaredFields();
String sql = "delete from "+cl.getSimpleName()+" where "+name+" = ?";
try {
ps = conn.prepareStatement(sql);
ps.setObject(1, value);
int a = ps.executeUpdate();
if(a>0){
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
BaseConnection.closeRec(conn, ps);
}
return flag ;
}
public static void main(String[] args) {
//測試getList()
BaseDao baseDao = new BaseDao();
// ArrayList<Person> plist = baseDao.getList(Person.class);
// for(Person p:plist){
// System.out.println("編號:"+p.getId()+" 姓名:"+p.getName()+" 年齡:"+p.getAge());
// }
/*測試效果
編號:1 姓名:小明 年齡:21
編號:2 姓名:小華 年齡:22
編號:3 姓名:李四 年齡:34
*/
//測試getObjectById()
// Person person = (Person) baseDao.getObjectById(Person.class, 1);
// System.out.println("編號:"+person.getId()+" 姓名:"+person.getName());
/*測試效果
編號:1 姓名:小明
*/
//測試getListByCondition()
// ArrayList<Person> plist = baseDao.getListByCondition(Person.class,"name","李四");
// for(Person p:plist){
// System.out.println("編號:"+p.getId()+" 姓名:"+p.getName()+" 年齡:"+p.getAge());
// }
/*測試效果
編號:3 姓名:李四 年齡:34
*/
//測試insert()
// Person person = new Person();
// person.setName("王五");
// person.setAge(44);
// person.setType(2);
// boolean flag = baseDao.insert(person);
// if(flag == true){
// System.out.println("插入成功");
// }
/*測試效果
插入成功
*/
//測試update()
// Person person = new Person();
// person.setName("王五五");
// person.setAge(444);
// person.setType(2);
// person.setId(4);
// boolean flag = baseDao.update(person);
// if(flag == true){
// System.out.println("修改成功");
// }
/*測試效果
修改成功
*/
//測試delete()與deleteBySome()
boolean flag = baseDao.deleteByCondition(Person.class, "name","王五五");
if(flag == true){
System.out.println("刪除成功");
}
/*測試效果
刪除成功
*/
//baseDao.delete(Person.class, 3);
}
}
package com.oman.main;
import java.util.ArrayList;
import com.oman.bean.Person;
import com.oman.bean.Person_type;
import com.oman.dao.PersonDao;
import com.oman.dao.Person_typeDao;
public class TestMain {
public static void main(String[] args) {
PersonDao personDao = new PersonDao();
ArrayList<Person> plist = personDao.getList();
for(Person person : plist){
System.out.println(person.getName());
}
System.out.println("------");
Person_typeDao person_typeDao = new Person_typeDao();
ArrayList<Person_type> ptlist = person_typeDao.getList();
for(Person_type person_type : ptlist){
System.out.println(person_type.getName());
}
}
}