1. 程式人生 > >java反射機制編寫簡單萬能DAO類

java反射機制編寫簡單萬能DAO類

由於在搭建編寫萬能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());
		}
		
		
	}
}