hibernate对数据库的操作
以前听起hibernate总感觉是一个很奇怪的东西,不知道是用做什么,只知道是一个框架,今天对hibernate的学习,使我受益匪浅,知道了hibernate的作用。
以前在写程序的时候看,特别是在编写连接数据库程序的时候,总要用到jdbc,提前都感觉到jdbc是一个很好的手工方式,并没有想到更好的实现方法,也不知道jdbc的缺点是什么,因为在做大型项目的时候,必定会要写很多的程序,当然操作数据库的更不可缺,所以每次的有很多都是重复的,而且在对象模型和关系模型之间总会遇到很多的问题,也往往会转来转去的,当用了hibernate后,可以很方便的操作数据,不用写那么麻烦的代码,节省了很多的操作和代码的编写,这样大大提高了代码编写的效率,提高了开发的速度!现在将走向hibernate的世界:
一:首先要使用hibernate框架,必定要引入hibernate2.jar包,当然还要引入很多的包,然后写一个与数据表对应的JavaBean类,与数据库的字段对应,比如一个简单的java类如下:
packagetmc.hibernat.domian;
importjava.util.Date;
publicclassUser{
privateintid;
privateStringname;
privateDatedate;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicDategetDate(){
returndate;
}
publicvoidsetDate(Datedate){
this.date=date;
}
}
然后编写一个映射的文件,
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="tmc.hibernat.domian">
<classname="User">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"unique="true"/>
<propertyname="date"/>
</class>
</hibernate-mapping>
在写一个加载数据库和连接数据库的的配置文件:
<!DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>
<propertyname="connection.url">jdbc:mysql:///test</property>
<propertyname="connection.username">root</property>
<propertyname="connection.password">root</property>
<propertyname="dialect">org.hibernate.dialect.MySQLDialect</property>
<propertyname="hbm2ddl.auto">update</property>
<propertyname="show_sql">true</property>
<mappingresource="tmc/hibernat/domian/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在此,一切的准备都已经完成,接下来执行写一些service的java类对数据库进行操作,就可以实现对数据库的操做了
写一个service的java类:
packagetmc.hibernate.service;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.Configuration;
publicfinalclassHibernateUitl{
privatestaticSessionFactorysessionFactory;
privateHibernateUitl(){
}
/**
*初始化代码
*/
static{
//配置的一个实例说明属性允许应用程序在测绘文件被用来当创造一个SessionFactory
Configurationcfg=newConfiguration();
cfg.configure();//读取配置文件
sessionFactory=cfg.buildSessionFactory();//找出配置文件的所有信息
}
/**
*获取SessionFactory的方法
*@return
*/
publicstaticSessionFactorygetSessionFactory(){
returnsessionFactory;
}
/**
*获取session的方法
*@return
*/
publicstaticSessiongetSession(){
returnsessionFactory.openSession();
}
}
然后写对数据库的各种操作:
1.写一个接口:
packagetmc.hibernat.domian;
publicinterfaceUserDao{
publicvoidsaveUser(Useruser);
publicUserfindUserById(intid);
publicUserfindUserByName(Stringname);
publicvoidupdateUser(Useruser);
publicvoidremove(Useruser);
}
2.实现接口:
packagetmc.hibernate.service;
importorg.hibernate.Criteria;
importorg.hibernate.Query;
importorg.hibernate.Session;
importorg.hibernate.Transaction;
importorg.hibernate.criterion.Restrictions;
importtmc.hibernat.domian.User;
importtmc.hibernat.domian.UserDao;
publicclassUserHibernateImpimplementsUserDao{
/**
*根据id获取查询数据库的内容
*/
@Override
publicUserfindUserById(intid){
Sessions=null;
try{
s=HibernateUitl.getSession();
//Criteriac=s.createCriteria(User.class);
//c.add(Restrictions.eq("name",name));
Useruser=(User)s.get(User.class,id);//User.class方便找到映射文件
returnuser;
}finally{
if(s!=null){
s.close();
}
}
}
/**
*根据用户名,查询用户的信息
*/
@Override
publicUserfindUserByName(Stringname){
Sessions=null;
try{
s=HibernateUitl.getSession();
Criteriac=s.createCriteria(User.class);
c.add(Restrictions.eq("name",name));
Useruser=(User)c.uniqueResult();//映射是唯一的
returnuser;
}finally{
if(s!=null){
s.close();
}
}
}
/**
*和上面的使用是一样的,只是用不同的查询方式而已
*@paramname
*@return
*/
publicUserfindUserByName1(Stringname){
Sessions=null;
try{
s=HibernateUitl.getSession();
//Criteriac=s.createCriteria(User.class);
//c.add(Restrictions.eq("name",name));
Stringhql="fromUserasuserwhereuser.name=:n";
Queryq=s.createQuery(hql);
q.setString("n",name);
Useruser=(User)q.uniqueResult();//映射是唯一的
returnuser;
}finally{
if(s!=null){
s.close();
}
}
}
/**
*移除数据库一条记录
*@seetmc.hibernat.domian.UserDao#remove(tmc.hibernat.domian.User)
*/
@Override
publicvoidremove(Useruser){
Sessions=null;
//创建一个事务
Transactiontx=null;
try{
s=HibernateUitl.getSession();
tx=s.beginTransaction();
s.delete(user);
tx.commit();
}finally{
if(s!=null){
s.close();
}
}
}
/**
*向数据库添加数据
*/
@Override
publicvoidsaveUser(Useruser){
Sessions=null;
//创建一个事务
Transactiontx=null;
try{
s=HibernateUitl.getSession();
tx=s.beginTransaction();
s.save(user);
tx.commit();
}finally{
if(s!=null){
s.close();
}
}
}
/**
*修改数据库数据
*/
@Override
publicvoidupdateUser(Useruser){
Sessions=null;
//创建一个事务
Transactiontx=null;
try{
s=HibernateUitl.getSession();
tx=s.beginTransaction();
s.update(user);
tx.commit();
}finally{
if(s!=null){
s.close();
}
}
}
}
3.测试上面的类:
packagetmc.hibernate.service;
importjava.util.Date;
importtmc.hibernat.domian.User;
importtmc.hibernat.domian.UserDao;
publicclassTestDao{
publicstaticvoidmain(String[]args){
UserDaodao=newUserHibernateImp();
Useruser=newUser();
user.setName("name");
user.setDate(newDate());
System.out.println("1111");
dao.saveUser(user);
user.setName("newname");
System.out.println("222");
dao.updateUser(user);
Useru=dao.findUserByName(user.getName());
System.out.println("3333");
}
}
这样的话,就可以完成了对数据库的各种操作,这样写真的很方便,很灵活,减少了很多的重复代码,但就是配置文件的时候很麻烦,呵呵,反正很多都这样的,没有十全十美的东西,但只要好用,就足够了!