Hibernate(二)

Hibernate的映射的配置

【class标签的配置】:用来建立类与表的映射关系

属性:

catalog :数据库名

table :表名(类名与表名一致,table可以省略)

name :类的全路径

【id标签的配置】:用来建立类中的属性与表中的主键的对应关系

属性:

name :类中的属性名

column :表中的字段名(类中的属性名和表中的字段名如果一致,column可以省略)

length :长度

type :类型

property标签的配置】:用来建立类中的普通属性与表的字段的对应关系

属性:

name :类中的属性名

column :表中的字段名

length :长度

type :类型

not-null :设置非空

unique :设置唯一

Hibernate的核心的配置

Hibernate的核心配置方式(了解)

(一):属性文件的方式hibernate.properties

hibernate.connection.driver_class=com.mysql.jdbc.Driver

hibernate.show_sql=true

注:属性文件的方式不能引入映射文件(手动编写代码加载映射文件)

(二):XML文件的方式

hibernate.cfg.xml

核心的配置

1、必须的配置

1)连接数据库的基本的参数:驱动类、url路径、用户名、密码

2)方言

2、可选的配置显示

显示SQL :hibernate.show_sql

格式化SQL :hibernate.format_sql

自动建表 :hibernate.hbm2ddl.auto

        none :不使用hibernate的自动建表

        create :如果数据库中已经有表,删除原有表,重新创建,如果没有表,新建表。(测试)

        create-drop :如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表。(测试)

        validate :如果没有表,不会创建表。只会使用数据库中原有的表。(校验映射和表结构)。

        update :如果数据库中有表,使用原有表,如果没有表,创建新表(更新表结构)

hibernate.jdbc.fetch_size :实质是调用 Statement.setFetchSize() 方法设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数。hibernate.jdbc.batch_size:设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,类似于设置缓冲区大小的意思。batchSize 越大,批量操作时向数据库发送sql的次数越少,速度就越快。 测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!Oracle数据库 batchSize=30 的时候比较合适。

3、映射文件的引入:引入映射文件的位置

Hibernate的核心API

1、Configuration:Hibernate的配置对象

其作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactiontory对象。

//加载核心配置文件hibernate.properties:

Configuration cfg = new Configuration();

//加载映射文件:因为属性文件的方式不能引入映射文件,所以需要手动编写代码加载映射文件

configuration.addResource("com/itheima/hibernate/demo1/Customer.hbm.xml");// 手动加载映射
//hibernate.cfg.xml:

Configuration cfg = new Configuration().configure();

2、SessionFactory:Session工厂

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建session对象。这里用到了工厂模式,需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就可以了,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

SessionFactory内部维护了Hibernate的连接池和Hibernate的二级缓存。是线程安全的对象。一个项目创建一个对象即可。

3、Session:类似Connection对象是连接对象

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多的SQL语句)。但需要注意的是Session对象是非线程安全的,同时,Hibernate的session不同于JSP应用中的HttpSession。

Session代表的是Hibernate与数据库的链接对象。不是线程安全的。与数据库交互桥梁

Session中的API

        保存方法:Serializable save(Object obj);

        查询方法:T get(Class c,Serializable id);

                          T load(Class c,Serializable id);

get方法和load方法的区别?

get方法:

*采用的是立即加载,执行到这行代码的时候,就马上发送SQL语句去查询

*查询后返回的是真实对象本省

*查询一个找不到的对象的时候,返回null

load方法:

*采用的是延迟加载(lazy懒加载),执行到这行代码的时候,不会发送SQL语句,当真正使用这个对象的时候才会发送SQL语句

*查询后返回的是代理对象。javassist-3.18.1-GA.jar   利用javassist技术产生的代理

*查询一个找不到的对象的时候,返回ObjectNotFoundException

4、Transaction:事务对象

Hibernate中管理事务的对象。

        commit();        rollback();

/**
 * 保存或更新
 */
@Test
public void demo6() {
	Session session = HibernateUtils.getSession();		
	Transaction transaction = session.beginTransaction();
	
    //如果该对象在数据库表中不存在,执行的是insert语句
	/*Customer customer = new Customer();
	customer.setCust_name("王虎");
	session.saveOrUpdate(customer);*/
	
    //如果该对象在数据库表中,执行的是update语句
	Customer customer = new Customer();
	customer.setCust_id(5l);
	customer.setCust_name("zhaoliu");
	session.saveOrUpdate(customer);
		
	transaction.commit();
	session.close();
}
/**
 * 删除
 */
@Test
public void demo4() {
	Session session = HibernateUtils.getSession();		
	Transaction transaction = session.beginTransaction();
		
	//直接创建对象,删除
	/*Customer customer = new Customer();
	customer.setCust_id(4l);
	session.delete(customer);*/
	
	//先查询再删除(推荐)----级联删除
	Customer customer = session.get(Customer.class, 3l);
	session.delete(customer);
		
	transaction.commit();
	session.close();
}
/**
* 修改
*/
@Test
public void demo3() {
	Session session = HibernateUtils.getSession();		
	Transaction transaction = session.beginTransaction();
		
	//直接创建对象,进行修改(不推荐,会把已存在的对象覆盖)
	/*Customer customer = new Customer();
	customer.setCust_id(3l);
	customer.setCust_name("赵六");
	customer.setCust_level("vip");
	session.update(customer);*/
		
	//先查询,再修改(推荐)
	Customer customer = session.get(Customer.class, 3l);
	customer.setCust_phone("18205630125");
	session.update(customer);
		
	transaction.commit();
	session.close();
}

 

/**
 * 查询所有
 */
@Test
public void demo5() {
	Session session = HibernateUtils.getSession();		
	Transaction transaction = session.beginTransaction();
		
	//接收HQL:Hibernate Query Language面向对象的查询语言
	/*Query query = session.createQuery("from Customer");
	List<Customer> list = query.list();
	for (Customer customer : list) {
		System.out.println(customer);
	}*/
		
	//接收Sql语句
	SQLQuery query = session.createSQLQuery("select * from cst_customer");
	List<Object[]> list = query.list();
	for (Object[] objects : list) {
		System.out.println(Arrays.toString(objects));
	}
		
	transaction.commit();
	session.close();
}
/**
* 查询
*/
@Test
public void demo2() {
	Session session = HibernateUtils.getSession();		
	Transaction transaction = session.beginTransaction();
		
	//使用get方式查询(推荐)
	Customer customer = session.get(Customer.class, 1l);
	System.out.println(customer);
		
	//使用load方式查询
	/*Customer customer = session.load(Customer.class, 1l);
	System.out.println(customer);*/
		
	transaction.commit();
	session.close();
}

 Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值