hibernate学习笔记01--基本API

来源:互联网 发布:广告联盟js代码 编辑:程序博客网 时间:2024/06/07 20:22

映射文件:

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>


保存(插入)数据

//插入保存数据@Testpublic 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();}


修改(更新)数据

//更新操作@Testpublic 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();}


 删除数据,

//删除@Testpublic 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@Testpublic 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);//如果数据不存在,会返回nullCustomer 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)语句完成



//测试查询所有数据对象@Testpublic void testQueryAll(){//获取配置对象,用来加载核心配置文件hibernate.cfg.xml--材料Configuration configuration = new Configuration().configure();//2.使用配置对象获取会话工厂,用来生产会话,有点像连接池SessionFactory sessionFactory = configuration.buildSessionFactory();//3.通过工厂来获取一个会话,(和servlet没有半毛钱关系)作用:用来操作数据库对应的对象的,有点像connectionSession 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[]//如果想自动装回实体类,必须绑定一个实体classList list2 = sqlQuery.addEntity(Customer.class).list();System.out.println(list2);//提交事务transaction.commit();//释放资源session.close();sessionFactory.close();}

Query查询接口

作用:Query对象主要用于执行查询操作。

 

Query接口用于接收HQl语句执行查询。

HQLHibernate Query Language缩写,语法很SQL语法,但是完全面向对象的。

Hibernate为照顾和兼容原生的SQLHibernate提供了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查询接口

作用:用于执行查询操作。

特点:完全面向对象的方式添加条件,不需要写hqlsql



【示例】

使用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();}




原创粉丝点击