hibernate学习笔记(一)

1.如何新建一个hibernate项目?
①先在官网下载hibernate包,解压。我的是hibernate-3.2.0.ga.rar

②新建一个java project,而不是以往的web project.并在项目根目录建一个lib包,导入需要的jar和mysql或oracle驱动包。这些jar可在hibernate中找。如下

全选jar包,右键,build path,将jar引入项目中。这一步不能忘。
④将hibernate中etc目录下的hibernate.cfg.xml拷贝到项目的src下,并修改。可结合etc/hibernate.prpperties.修改后可为:

<!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="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!--注意该行的value为com.mysql.jdbc.Driver,不是其它的-->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testhibernate</property><!--testhibernate为数据库名-->
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<mapping resource="com/bjsxt/po/User.hbm.xml"/><!--有一个表就写一个映射-->
		
	</session-factory>
</hibernate-configuration>
注意,复制后要把<session-factory name="foo">的name属性去掉,否则会报错。因为多了name属性hibernate会尝试将sessionfactory注册到jndi上。

⑤新建一个po类(plain object),即实体类。User,并写全get/set方法
⑥增加映射文件User.hbm.xml,这可以参考eg/User.hbm.xml。映射文件和实体类需写到同一个包中。映射文件hbm.xml说明了po实体类和数据库表的对应关系,以及po中属性和数据库表字段的对应关系。可以如下:

<?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.bjsxt.po.User" table="t_user"><!--数据库中一定要存在这个表t_user-->
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name"></property>
		<property name="tel" column="tel"></property>
		
	</class>
</hibernate-mapping>
⑦然后修改hibernate.cfg.xml,让hibernate知道对应关系 。<mapping resource="com/bjsxt/po/User.hbm.xml"/>,上边已写好。

⑧新建测试类Test,如下:

public class Test {
	public static void main(String[] args) {
		Configuration conf = new Configuration();//Configuration管理数据库的配置信息
		conf.configure();
		
		SessionFactory factory = conf.buildSessionFactory();
		Session session = factory.openSession();//产生一个seession对象
		
		//在hiberbate中,autoCommit=false
		User user = new User();
		user.setName("Hah");
		user.setTel("232323");
		
		session.beginTransaction();//开始一个事务
		session.save(user);
		session.getTransaction().commit();//提交事务
		session.close();//关闭session,也就关闭了事务
			
	}
}
结果就是往数据库表t_user添加一行数据name="Hah",tel="232323"。可以看出就不用写sql语句,就能往数据库添加数据。

2.在搭建hibernate环境时,hibernate.cfg.xml中的

<property name="hibernate.hbm2ddl.auto">     </property>
有四个属性。如下:(1)create-drop(2)create(3)update(4)validate
<property name="hibernate.hbm2ddl.auto">creat-drop</property>
//表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用

<property name="hibernate.hbm2ddl.auto">creat</property>
//表示hibernate在初始化时新建表格,程序结束后不删除。再一次运行时若有旧表格,就删除重建。

<property name="hibernate.hbm2ddl.auto">update</property>
//表示hibernate初始化时,根据映射表和数据库中作对比,若不一致就更新表的结构

<property name="hibernate.hbm2ddl.auto">validate</property>
//表示在hibernate初始化时只做表的校验,若不一致就报错。
3.在hibernate中,根据id操作的都需要用到这一步。

session.get(User.class,id);

User user = session.get(User.class,2);//就是取出id为2的user对象

public  User findById(int id){
	User user = (User) session.get(User.class,id);//User.class可以获取User类中所有方法和属性
}

public void delById(int id){
	session.delete(session.get(User.class,id));
}
4.struts2的action中是name,class;而struts则是path,type;
execute是struts2中默认会执行的方法,exexute的作用相当于servlet中的doGet和doPost方法

5..hibernate中一个实体类就对应一张数据表,这在实体类的映射表中可以体现。如上边第一条中的

<class name="com.bjsxt.po.User" table="t_user">
就成对应关系。
一个hibernate.cfg.xml中只能写一个<session-factory>,一个<session-factory>只对应一个数据库(而不是一张数据库表)。 若想关联多个数据库,就必须写多个SessionFactory

6.在hibernate的增删改查操作中,因为findById,findAll只为读操作,没有涉及到事务,所以在这两个方法中,可以不用写事务。其他的增、改、删需要加事务。
7.在findAll()方法中,相应的sql语句比较特殊。为

hql="from User";//没有select
这表示返回的是对象,若加了select name等,则返回的是属性,与本意不符。代码如下:

public  List<User> findAll(){ //返回所有结果,是一个集合,所以用List
		Session session = HiberUtil.getSession();
		
		//sql为结构化查询语言,hql为面向对象的查询语句
		String hql = "from User";
		Query query = session.createQuery(hql);//查询对象
		
		List<User> list = query.list();
		session.close();//这一步不能丢
		return list;
}
这和findById()比较相似,不过前者返回集合,后者返回一个对象则为

public  User findById(int id){ //根据id查找,返回一个结果,因此为User型
		Session session = HiberUtil.getSession();
		User user = (User) session.get(User.class,id);//User.class能获取User对象的所有属性和方法
		return user;
}
8.hibernate对象的状态和生命周期,有3个
①transient临时态,指new出来的对象,跟session没有任何关系,也跟数据库没有任何关系,数据库中没有对应记录存在

②persist持久态,指以map形式保存在session缓存中的对象。数据库中有对应的记录(即只要和session挂钩后就会在数据库发生联系)。保存方式为key-value(键值对)形式。如key的格式为
com.bjsxt.po.User#2
就是完整的类名 + # + id

③detached游离态,指除上述两种状态以外的。与session无关,但在数据库有相应记录。
举一个比较形象的例子就是临时态为单身,持久态为结婚,游离态为离婚。结婚的对象就是session,而生活经历就是数据库记录。

9.Mysql数据库中的int型比较特别,默认长度为11,而当你把长度设为1,这时输入22222,也能正常存入数据库。
10.在映射文件User.hbm.xml中,有类似于以下的

<id name="id">
	<generator class="native"></generator>
</id>

其中<generator class="native"></generator>表示设置id为主键。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值