每次开发项目时,在做数据库开发时,对于不同类都有对应的Dao类,这就要要编写大量的Dao类,其中大多是代码堆砌,但有时我们要完成特定的操作,开发独立的Dao类是必须的,但如果只是实现数据的插入、读取、更新、删除,那么如果有一个通用的Dao类可以对数据库中的所有表进行操作,可以免去编写大量同质代码的负担。
一. Java反射机制
Reflection是Java被视为动态语言的一个关键性质,这个机制允许程序在运行时通过Reflection APIs却任何一个一直名称的的class的内部信息,包括modifiers、superclass、实现的interfaces、fields和methods等所有信息,并可于运行时改变fields内容和调用methods。
二.Java反射机制主要提供了以下功能
1)在运行时判断人一个对象所属的类
2)在运行是构造任意一个类的对象
3)在运行时判断任意一个类所具有的成员变量和方法
4)在运行时调用任意一个对象的方法
利用Java的反射机制就可以解决之前必须对知道每个类的属性和方法来调用的问题。就可以实现一个山寨的hibernate
三.配置
首先,还是来配置项目
这就是一使用了Hibernate的项目的结构,hibernate.cfg.xml和每个pojo类的xml配置文件,不过我们不需要Hibernate所需的配置包,因为我们要自己来实现它。
- <hibernate-configuration>
- <session-factory>
- <property name="show_sql">true</property> <!--让hb在运行时显示实际执行的sql语句 -->
- <property name="format_sql">true</property> <!-- 使显示的sql格式化-->
- <property name="dialect"> <!-- 设定sql方法,使用的是mySQL -->
- org.hibernate.dialect.MySQLDialect
- </property>
- <property name="connection.driver_class"> <!-- JDBC驱动类的名字 -->
- com.mysql.jdbc.Driver
- </property>
- <property name="connection.url"> <!--数据库连结串配置 -->
- jdbc:mysql://localhost:3306/twblog
- </property>
- <!--数据库用户名配置 -->
- <property name="connection.username">root</property>
- <!-- 数据库密码配置 -->
- <property name="connection.password">mysql</property>
- <!-- pojo类的配置文件 -->
- <mapping resource="pojo/Userinfo.hbm.xml" />
- <mapping resource="pojo/Blog.hbm.xml" />
- </session-factory>
- </hibernate-configuration>
<hibernate-configuration> <session-factory> <property name="show_sql">true</property> <!--让hb在运行时显示实际执行的sql语句 --> <property name="format_sql">true</property> <!-- 使显示的sql格式化--> <property name="dialect"> <!-- 设定sql方法,使用的是mySQL --> org.hibernate.dialect.MySQLDialect </property> <property name="connection.driver_class"> <!-- JDBC驱动类的名字 --> com.mysql.jdbc.Driver </property> <property name="connection.url"> <!--数据库连结串配置 --> jdbc:mysql://localhost:3306/twblog </property> <!--数据库用户名配置 --> <property name="connection.username">root</property> <!-- 数据库密码配置 --> <property name="connection.password">mysql</property> <!-- pojo类的配置文件 --> <mapping resource="pojo/Userinfo.hbm.xml" /> <mapping resource="pojo/Blog.hbm.xml" /> </session-factory> </hibernate-configuration>
用到的工具就是mysql-connector(这是JDBC必须的)和dom4(用来解析xml文件)
DocumentReader
用来读取xml文件返回Document对象
- public class DocumentReader {
- /**
- *
- * @param url XML文件路径
- * @return Document对象
- * @throws DocumentException
- */
- public static Document read(String url) throws DocumentException{
- SAXReader reader=new SAXReader();
- Document document=reader.read(new File(url));
- return document;
- }
- }
public class DocumentReader {
/**
*
* @param url XML文件路径
* @return Document对象
* @throws DocumentException
*/
public static Document read(String url) throws DocumentException{
SAXReader reader=new SAXReader();
Document document=reader.read(new File(url));
return document;
}
}
Connect2Database
连接数据库
- public class Connect2Database {
- private static Connection connection;
- private static List<String> resources=new ArrayList(); //存放pojo类配置文件路径的队列
- public static Connection getConnection(){
- return connection;
- }
- static{
- try {
- Document cfgDoc=DocumentReader.read("main/src/hibernate.cfg.xml");
- Element root=cfgDoc.getRootElement();
- Element element=root.element("session-factory");
- String forname="";
- String user="";
- String url="";
- String psw="";
- for(Iterator i=element.elementIterator();i.hasNext();){
- element=(Element)i.next();
- Attribute attr=element.attribute(0);
- if(attr.getText().equals("connection.driver_class"))
- forname=element.getStringValue().trim();
- else if(attr.getText().equals("connection.url"))
- url=element.getStringValue().trim();
- else if(attr.getText().equals("connection.username"))
- user=element.getStringValue().trim();
- else if(attr.getText().equals("connection.password"))
- psw=element.getStringValue().trim();
- else if(attr.getName().equals("resource")){
- resources.add(attr.getValue());
- }
- }
- Class.forName(forname);
- connection=java.sql.DriverManager.getConnection(url, user, psw);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static List<String> getResources() {
- return resources;
- }
- }
public class Connect2Database {
private static Connection connection;
private static List<String> resources=new ArrayList(); //存放pojo类配置文件路径的队列
public static Connection getConnection(){
return connection;
}
static{
try {
Document cfgDoc=DocumentReader.read("main/src/hibernate.cfg.xml");
Element root=cfgDoc.getRootElement();
Element element=root.element("session-factory");
String forname="";
String user="";
String url="";
String psw="";
for(Iterator i=element.elementIterator();i.hasNext();){
element=(Element)i.next();
Attribute attr=element.attribute(0);
if(attr.getText().equals("connection.driver_class"))
forname=element.getStringValue().trim();
else if(attr.getText().equals("connection.url"))
url=element.getStringValue().trim();
else if(attr.getText().equals("connection.username"))
user=element.getStringValue().trim();
else if(attr.getText().equals("connection.password"))
psw=element.getStringValue().trim();
else if(attr.getName().equals("resource")){
resources.add(attr.getValue());
}
}
Class.forName(forname);
connection=java.sql.DriverManager.getConnection(url, user, psw);
} catch (Exception e) {
e.printStackTrace();
}
}
public static List<String> getResources() {
return resources;
}
}
这样JDBC的配置就完成了
其中关键是dom4j api的使用,遍历xml节点。