第四篇:Hibernate开发步骤注意事项详解1

来源:互联网 发布:淘宝前端团队 编辑:程序博客网 时间:2024/06/04 23:15
一、HibernateUtil.java
public final class HibernateUtil {/* * 每个程序只做一次,因为很耗时。 * 一般写到一个工具类里,HibernateUtil一般不希望被继承(定义为final类), * 也不希望被实例化(将构造方法定义为私有的) * 而且我们希望初始化这段代码只做一次,放在static代码块中只执行一次。 *  * 如果不是hibernate.cfg.xml文件名或者此文件不是放在class path根目录下,则需在cfg.configure("XXX");中指定。 *  * Session:<span style="color:#ff0000;">引入org.hibernate包中的,不要导错包</span>。 */<span style="white-space:pre"></span>private static SessionFactory sessionFactory;<span style="white-space:pre"></span>private HibernateUtil(){}<span style="white-space:pre"></span><span style="white-space:pre"></span>static{<span style="white-space:pre"></span>Configuration cfg=new Configuration();<span style="white-space:pre"></span>cfg.configure();<span style="white-space:pre"></span>sessionFactory=cfg.buildSessionFactory();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>public static SessionFactory getSessionFactory() {<span style="white-space:pre"></span>return sessionFactory;<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public static Session getSession(){<span style="white-space:pre"></span>return sessionFactory.openSession();<span style="white-space:pre"></span>}}
二、hibernate.cfg.xml

<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://127.0.0.1:3306/test_hibernate</property><property name="connection.username">root</property><property name="connection.password">root</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 把运行时的sql语句打印出来。基本不需要,调试性能或看sql语句时才需要这个。--><property name="show_sql">true</property><!--想不想建表,如果想让hibernate帮你建表,则需配置 hbm2ddl.auto;否则不需要。hbm2ddl.auto可配置的参数:1)create-drop启动时把表删了再创建,最后在程序结束时(即虚拟机退出前)再把所有的表都删掉。2)create启动时把表删了再创建,但是在程序结束时不删表。3)update它会根据映射文件把数据库的表结构更新一遍;假设映射文件中多了一个字段,hibernate更新时会把这个字段加到数据库表中,并且把数据保存进去;如果映射文件少了一个字段,则会把数据库表中的字段删掉。4)validate把映射文件和数据库中的表校验一遍,如果不一致会报异常;程序就终止了。--><property name="hbm2ddl.auto">create</property><mapping resource="cn/itcast/domain/User.hbm.xml" /></session-factory></hibernate-configuration>
主要配置了property(连接数据库的属性)和mapping(指定对象模型和关系模型对应关系的文件的路径)。

三、Domain object三个限制条件:

1、实体类必须包含不带参数的构造方法。

2、实体类有无意义的标识符id(主键,最好有)

3、实体类是非final(final类不允许被继承)的,对懒加载有影响(最好非final)

四、User.hbm.xml

<hibernate-mapping package="cn.itcast.hibernate.domain"><!--table:用来指定跟类关联的表名,不写的话默认是与类名相同的表。id:用来映射主键,代表数据库中的一个主键。主键通过什么产生的,通过generator产生。property:name指的是实体类中的成员变量,column指的是跟成员变量相对应的数据库中的字段。不写的话默认为与成员变量名相同。复合主键:用<composite-id></composite-id>或者在id后面继续增加,即<id name="id"name="test">。--><class name="User" table="user"><id name="id"><generator class="increment" /></id><property name="birthday" /><property name="name" column="name"  unique="true"/></class></hibernate-mapping>

五、接口
public interface UserDao {public void saveUser(User user);public User findUserByName(int id);public User findUserByName(String name);public void updateUser(User user);public void remove(User user);}
六、接口实现类

public class UserDaoHibernateImpl implements UserDao {@Overridepublic User findUserByName(int id) {//因查询不涉及到更改数据库,所以不用开启事务。Session s=null;try{s=HibernateUtil.getSession();/* * 用load()不行:因为load()只有在第一次使用时才会去加载数据,但此方法中完全没有使用数据, * 所以它根本就不会访问数据库。当你把user返回给别人,别人再去访问数据库就会出错了, * 因为这是session关掉了,根本没法连接数据库了。 */User user=(User) s.get(User.class, id);return user;}finally{if(s!=null)s.close();}}@Overridepublic User findUserByName(String name) {Session s=null;try{s=HibernateUtil.getSession();Criteria c=s.createCriteria(User.class);c.add(Restrictions.eq("name", name));//如果不唯一,就报错。User user=(User) c.uniqueResult();return user;}finally{if(s!=null)s.close();}}public User findUserByName1(String name) {Session s=null;try{s=HibernateUtil.getSession();String hql="from User as user where user.name=:n";//from Object:即必须是对象而不是数据库表名Query q=s.createQuery(hql);q.setString("n", name);User user=(User) q.uniqueResult();return user;}finally{if(s!=null)s.close();}}@Overridepublic void remove(User user) {Session s=null;Transaction tx=null;try{s=HibernateUtil.getSession();tx=s.beginTransaction();s.delete(user);tx.commit();}finally{if(s!=null)s.close();}}@Overridepublic void saveUser(User user) {Session s=null;Transaction tx=null;try{s=HibernateUtil.getSession();tx=s.beginTransaction();s.save(user);tx.commit();}finally{if(s!=null)s.close();}}@Overridepublic void updateUser(User user) {Session s=null;Transaction tx=null;try{s=HibernateUtil.getSession();tx=s.beginTransaction();s.update(user);tx.commit();}finally{if(s!=null)s.close();}}}

最后一步了,测试结果:

public static void main(String[] args) {User user=new User();user.setBirthday(new Date());user.setName("name");addUser(user);System.out.println("id:"+user.getId());User u=getUser(user.getId());System.out.println("name:"+u.getName());}



0 0
原创粉丝点击