Hibernate的CRUD的操作

本文详细介绍Hibernate框架下数据库连接配置及基本CRUD操作方法,包括使用HQL与SQL进行查询、更新等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置数据库连接:
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>
<!-- 连接数据库的url -->
<property name="hibernate.connection.url">
jdbc:mysql:///hibernate_test?useUnicode=true&amp;characterEncoding=UTF-8
</property>
<!-- 用户名 和密码-->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>

<!-- Hibernate的方言,生成的低层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>
<!-- hbm:映射 to DDL: create drop alter -->
<property name="hibernate.hbm2dll.auto">update</property>

<!-- 通知Hibernate加载那些映射文件 -->
<mapping resource="com/demo/test/model/Customer.hbm.xml"/>

<!-- C3P0连接池设定   需要导入c3p0的jar包-->
<!-- 使用c3po连接池  配置连接池提供的供应商-->
<property name="connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>

<!-- 连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!-- 最多数目 -->
<property name="c3p0.max_size">20</property>
<!-- 设定连接过期时间,以秒为单位 -->
<property name="c3p0_timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>


</session-factory>
</hibernate-configuration>

HibernateUtil:
  public class HibernateUtils {
private static Configuration configuration;
private static SessionFactory sessionFactory; 
static {
configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
}
//返回的session是下面用到的session
private static Session openSession() {
return sessionFactory.openSession();
}
}
保存记录:
* session.save(customer);
  例子:
//不用设置id,因为配置了主键的生成策略
Customer customer = new Customer();
customer.setName("啊白");
customer.setAge(3);
session.save(customer);

根据主键进行查询:
* Customer customer = (Customer)session.get(Customer.class ,1);
* Customer customer = (Customer)session.load(Customer.class,1);
 
***** get 和 load 的区别 :( 面试题 )
* 1.发送 SQL 的时机 :
* load这个方法采用了一个技术 .lazy 延迟加载 ( 懒加载 ). 真正使用这个对象的数据的时候 .( 对象的数据不包括主键 ).
* get这个方法是立即检索 . 当执行 session.get() 方法的时候 , 马上发送 SQL 语句查询 .
 
* 2.返回的对象 :
* load方法返回的是代理对象 .
* get方法返回的是真实的对象 .
 
* 3.查询一个不存在的数据 :
* load方法抛异常 :ObjectNotFoundException.
* get方法抛异常 :NullPointException.
例子:
load:
//不发送SQL进行查询
Customer customer = (Customer) session.load(Customer.class,1);
//延迟5秒后,发送SQL进行查询,然后输出客户信息
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//5秒后执行输出语句,就会发送sql
System.out.println(customer);

get:
//发送SQL进行查询
  Customer customer = (Customer) session.get(Customer.class,1);
//延迟5秒,然后输出客户信息
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//5秒后执行输出语句
System.out.println(customer);

修改记录
* session.update(customer);
修改有两种方式 :
// 5.1手动创建对象的方式
Customer customer = new Customer();
//id为2,Id必须在数据库里面有记录,才能根据id查找出记录然后进行修改
customer.setId(2);
customer.setName("老师");
session.update(customer);
//没有设置年龄,如果老师的年辆本来为43,将变为默认值0
***** 这种方式如果没有设置的属性,将这个属性的默认值存入了.(不好.)
 
// 5.2先查询在修改的方式(推荐方式 )
Customer customer = (Customer) session.get(Customer.class, 1);
customer.setName("凤姐");
session.update(customer);
  //这样子就算重新set年龄值,年龄也不会变。

删除记录:
* session.delete(customer);
删除记录有两种方式:
// 5.1手动创建对象的方式
Customer customer = new Customer();
customer.setId(2);
session.delete(customer);
 
// 5.2先查询在删除的方式
Customer customer = (Customer)session.get(Customer.class, 1);
session.delete(customer);
 
查询所有:
HQL:
HQL:Hibernate Query Language.
面向对象的写法:
Query query = session.createQuery("from Customer where name = ?");
query.setParameter(0, "苍老师");
Query.list();

Query query = session.createQuery("from Customer");
List<Customer> list = query.list();
for(Customer customer : list) {
System.out.println(customer);
}

QBC:
Query By Criteria.(条件查询)
 
Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.eq("name", "凤姐"));
List<Customer> list = criteria.list();

Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
for(Customer customer : list) {
System.out.println(customer);
}
SQL:
SQLQuery query = session.createSQLQuery("select * from customer");
List<Object[]> list = query.list();
 
SQLQuery query = session.createSQLQuery("select * from customer");
query. addEntity(Customer.class); //得到就不是List<Object>
List<Customer> list = query.list();

SQLQuery query = session.createSQLQuery("select * from customer where name =?");
query.setString(0, "泳锋");
query.addEntity(Customer.class);
List<Customer> list = query.list();
for(Customer customer : list) {
System.out.println(customer);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值