hibernate_day01

hibernate介绍:
1.1 什么是hibernate?
	hibernate是一个ORM思想的持久层框架
1.2 什么是ORM
	Object Relational Mapping,对象关系映射;将实体类中的属性名称跟数据库表中的字段名对应起来,从而达到操作实体类就能操作数据库表的效果
1.3 org.hibernate.Session的API 
增
save(Object o);
删
delete(Object o);	//推荐先查再删
改
update(Object o);	//推荐先查再改
查
get(Class<Object> clazz,Object id);		//立即加载
load(Class<Object> clazz,Object id);	//延迟加载
    
1.4 get和load方法的区别:
get方法:
    立即加载,查询的时候立刻发送SQL;查询的结果返回的是真实的实体类对象;如果不存在这个对象就返回null
load方法:
    延迟加载,只有当使用到非主键的实体类属性时才会发送SQL;查询结果返回的是基于子类的动态代理对象,如果使用final关键字来修饰实体类,将不会获得延迟加载的效果;如果不存在这个对象就报Object Not Found Exception
    
1.5在maven项目中,编译器默认不会对src/main/java下的xml文件进行编译,因此会导致hibernate.cfg.xml加载实体类映射配置文件失效;
 <!-- 填补maven打包的坑,使maven编译时包含hibernate的sql映射xml文件 -->
    <build>
        <resources>	
            <!--指定编译src/main/java下的xml文件-->
             <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
      <!--手动指定编译目录会导致redources下的资源编译失效,因此得再手动指定resources下的资源-->
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    </build>   
入门测试详解
1.Configuration:加载核心配置文件
 1.1加载hibernate.properties	//使用properties配置文件的方式,不能加载实体类映射配置文件,需要手动加载
 Configuration configuration = new Configuration();
 configuration.addResource("com/baidu/hibernate/domain/Customer.hbm.xml");
 1.2加载hibernate.cfg.xml
 Configuration configuration = new Configuration().configure();

2.SessionFactory:负责管理Session,管理连接池,管理Hibernate二级缓存。采用了工厂模式,不是一个轻量级的对象。通常情况下一个项目只对应一个SessionFactory就够了。是线程安全的对象。

3.Session:相当于Connection,Session是Hibernate程序与数据库之间的桥梁。完成CRUD的操作。Session是一个单线程的对象,内部维护了Hibernate的一级缓存。

4.Transaction:事务对象
Hibernate3的时候事务自动提交的参数是false(不自动提交)。Hibernate5可以自动提交,但是默认每个操作都是在一个事务中。一般需要手动开启事务。
Hibernate入门测试
1.添加依赖
下载开发包https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/
2.创建实体类
3.在类路径下创建hibernate核心配置文件,通常叫做hibernate.cfg.xml
4.配置实体类的映射配置文件,通常命名规则:实体类名.hbm.xml
注意:mybatis中的映射配置文件是dao层接口的映射配置文件,而hibernate是实体类的映射配置文件
5.Junit单元测试

@Test
public void testSave(){
	//读取核心配置文件hibernate.cfg.xml
	Configuration configuration = new Configuration().configure();
	//创建SessionFactory对象
	SessionFactory factory = configuration.buildSessionFactory();
	//创建一次连接对象Session
	Session session = factory.openSession();
	//开启事务
	Transaction transaction = session.beginTransaction();
	transaction.begin();
	//测试保存Customer
	customer customer = new Customer();
	customer.setName("张三");
	session.save(customer);
	//提交事务,释放资源
	transaction.commit();
	session.close();
}
简单CRUD
public class HibernateTest {

    private Session session;
    private Transaction transaction;

    @Before
    public void init() {
        session = HibernateUtil.openSession();
        transaction = session.beginTransaction();
    }

    @After
    public void destroy() {
        if (session != null)
            session.close();
    }

    @Test
    public void testSave() {
        transaction.begin();
        Customer customer = new Customer();
        customer.setCust_name("张三");
        session.save(customer);
        transaction.commit();
    }

    @Test
    public void testDelete() {
        transaction.begin();
        //1.直接根据new出来的对象删除
        //Customer customer = new Customer();
        //customer.setCust_id(1L);
        //session.delete(customer);
        //2.先查询再删除(推荐使用,方便级联删除)
        Customer customer = session.get(Customer.class, 1L);
        session.delete(customer);
        transaction.commit();
    }

