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

一、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());
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值