hibernate学习笔记01--基本API

映射文件:

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语句执行查询。

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值