hibernate学习笔记(1)

其实hibernate完全是建立在JDBC的基础上的。

那为什么还要用hibernate呢

原因:使用JDBC查询有太多重复性的转换工作,连接数据库的信息放在程序代码中,一旦需要修改数据库的信息时,必须重新修改,重新编译。不利于程序的维护。

hibernate的优势

概括的说:hibernate是一个优秀的java持久化层解决方案。是当今主流的对象-关系映射工具。

1.松散耦合,hibernate既不会渗透到上层域模型中。也不会渗透到下层数据模型中软件开发人员可以独立设计域模型。不必强迫遵守任何规范

2.数据库设计人员可以独立设计数据库。不必强迫遵守任何规范

3.对象-关系映射不依赖于任何程序代码。如果需要修改对象-关系映射。只需修改xml文件。不需要修改任何程序。提高了软件的灵活性,复用性,并且使维护更加方便。

持久化和ORM:

狭义的理解: “持久化”仅仅指把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库相关的各种操作(持久化就是将有用的数据以某种技术保存起来,将来可以再次取出来应用,数据库技术,将内存数据一文件的形式保存在永久介质中(磁盘等)都是持久化的例子.)。

ORM:Object Relational Mapping 即对象关系映射。在编写程序时,以面向对象的方式处理数据,保存数据时,却以关系型数据库的方式存储,所以我们需要这个对象关系映射这个机制,将需要保存的对象与关系数据库表建立联系。简单的说:ORM就是利用描述对象和数据库之间的映射,自动的把java应用程序中的对象持久化到关系数据库中的表。

大概了解后:我们开始一个hibernate的基础小程序(CRUD)

首先导入jar包。前期工作不多说了。

首先创建主配置文件:hibernate.cfg.xml文件:这个文件是用于配置数据库连接的信息和hibernate运行时所需要的各种属性,该文件一定是放在src目录下的。而且命名一定是hibernate.cfg.xml。

	<!--数据库连接信息-->
    	<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
    	<property name="connection.username">root</property>
    	<property name="connection.password">root</property>
    	<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    	<!-- 数据库方言。就是高诉hibernate用哪种数据库,并提供不同的数据库方言  -->
    	<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
    	<!-- 显示sql语句。在控制台上显示 -->
    	<property name="show_sql">true</property>
    	<!-- 对数据类中的映射 -->
    	<mapping resource="com/test/bean/UserInfo.hbm.xml" />
然后在创建持久化映射文件:命名规范: 类名.hbm.xml文件。一般都是放在实体类的同级目录下的。

  <class name="UserInfo" table="userinfo" lazy="true">
    		<!-- name对应类中的属性。colmun:对应数据库表中的字段 -->
        <id name="userId" column="userId" type="java.lang.Integer">
        	<!-- 主键生成方式 -->
            <generator class="increment"></generator>
        </id>
		<property name="userName" column="userName" type="java.lang.String" />
		<property name="userPwd" column="userPwd" type="java.lang.String" />
		<property name="userAge" column="userAge" type="java.lang.Integer" />
		<property name="userBirthday" column="userBirthday" type="java.util.Date" />
    </class>
然后就是 POJO类了。
	public UserInfo() {
		super();
		// TODO Auto-generated constructor stub
	}
	private Integer userId;//用户id
	private String userName;//用户名
	private String userPwd;//密码
	private Integer userAge;//年龄
	private Date userBirthday;//出生日期
	
	public UserInfo(String userName, String userPwd, Integer userAge,
			Date userBirthday) {
		super();
		this.userName = userName;
		this.userPwd = userPwd;
		this.userAge = userAge;
		this.userBirthday = userBirthday;
	}
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserPwd() {
		return userPwd;
	}
	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}
	public Integer getUserAge() {
		return userAge;
	}
	public void setUserAge(Integer userAge) {
		this.userAge = userAge;
	}
	public Date getUserBirthday() {
		return userBirthday;
	}
	public void setUserBirthday(Date userBirthday) {
		this.userBirthday = userBirthday;
	}
在就是:获取 Session实例对象

public static SessionFactory sessionfactory;
	static{
		//创建会话工厂
		sessionfactory=new Configuration().configure().buildSessionFactory();
	}
	public static Session getSession(){//获取session对象
		Session session=sessionfactory.openSession();
		return session;
	}
	public static void closeSession(Session session){//关闭session对象
		if(session!=null){
			session.close();
		}
	}
最后就可以对用户实行CRUD了。

先做一个save();

		Session session=HibernateUtil.getSession();//获取session
		Transaction tx=session.beginTransaction();//开启事物
		try {
			Userinfo user=new Userinfo("zhangsan", "123", 18, new Date());
			session.save(user);//保存对象
			tx.commit();//提交事物
		} catch (HibernateException e) {
			if(tx!=null)
				tx.rollback();//事物回滚
			e.printStackTrace();
		}
		finally{
			HibernateUtil.closeSession(session);//关闭session
		}
一个简单的保存用户就OK了。实现了面向对象的编程。

例子太多就不多说了。简单介绍下hibernate的API吧。

保存:把域对象永久保存到数据库。 session.save(Object o)

更新:更新数据库中域对象的状态。 session.update(Object o)

删除:从数据库中删除一个域对象。 session.delete(Object o)

查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。

有两种方式查询:session.get(class,id)和session.load(class,id)

get和load的区别在于:

1、如果没有查询到该数据的时候,get()会返回null,load()会抛出异常。

2、get方法是直接到数据库里去查。load()会返回一个代理对象。并不是返回真实对象本身。如果你使用这个对象。它才会真正到数据库里面查这个对象。否则,该对象里面仅仅是保存着该对象的OID.而没有其他任何值。

hibernate中的实体对象的三种状态:

1.瞬时状态:在使用持久化操作前,没有数据库中的数据有任何的联系。

2.持久化状态:即实体对象在hibernate框架所管理的状态。与数据中的数据建立了联系。

3.游离状态:当session对象关闭时,但是对象和数据库中建立了联系,这时该对象并未受到session实例的管理。称之为游离状态。或者说是托管状态。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值