1.hibernate的作用,简化对数据库的编码,使开发人员不必再与复杂的sql语句打交道
做项目大部分都需要用JAVA来链接数据库,比如你要做一个会员注册的 页面,那么 获取到用户填写的 基本信后,你要把这些基本信息存入数据库对应的表中,不用hibernate还有mybatis之类的框架,都不用的话就得用JDBC,也就是JAVA自己的,用这个东西你要写很多的代码,比如保存注册信息 你就写inser的SQL语句,用了hibernate,你只需要把存储注册信息的那个类,用一句hibernate的代码就可以保存了,比如save(user).不用写任何SQL语句,它会自动帮你生成SQL并到数据库执行,这就是HIBERNATE的作用
例子: 对数据库执行插入操作
一般情况: insert into Student(name) values('zhangsan');
hibernate中:Student a=new Student();
a.setName("zhangsan");
HibernateInitialize,getSession().save(a);
2.Hibernate通过读取xml配置文件加载数据库的配置信息,该配置文件默认存放在classPath的根目录下面
xml配置文件示例代码如下:
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="dialect"><!--指定数据库使用的方言--> org.hibernate.dialect.MySQLDialect </property> <property name="connection.url"><!--连接数据库的URL地址--> jdbc:mysql://localhost:3306/db_database16 </property> <property name="connection.username">root</property><!--连接数据库的用户名--> <property name="connection.password">admin</property><!--连接数据库的密码--> <property name="connection.driver_class"><!--连接数据库用的驱动--> com.mysql.jdbc.Driver </property> <mapping resource="com/wgh/model/TbMessage.hbm.xml" /><!--持久化类映射文件--> </session-factory> </hibernate-configuration>
3. 持久化类:根据数据库中的表生成一个类,这个类的属性与表中的属性一一对应,这种方式叫映射
表的字段和类属性的映射,表的字段类型和类属性的数据类型的映射
每个属性都有setXXX()和getXXX()方法
4.如何实现映射? 通过xml文档来实现
示例代码如下:
class中name表示类名,table表示表名,catalog表示数据库的名字(一般不用写,因为配置文件中有)
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.wgh.model.TbMessage" table="tb_message" catalog="db_database16"> <id name="id" column="id" type="int"> <generator class="increment"/> </id> <property name="writer" type="java.lang.String"> <column name="writer" length="45" not-null="true"> <comment>留言人</comment> </column> </property> <property name="content" type="java.lang.String"> <column name="content" length="200" not-null="true"> <comment>留言内容</comment> </column> </property> <property name="sendTime" type="java.sql.Timestamp"> <column name="sendTime" length="19" not-null="false"> <comment>留言时间</comment> </column> </property> </class> </hibernate-mapping>
5.Session对象是Hibernate中数据库持久化的核心,它负责Hibernate的所有持久化操作,通过它,可以对数据库实现增删查改操作.但是session对象不是线程安全的,所以要创建一个线程安全的session对象,用到了ThreadLocal开发模式,示例代码如下:
package com.wgh; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.wgh.model.TbMessage; public class HibernateUtil { static SessionFactory sessionFactory; private Session session=null; private Transaction tx =null; //初始化Hibernate,创建SessionFactory实例,只在该类被加载到内存时执行一次 static{ try{ Configuration config = new Configuration().configure(); //config.addClass(TbMessage.class); sessionFactory = config.buildSessionFactory(); } catch (Exception e) { System.out.println("static块中:"+e.getMessage()); } } //开启session public void openSession() { session = sessionFactory.openSession(); tx = session.beginTransaction();//开启事务 } //获取留言信息列表 public List<TbMessage> listMessage(){ openSession();//开启session String hql="FROM TbMessage m ORDER BY m.sendTime DESC"; //降序查询全部留言信息 List<TbMessage> list=null; try{ Query query=session.createQuery(hql); list=(List<TbMessage>)query.list(); }catch(Exception e){ System.out.println("查询时的错误信息:"+e.getMessage()); }finally{ session.close(); } return list; } //获取指定留言信息 public TbMessage getMessage(int id){ openSession();//开启session TbMessage tbMessage=(TbMessage)session.get(TbMessage.class, id);//通过get方法查询指定ID的留言信息 session.close(); //关闭session return tbMessage; } //修改留言信息 public String updateMessage(TbMessage message){ try{ openSession();//开启session //在应用update()方法时,应该先调用get()方法加载数据,然后再调用update()方法更新数据 TbMessage m=(TbMessage)session.get(TbMessage.class,message.getId()); m.setWriter(message.getWriter()); m.setContent(message.getContent()); session.update(m);//应用update()方法修改留言信息到数据库 tx.commit(); //提交事务 closeSession();//关闭session return "留言信息修改成功!"; }catch(Exception e){ e.printStackTrace(); tx.rollback();//事务回滚 return "修改留言信息失败!"; } } //关闭session public void closeSession() { session.close(); } }