私のパクリ版hibernateを見て簡単に実現します.


この2,3日パクリをしているhibernateは、Session save、update、delete、get、Queryインタフェースの実現を完了しました.
Hiberate ORMはソフトウェアがオブジェクトと関係データベースの間で変換するモジュール層であり、データベース操作Daoクラスの実現を簡略化することができる.
一.技術のポイント:
1.動的マウント
 
プログラムの実行後、どのクラスをマウントするかを決定してからインスタンス化する.
マウント
Class c = Class.forName(className);
 
インスタンス化
Object o = c.newInstance();//呼び出されたのはクラスの無パラメトリック構築方法だけですが、本プログラムでは十分です.
 
2 .はんしゃ
クラスのクラスオブジェクトによって、静的ブロック、プロパティ、メソッド、親、インタフェース、コンストラクタ、例外、メソッドパラメータ、メソッド戻り値などのすべての情報が得られます.これらの情報は、オブジェクトとして表示されます.すべてが対象だ.しかしprivate修飾の属性は、メソッドが得られず、アクセス権が必要です.
java.lang.reflect Method[] m = c.getMethods();//すべてのメソッドへ
...
得られたメソッドは呼び出すこともできます
Object rt=m[0].invoke(o,パラメータ);
class User{
   private String name;

   public void getName()
   {
      return name
   }
   public String setName(String name){
      this.name = name;
   }

}

 
データベースから取得した「name」フィールドの値をUserのname属性に割り当てるにはどうすればいいですか?
ではsetNameメソッドを呼び出すべきです.一般的な呼び出しではなく、反射を使用します.
 
3.xmlプロファイルの読み込み
 
