对hibernate的学习
1。
hibernate的学习,前一阵子做过一个hibernate的小例子,后来由于公司项目需要,去做其他事去了,没有把hibernate再进行研究,现在有些空继续把这知识研究一下。目的是想看一下如果把数据库对象化。
找了几个小的例子,一步一不操作。开始我就下载了一个hibernate的包(在www.hibernate.org网站上有)解开包后仔细查找了一下,发现国外人写的东西就是规范,里面有一个英文的hibernate_reference.pdf,里面是很详细的hibernate如何使用。
其中要做几件基本操作:
1。hibernate.cfg.xml
"-//Hibernate/Hibernate Configuration DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
root
jdbc:mysql://localhost:3306/test
net.sf.hibernate.dialect.MySQLDialect
com.mysql.jdbc.Driver
2。在数据库中建立好一个表(就是用来和类对应的表)
比如建立:
CREATE TABLE `person` (
`id` bigint(5) NOT NULL auto_increment,
`name` varchar(20) default NULL,
`address` varchar(20) default NULL,
`school_id` bigint(5) NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=InnoDB AUTO_INCREMENT=13 ;
3。建立类和***.hbm.xml文件
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/test
root
org.hibernate.dialect.MySQLDialect
4。书写测试代码检验(项目中利用)
public class Test {
public static void main(String[] args) throws HibernateException {
String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
Configuration cfg = new Configuration().configure(CONFIG_FILE_LOCATION);
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Person person = new Person();
person.setId(Long.valueOf("1"));
person.setName("lichengdongdong");
person.setAddress("zhongguo");
person.setSchoolId(Long.valueOf("1"));
session.save(person);
tx.commit();
session.close();
System.out.println("d");
}
5.其实还可以做一个通用的util对session进行生成和关闭:
package util;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
public static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure()
.buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException {
Session s = (Session) session.get();
// Open a new Session, if this thread has none yet
if (s == null) {
s = sessionFactory.openSession();
// Store it in the ThreadLocal variable
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
if (s != null)
s.close();
session.set(null);
}
}
和传统数据库查询的转化问题
对于数据库的操作,在传统的关系数据库的设计和使用上分析,主要分为,
a.“查询--列表”,select 或者 多表联系,和where语句的搭配
b.“插入”,insert
c.“修改”,update 和 where 语句的搭配
d.“删除”,delete 和 where 语句的搭配
e.“表与表之间的关系,1对多,1对1,多对多”
f.“事务处理”,如何让多个数据一起执行
a.“查询--列表”,select 或者 多表联系,和where语句的搭配
传统的查询一条记录,“select * from *** 后面是where 语句”
单表查询:sql语句: select table where field='';
hibernate:开始已经建立了表的持久化连接。
方法有1:hibernate提供的接口:
1。根据ID查询
要用到Session接口的load方法。
load(Class theClass, Serializable id)
load(Class theClass, Serializable id, LockMode lockMode)
load(Object object, Serializable id)
2。HQL语句进行查询
2。1 利用Query接口,Query由Session里的createQuery()来产生一个查询
1)不带参数的查询(这类比较简单)
Query query=session.createQuery("select user from User as user");
select user.name from User as user
中 form后面的User是那个类名,大小写区分 ,后面的as user 是要把他定义到那个变量中去,前面的user.name恰好是后面的user变量
还有,如果select的是 user.name ,那查询出来的对象的的格式就和user.name这个name的本来属性一样,如select user 那么查询出来结果就的User,select user.name 就是String
如果 select pp.address,pp.name 那么查询出来的就是一个Object[] ,用Object[0]这样进行读取
2)带参数的查询 ()
Query query=session.createQuery("select user from User as user where user.name=?");
query.setString(0,name)//假设name为传过来的参数
Query query=session.createQuery("select user from User as user where user.name=:name");
query.setString("name",name)//假设name为传过来的参数
(多个参数以此类推)
在hql中,参数的设置可以有 =?或 =:name
利用Session接口的find查询
find(String query)
find(String query, Object[] values, Type[] types)
find(String query, Object value, Type type) 均返回list
如:
List list=session.find("select user from Users as user where user.name=?",name,Hibernate.STRING)
List list=session.find("select user from Users as user where user.name=? and user.pw=?",new Object[]{name,pw},new Type[]{Hibernate.STRING,Hibernate.STRING})
{推荐使用Query的方法进行查询}
我们先来比较一下传统的查询处理:
相关工具
1。可以用myeclipse来处理数据库连接部分。
在配置数据库属性的时候, mysql部分写法:
URL: [jdbc:mysql://localhost:3306]
driverClass:com.mysql.jdbc.Driver
对hibernate的本人的怀疑。
1。hibernate机制利MAPPING等技术把数据库对象化了,在性能上时候降低了,对于大型项目比如大型电子商务网站是否可以利用。
在网上查看了一下,hibernate的评论都不错的,主要还是在数据库的设计上下工夫,毕竟hibernate只是一个mapping工具,有网友说经过数据库和hibernate的配置优化:“我也用 Struts+Hibernate 做大型项目,在并发很高时,每天4500人次访问量的情况下,性能也相当不错. ” 说明hibernate是不错的。相关文章见:《Hibernate的性能之大家谈》 http://www.javaresearch.org/article/showarticle.jsp?column=108&thread=20127
问题
1。在hibernate的操作的时候老是出现log4j的错误。
其实不是错误,是警告而已,对程序的执行是没有影响的。主要是打印出程序执行过程的信息,只要在你程序类的 外放上log4j.properties 这个文件就可以了(需要事先引入 log4j.jar文件到项目)
没有评论:
发表评论