    @Test
    public void testUpdate(){
        transaction.begin();
        //1.直接new对象修改(会导致其他未设置的属性被修改为Null)
        //Customer customer = new Customer();
        //customer.setCust_id(2L);
        //customer.setCust_name("李四");
        //session.update(customer);
        //2.先查询再修改(推荐使用)
        Customer customer = session.get(Customer.class, 1L);
        customer.setCust_name("李四");
        session.update(customer);
        transaction.commit();
    }
    
    @Test
    public void testFind(){
        Customer customer = session.get(Customer.class,1L);
    }
}
核心配置文件hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- 连接数据库的信息 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		
		<!-- 数据库的方言:根据底层的数据库生成不同的SQL -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 配置显示SQL -->
		<property name="hibernate.show_sql">true</property>
		<!-- 配置格式化SQL -->
		<property name="hibernate.format_sql">true</property>
		<!-- 配置hbm2ddl,
				* none :不使用映射转成DDL。
				* create :如果原来有表将原有的表删除。每次都会新创建一个表。测试的时候使用。
				* create-drop :如果原来有表将原有的表删除。每次都会新创建一个表。执行完操作以后会将表删除掉。测试的时候使用。
				* update :如果数据库中有表使用原来的表。如果没有表会创建一个表。而且可以更新原有表结构。
				* validate :不会创建表。校验映射和表结构是否正确-->
		<property name="hibernate.hbm2ddl.auto">validate</property>
		
		<!-- 配置C3P0连接池 -->
		<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<!--在连接池中可用的数据库连接的最少数目 -->
		<property name="c3p0.min_size">5</property>
		<!--在连接池中所有数据库连接的最大数目  -->
		<property name="c3p0.max_size">20</property>
		<!--设定数据库连接的过期时间,以秒为单位,
		如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
		<property name="c3p0.timeout">120</property>
		 <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
		<property name="c3p0.idle_test_period">3000</property>
		
		<!-- 加载映射文件 -->
		<mapping resource="com/baidu/hibernate/domain/Customer.hbm.xml"/>
	</session-factory>
</hibernate-configuration>
实体类映射配置文件Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- ORM:Object Relational Mapping,将实体类O和数据库的表R 建立映射关系 -->
	<!-- 
		class标签:用来描述类与表的映射关系。
			* name		:类的全路径的。(Object)
			* table		:数据库中的表名称。(Relational)
				* 如果类名和表名称一致的话,那么table可以省略。
			* catalog	:数据库名称
	 -->
	<class name="com.baidu.hibernate.domain.Customer" table="cst_customer">
		<!-- 类中的属性与表中的主键对应 -->
		<!-- 
			id标签:用来描述类中的OID与表中的主键建立映射。
				* name		:类中的属性名称。
				* column	:表中的字段名称。
					* 如果类中的属性名称和表中的字段名称一致,column可以省略。
				* length	:字段的长度。(Hibernate自动建表的时候)
				* type		:数据类型。
					* Java的数据类型
					* Hibernate的数据类型
					* SQL的数据类型
		-->
		<id name="cust_id" column="cust_id">
			<!-- 主键生成策略: -->
			<generator class="native"/>
		</id>
		<!-- 类中的属性与表中的字段对应 -->
		<!-- 
			property标签:用来描述类中的属性与表中的字段建立映射 
				* name		:类中的属性名称。
				* column	:表中的字段名称。
					* 如果类中的属性名称和表中的字段名称一致,column可以省略。
				* length	:字段的长度。(Hibernate自动建表的时候)
				* type		:数据类型。
					* Java的数据类型
					* Hibernate的数据类型
					* SQL的数据类型
		-->
		<property name="cust_name" column="cust_name" length="32" type="string"/>
		<property name="cust_source" column="cust_source"/>
		<property name="cust_industry" column="cust_industry"/>
		<property name="cust_level" column="cust_level"/>
		<property name="cust_phone" column="cust_phone"/>
		<property name="cust_mobile" column="cust_mobile"/>
	</class>
</hibernate-mapping>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值