私のパクリ版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,パラメータ);
データベースから取得した「name」フィールドの値をUserのname属性に割り当てるにはどうすればいいですか?
ではsetNameメソッドを呼び出すべきです.一般的な呼び出しではなく、反射を使用します.
3.xmlプロファイルの読み込み
dom 4 jの使用
4.xmlプロファイルを取得するパス
以前お話ししたように、webエンジニアリングを書くときにsrcディレクトリの下のファイルは実際にWEB-INF/classesの下に置かれています.
二.構成と使用
1.srcディレクトリの下でhibernateを確立する.hbm.xml、まずmysqlのドライバパッケージを導入しましょう
これは本物のHernateとあまり違いません
2.同じクラスのディレクトリの下にUserを作成します.hbm.xmlファイルは、他のパスを必要とすることもできますが、hibernateを変更する必要があります.hbm.xmlだ
3.Userのようなpojoクラスの作成
4.テストを始めましょう
印刷結果:
//省略事前にuserテーブルがあったのでsaveメソッドも使えますので、事前にテーブルを作らなくてもいいです
name=a pwd=a
三..コードを見てみましょう.
まずはSessionインタフェース
その実装クラスはHibernateSessionで、saveコードだけを見てください.
Queryインタフェースを見てみましょう.データベースを検索する必要があります.その実現はQueryImpです.貼らないでください.
コンフィギュレーション構成クラス
まだ完備しなければならない.
はい、すべてのコードを投稿するべきではありません.興味があれば、コードを見てみましょう.
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;
}
}
まだ完備しなければならない.
はい、すべてのコードを投稿するべきではありません.興味があれば、コードを見てみましょう.