您的位置:首页 > 其它

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

2014-11-07 21:25 513 查看
一、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 {

@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());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: