第四篇:Hibernate开发步骤注意事项详解1
2014-11-07 21:25
513 查看
一、HibernateUtil.java
二、hibernate.cfg.xml
三、Domain object三个限制条件:
1、实体类必须包含不带参数的构造方法。
2、实体类有无意义的标识符id(主键,最好有)
3、实体类是非final(final类不允许被继承)的,对懒加载有影响(最好非final)
四、User.hbm.xml
五、接口
六、接口实现类
最后一步了,测试结果:
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 { @Override public 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(); } } @Override public 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(); } } @Override public 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(); } } @Override public 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(); } } @Override public 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()); }
相关文章推荐
- 第五篇:Hibernate开发步骤注意事项详解2
- 团队网站开发流程与各步骤注意事项
- 利用 Intellij IDEA 10 开发多工程Grails应用的关键步骤及注意事项(随笔)
- ThinkPHP的SAE开发相关注意事项详解
- coordinatorLayout使用详解及注意事项,看完这篇完全可以开发5.0的高级特效了
- SpringBoot开发详解(三)--SpringBoot配置文件YML注意事项
- 微软CRM系统二次开发步骤以及注意事项
- 整合struts2+hibernate详细配置步骤及注意事项
- coordinatorLayout使用详解及注意事项,看完这篇完全可以开发5.0的高级特效了
- 基于开发中使用UEditor编辑器的注意事项详解
- 转:微软CRM系统二次开发步骤以及注意事项
- 关于AsyncTask参数及运行步骤详解and注意事项
- 手工搭建hibernate4.2.2框架步骤及注意事项
- Android开发应用框架的搭建步骤及注意事项
- 微软CRM系统二次开发步骤以及注意事项
- Openssh升级步骤及注意事项详解
- DWR实例教程开发步骤及注意事项
- 64bit libcurl.lib生成步骤及注意事项详解
- OpenSSH升级步骤及注意事项详解