映射文件:
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标签用来编写java类和数据库表之间的对应关系 -->
<hibernate-mapping>
<!--class 类和表之间的关系
name:类的名字,一般是全类名
table:表的名字
-->
<class name="cn.itcast.hibernate.a_quickstart.Customer" table="t_customer">
<!-- 属性和字段的对应关系 -->
<!-- 特殊的属性:id:用来配置主键的对应关系
name:类中的属性的名字
column:是数据库字段的名字,可以和属性一样,也可以不一样
-->
<id name="id" column="id">
<!-- 主键策略:和数据库对应
class:主键策略配置,内置很多策略,mysql的自增长就对应identity
-->
<generator class="identity"/>
</id>
<!-- 配置其他一般的属性
name:属性的名字
column:字段名
-->
<property name="name" column="name"/>
<!-- 如果字段名和属性名一样,则,可以省略column属性 -->
<property name="age"/>
<property name="city"/>
</class>
</hibernate-mapping>
编写hibernate核心配置.—jdbc连接数据库\hbm映射管理等等,习惯上在src下创建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的核心的一些配置,比如jdbc、映射文件加载相关的 -->
<hibernate-configuration>
<!-- 所有的配置都在会话工厂中配置,会话工厂缓存了这些配置 -->
<session-factory>
<!-- jdbc相关的东东 :4个东西-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///itcast24</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<!-- 配置方言: 作用不同的数据库的sql是不同,自动发sql会根据方言来发sql-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 配置其他属性 -->
<!-- 自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 打印sql -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 引入hbm配置文件 -->
<!-- 注意:包中间的分隔符是点,但资源文件的分隔符是斜杠 -->
<mapping resource="cn/itcast/hibernate/a_quickstart/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
保存(插入)数据
//插入保存数据
@Test
public void testSave(){
//手动new一个实体类对象
Customer customer = new Customer();
// customer.setId(id)//id是自增长的不需要赋值
customer.setName("Rose");
customer.setAge(18);
customer.setCity("上海");
//得到配置对象:加载核心配置文件hibernate.cfg.xml,,--可以认为制造工厂的材料
Configuration configuration = new Configuration().configure();
//创建会话工厂(类似于连接池)
SessionFactory sessionFactory = configuration.buildSessionFactory();
//通过会话工厂得到会话session(该会话和servlet中的会话没关系)(类似于Connection连接)
Session session=sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//操作数据库
//保存数据,不需要写sql,只需要操作实体类对象
session.save(customer);
//提交事务
transaction.commit();
//释放资源
session.close();
sessionFactory.close();
}
修改(更新)数据
//更新操作
@Test
public void testUpdate(){
//配置对象
Configuration configuration = new Configuration().configure();
//会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
//会话
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//数据库操作
Customer customer = new Customer();
customer.setId(1);//更新的时候必须给id赋值
customer.setName("Jack");
customer.setAge(88);
customer.setCity("北京");
//更新
//更操作是根据id属性来更新!!!
session.update(customer);
//提交事务
transaction.commit();
//释放资源
session.close();
sessionFactory.close();
}
删除数据,
//删除
@Test
public void testDelete(){
//配置对象
Configuration configuration = new Configuration().configure();
//会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
//会话
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//数据库操作
Customer customer = new Customer();
customer.setId(1);//删除操作必须给id属性值,否则异常
//其他属性可有可无
customer.setName("Rose");//删除时除id属性外,其他属性都会被忽略。
//删除(对象)
//删除方法底层根据id来删除数据。
session.delete(customer);
//提交事务
transaction.commit();
//释放资源
session.close();
sessionFactory.close();
}
通过主键来查询数据
//查询:根据id来查询
//根据主键查找数据,通过session的get或load
@Test
public void testQueryById(){
//配置对象
Configuration configuration = new Configuration().configure();
//会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
//会话
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//数据库操作
//根据id属性(主键)查询
//参数1:实体类的class:自动去查找该类对应的表的数据,还有个作用,将查询的结果自动封装到实体类中
//参数2:主键属性的值
// Customer customer = (Customer) session.get(Customer.class, 2);//如果数据不存在,会返回null
Customer customer = (Customer) session.load(Customer.class, 3);//如果数据不存在,load会报错
System.out.println("customer:"+customer);
//提交事务
transaction.commit();
//释放资源
session.close();
sessionFactory.close();
查询所有数据
使用hibernate提供的Query接口来完成,使用HQL(hibernate Query language)语句完成
//测试查询所有数据对象
@Test
public void testQueryAll(){
//获取配置对象,用来加载核心配置文件hibernate.cfg.xml--材料
Configuration configuration = new Configuration().configure();
//2.使用配置对象获取会话工厂,用来生产会话,有点像连接池
SessionFactory sessionFactory = configuration.buildSessionFactory();
//3.通过工厂来获取一个会话,(和servlet没有半毛钱关系)作用:用来操作数据库对应的对象的,有点像connection
Session session = sessionFactory.openSession();
//4.开启事务(可以省略)
Transaction transaction = session.beginTransaction();
//操作数据库(通过操作对象来操作)
//一。Query对象的
String hql="from Customer";//Hibernate查询语句,该语句的语法类似于sql:select * from t_customer
//hql是面向对象的,这里的Customer是类名,不是表名!,自动生成sql的
Query query = session.createQuery(hql);
//查询列表操作
//Hibernate会自动将结果封装为实体类中
List<Customer> list = query.list();
System.out.println(list);
//二。SqlQuery接口对象,是Query接口的子接口,可以接受sql语句
String sql="select * from t_customer";
SQLQuery sqlQuery = session.createSQLQuery(sql);
//查询列表操作
//默认情况下,不会自动将结果封装回实体中,装到了Object[]
//如果想自动装回实体类,必须绑定一个实体class
List list2 = sqlQuery.addEntity(Customer.class).list();
System.out.println(list2);
//提交事务
transaction.commit();
//释放资源
session.close();
sessionFactory.close();
}
Query查询接口
作用:Query对象主要用于执行查询操作。
Query接口用于接收HQl语句执行查询。
HQL是Hibernate Query Language缩写,语法很像SQL语法,但是完全面向对象的。
Hibernate为照顾和兼容原生的SQL,Hibernate提供了Query的子接口SqlQuery来执行SQL语句,用法和query接口的一样。
【示例】
通过Query接口执行查询,分别查询所有数据列表、根据条件查询一条数据(分别不使用和使用占位符)、
@Test
//测试Query接口的各种基本查询:查询所有,条件查询
public void testQuery(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//操作
//1.Query接口
//1.1查询所有
// List<Customer> list = session.createQuery("from Customer").list();
//扩展:from后面跟的是个类名,应该是全类名,如果你写短类名,那么Hibernate会自动反射出全类名
// List<Customer> list = session.createQuery("from cn.itcast.hibernate.a_quickstart.Customer").list();
//*是sql的语法
// List<Customer> list = session.createQuery("select * from Customer").list();
List<Customer> list = session.createQuery("select c from Customer c").list();
System.out.println(list);
//1.2条件查询:按照姓名查询,这里面的name是属性,不是字段
List<Customer> list12 = session.createQuery("from Customer where name='Rose'").list();
System.out.println(list12);
//扩展:如果你能保证只有一个对象返回,可以使用另外一个方法,少写一段代码,list.get(0)
Customer customer = (Customer) session.createQuery("from Customer where name='Rose'").uniqueResult();
System.out.println(customer);
//1.3:条件查询:占位符
Customer customer3 = (Customer) session.createQuery("from Customer where name=?")
.setParameter(0, "Rose").uniqueResult();
System.out.println(customer3);
//2.sqlquery:面向sql的
List<Customer> list2 = session.createSQLQuery("select * from t_customer").addEntity(Customer.class).list();
System.out.println(list2);
//2.1条件查询
// List<Customer> list21 = session.createSQLQuery("select * from t_customer where name='Rose'").addEntity(Customer.class).list();
Customer customer21 = (Customer)session.createSQLQuery("select * from t_customer where name='Rose'").addEntity(Customer.class).uniqueResult();
System.out.println(customer21);
//占位符条件查询
Customer customer22 = (Customer)session.createSQLQuery("select * from t_customer where name=?")
// .setParameter(0, "Rose")
.addEntity(Customer.class)
//先绑定再设置参数,顺序问题
.setParameter(0, "Rose")
.uniqueResult();
System.out.println(customer22);
session.getTransaction().commit();
session.close();
}
SqlQuery.list 默认是生成的object[],必须使用绑定实体后,Hibernate才会将结果自动封装成实体对象。
Criteria查询接口
作用:用于执行查询操作。
特点:完全面向对象的方式添加条件,不需要写hql或sql
【示例】
使用Criteria接口对象执行查询,分别查询所有数据列表、根据条件查询一条数据
@Test
//Criteria接口查询
//使用Criteria接口对象执行查询,分别查询所有数据列表、根据条件查询一
public void testCriteria(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//操作
//获取Criteria接口对象:完全面向对象,最大的特点,不需要关心sql怎么写,自动生成sql。
Criteria criteria = session.createCriteria(Customer.class);//参数就是要查询的对象(对应表)
//查询所有
// List<Customer> list = criteria.list();
// System.out.println(list);
//条件查询(特点:要啥条件随便加,语句怎么写,不用管)
//参数是属性,不是字段
criteria.add(Restrictions.eq("name", "Rose"));//等值查询
criteria.add(Restrictions.like("city", "%上%"));//模糊查询
// Criterion
//查询
// List<Customer> list = criteria.list();
// System.out.println(list);
Customer customer = (Customer) criteria.uniqueResult();
System.out.println(customer);
session.getTransaction().commit();
session.close();
}