dom 4 jの使用
SAXReader reader = new SAXReader();
Document doc = reader.read(file); // file File   
Element root = doc.getRootElement(); //     
Element e = root;
Iterator it=e.elementIterator();//     

 
4.xmlプロファイルを取得するパス
以前お話ししたように、webエンジニアリングを書くときにsrcディレクトリの下のファイルは実際にWEB-INF/classesの下に置かれています.
 
		String path = this.getClass.toString();//    
		path = this.getClass.getResource(path.substring(path.lastIndexOf(".")+1)+".class").toString();//         
		path = path.substring(0,path.indexOf("/WEB-INF"));  //      
		path = path + "/WEB-INF/classes";//  classes  
		path = path + "/hibernate.hbm.xml";//        
		if(path.startsWith("jar:")){
			path = path.substring(4);
		}
		URI uri = null;
		try {
			uri = new  URI(path);
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
		Log.printLog("uri="+uri);
		File file = new File(uri);
		if(!file.exists()){
			Log.printLog("       !");
			return null;
		}

 
 
二.構成と使用
 
1.srcディレクトリの下でhibernateを確立する.hbm.xml、まずmysqlのドライバパッケージを導入しましょう
 
<?xml version="1.0" encoding="UTF-8"?>

<hibernate-configuration>
<session-factory>
<property name="show_sql">true</property> //  sql
<property name="dialect">mysql</property>   //    
<property name="driver">com.mysql.jdbc.Driver</property> //
<property name="url">jdbc:mysql://localhost:3306/catpage</property>
<property name="username">root</property>
<property name="password">root</property>
<mapping-resource>User.hbm.xml</mapping-resource>      //pojo    
</session-factory>
</hibernate-configuration>

 
これは本物のHernateとあまり違いません
 
2.同じクラスのディレクトリの下にUserを作成します.hbm.xmlファイルは、他のパスを必要とすることもできますが、hibernateを変更する必要があります.hbm.xmlだ
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>
<class name="cn.netjava.model.User" table="user"> //pojo     
<id name="id" column="id"></id>  //  

<property name="name" column="name" /> //  
<property name="pwd"  column="pwd"/>
</class>
</hibernate-mapping>

 
3.Userのようなpojoクラスの作成
package cn.netjava.model;

public class User {

	private int id;
	private String name;
	private String pwd;
	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 String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
}

 
4.テストを始めましょう
package cn.netjava.model;

import cn.netjava.hibernate.Configuration;
import cn.netjava.hibernate.Session;

public class Test {

	public static void main(String args[]){
		try {
			//
			Session session = new Configuration().configure().buildSessionFactory().openSession();
			User user = (User)session.query(User.class, 8);//  id 8 user
			System.out.println("name="+user.getName()+"\tpwd="+user.getPwd());
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 
 
印刷結果:
//省略事前にuserテーブルがあったのでsaveメソッドも使えますので、事前にテーブルを作らなくてもいいです
 name=a pwd=a 
 
 
 
三..コードを見てみましょう.
 
まずはSessionインタフェース
 
package cn.netjava.hibernate;

public interface Session {

	/**
	 *    pojo     
	 * @param obj  pojo bean  
	 * @return      
	 */
	public int save (Object obj,Class c) ;
	/**
	 *        pojo  
	 * @param c pojo    
	 * @param priKey   
	 * @return  pojo  
	 */
	public Object query(Class c,Object priKey);
	
	/**
	 *   pojo     
	 * @param priKey       
	 * @param obj     pojo  
	 * @param c     pojo    
	 */
	public void update(Object priKey,Object obj,Class c);
	
	/**
	 *         pojo
	 * @param priKey    
	 *  @c: pojo    
	 *  return       
	 */
	public boolean delete(Object priKey,Class c);
	
	/**
	 *   sql      
	 * @param sql sql    
	 * @return     
	 */
	public Query createQuery(String sql);
	
}

 
その実装クラスはHibernateSessionで、saveコードだけを見てください.
 
	/**
	 *    pojo     
	 * @param obj  pojo bean  
	 * @c Pojo    
	 * @return      
	 */
	public int save (Object obj,Class c) {
		MappingConfiguration mc = findConfig(c);//pojo      
//		        ,      

		if(!hasTable(mc.getTable())){
			try {
				if(createTable(obj,c,mc.getTable())){
					Log.printLog("    "+mc.getTable());
					tableMap.put(mc.getTable(), true);
				}
				else{
					Log.printLog("     ");
					return 0;
				}
				
			} catch (Exception e) {
				Log.printLog("     ");
				e.printStackTrace();
				return 0;
			}
		}
		
		List<Word> wordList = mc.getWordList(); //   pojo     
		
		//  sql  
		String sql = "insert into "+mc.getTable() +"(";
		for(Word w:wordList){
			if(!w.getAttrname().equals(mc.getPriKey().getAttrname())){//    
				sql+=w.getColumn()+",";
			}
		}
		sql+=") values(";
		for(Word w:wordList){
			if(!w.getColumn().equals(mc.getPriKey().getColumn())){
				sql+="?,";
			}
		}
		sql+=")";
		/*       sql ()     ','  */
		StringBuffer sb = new StringBuffer(sql);
		int s = sb.indexOf(",)");
		while(s>0){
			sb.deleteCharAt(s);
			s=sb.indexOf(",)");
		}
		sql =sb.toString();
		
		PreparedStatement pstmt = dbconn.getPSatement(sql);
		int num=0;
		try{
			//  sql  ?
			for(Word w:wordList){
				if(!w.getColumn().equals(mc.getPriKey().getColumn())){
					Method m = Tool.getGetMethod(c,w.getAttrname());
					Object ort = m.invoke(obj);
					System.out.println("ort="+ort);
					pstmt.setString(++num, ort.toString());
						
				}	
			}
			pstmt.execute();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		
		//           ,    mysql           ,           id
		sql = "select * from "+mc.getTable()+" order by "+mc.getPriKey().getColumn()+" desc limit 1";
		Query query = createQuery(sql);
		query.addEntity(c);
		List l = query.list();
		Object result = l.get(0);
		Method mPriKey = Tool.getGetMethod(c, mc.getPriKey().getAttrname());//     get  
		Object rt = null;
		try {
			rt = mPriKey.invoke(result);
		} catch (Exception e) {
			Log.printLog("        ");
			e.printStackTrace();
		}
		Log.printLog("priKek="+rt);
		return Integer.parseInt(rt.toString());
	}

 
Queryインタフェースを見てみましょう.データベースを検索する必要があります.その実現はQueryImpです.貼らないでください.
 
package cn.netjava.hibernate;

import java.util.List;
/**
 *     
 * @author sky
 *
 */
public interface Query {

	/**
	 *             
	 * @param c           
	 */
	public void addEntity(Class c);
	/**
	 *     
	 * @return     
	 */
	public boolean excute();
	/**
	 *       ,  List 
	 * @return     
	 */
	public List list();
	
	/**
	 *      sql
	 * @param index '?'   , 1  
	 * @param value '?'  
	 */
	public  void setString(int index,String value);
	/**
	 *      sql
	 * @param index '?'   , 1  
	 * @param value '?'  
	 */
	public void setInt(int index,int value);
	/**
	 *      sql
	 * @param index '?'   , 1  
	 * @param value '?'  
	 */
	public void setFloat(int index,float value);
}

 
コンフィギュレーション構成クラス
 
/**
 * hibernate     
 * @author sky
 *
 */
public class Configuration {

	private boolean isShowSql;  				//    sql  
	private String dialect;						//        
	private String driver;						//        
	private String url;							//      url  
	private String username;					//         
	private String password;					//        
	private List<String> mapping_resource;		//pojo       
	private List<MappingConfiguration> mcList;	//pojo         

     /*

             seter,getter    
       */



	/**
	 *       
	 * @return this
	 */
	public Configuration configure(){
                          /* xml*/
                          ......
               }

	/**
	 *   Session    
	 * @return   
	 * @throws Exception 
	 */
	public SessionFactory buildSessionFactory() throws Exception{
		SessionFactory sf = SessionFactory.getSessionFactory(this);
		return sf;
	}


}

 
まだ完備しなければならない.
はい、すべてのコードを投稿するべきではありません.興味があれば、コードを見てみましょう.