配置数据库连接:
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&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>
<!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&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();
}
}
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);
}