hibernate学习笔记6--Criteria查询方式、完整小练习(开发步骤)
一、Criteria查询方式
没有sql语了,因此更加面向对象一些。
Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式:
Criteria c = s.createCriteria(DomainClass.class);
简单属性条件如:c.add(Restrictions.eq(propertyName, name));
c.add(Restrictions.eqProperty(propertyName, otherpropertyName));
- package cn.itcast.hibernate;
- import java.util.Date;
- import java.util.List;
- import org.hibernate.Criteria;
- import org.hibernate.Session;
- import org.hibernate.criterion.Restrictions;
- import cn.itcast.hibernate.domain.User;
- public class Cri {
- /**
- * 使用Criteria根据name查询方法
- * @param entity
- */
- public static void Cri(String name){
- Session s = null;
- try {
- s=HIbernateUtil.getSession();
- //使用Criteria接口
- Criteria c = s.createCriteria(User.class);
- //对查询添加限制条件,相当于where子句。"name"必须是类中具有的属性
- //Criteria相当于一个容器,约束可以一直加
- c.add(Restrictions.eq("name", name)); //等于
- // c.add(Restrictions.gt("birthday",new Date())); // 大于
- c.add(Restrictions.lt("birthday",new Date())); // 小于
- //以上条件之间是and的连接方式,当然也可以用一下的or连接方式
- // c.add(Restrictions.or(lhs, rhs));or 两个条件
- //Criteria实现分页,hql的方法名基本相同
- c.setFirstResult(0);// 从哪条开始取
- c.setMaxResults(10);// 共取多少条
- List<User> list=c.list(); //executQuery();
- for(User user:list){
- System.out.print(user.getName());
- }
- //如果确定数据最多只有一条,可以使用一下的方法简化代码
- User u= (User)c.uniqueResult();
- System.out.print("只有一条数据"+u.getName());
- } finally {
- if(s!=null){
- s.close();
- }
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- Cri("你妹");
- }
- }
二、小练习(一个各层的完整开发步骤)
1.完整开发步骤
2.实现功能(实现接口方法)
下面具体例子代码:
接口类:
- package cn.itcast.dao;
- import cn.itcast.domain.User;
- public interface UserDao {
- public void saveUser(User user);
- public User findUserByName(String name);
- public User findUserById(int id);
- public void updateUser(User user);
- public void remove(User user);
- }
工具类:获取session
- package cn.itcast.dao;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- /**
- *(1)不想让其他类继承工具类
- *(2)不能让它创建对象,所以属性全部private,还得有个private的无参数构造
- * @author Mars
- *
- */
- public final class HibernateUtil {
- private static SessionFactory sessionFactory;
- private HibernateUtil(){
- }
- /**
- * 细节1:Configuration:是一个配置类
- * Configuration的对象会找hibernate.cfg.xml,完成hibernate的初始化
- *
- * 细节2:hibernate的配置文件有两种hibernate.cfg.xml和hibernate.properties
- * 两种存在一种即可,当然如果都存在的话,hibernate.cfg.xml中的配置信息会覆盖hibernate.properties的配置信息
- */
- static{
- //1。读取并解析配置文件
- Configuration cfg = new Configuration();
- //如果hibernate.cfg.xml不是放在类路径下,就需要此时指定路径
- //cfg.configure("filename");
- cfg.configure();
- //可以使用代码来设置配置信息,但是不便于管理,不建议使用
- //cfg.setProperty("hibernate.connection.driver_class", "oracle.jdbc.driver.OracleDriver");
- //2。读取并解析映射信息,创建SessionFactory
- //所有的配置信息都可以在SessionFactory中找到,映射文件的信息都能找到
- sessionFactory = cfg.buildSessionFactory();
- }
- /**
- * 获取session
- * @return
- */
- public static Session getSession(){
- // 3。打开Session
- return sessionFactory.openSession();
- }
- /**
- * 获取SessionFactory对象
- * @return
- */
- public static SessionFactory getSessionFactory(){
- return sessionFactory;
- }
- }
接口的实现类:
- package cn.itcast.dao.imp;
- import org.hibernate.Criteria;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import org.hibernate.criterion.Restrictions;
- import cn.itcast.dao.HibernateUtil;
- import cn.itcast.dao.UserDao;
- import cn.itcast.domain.User;
- public class UserDaoHibernateImpl implements UserDao {
- /**
- * 根据id查询user
- */
- public User findUserById(int id) {
- //因为是查询所以可以不用开启事务
- Session s = null;
- try {
- s = HibernateUtil.getSession();
- //User.class不可随便放,必须靠这个指定来找相应的映射文件
- //此处不能使用懒加载s.load(arg0, arg1),会报错,详见后续文章
- User user = (User)s.get(User.class, id);
- return user;
- } finally {
- if(s!=null){
- s.close();
- }
- }
- }
- /**
- * 根据姓名获取user
- */
- public User findUserByName(String name) {
- Session s = null;
- try {
- s=HibernateUtil.getSession();
- Criteria c = s.createCriteria(User.class);
- c.add(Restrictions.eq("name", name));
- User user = (User)c.uniqueResult();
- return user;
- } finally{
- if(s!=null){
- s.close();
- }
- }
- }
- /**
- * 通过hql根据姓名获取user
- */
- public User findUserByNamehql(String name) {
- Session s = null;
- try {
- s=HibernateUtil.getSession();
- String hql = "from User as user where user.name=:n";
- Query q = s.createQuery(hql);
- q.setString("n",name);
- User user = (User)q.uniqueResult();
- return user;
- } finally{
- if(s!=null){
- s.close();
- }
- }
- }
- /**
- * 删除方法:必须开启事务
- */
- public void remove(User user) {
- Session s = null;
- Transaction tx =null;
- try {
- s=HibernateUtil.getSession();
- tx=s.beginTransaction();
- s.delete(user);
- tx.commit();
- } finally{
- if(s!=null){
- s.close();
- }
- }
- }
- /**
- * 删除方法测试:只穿id的话能否成功删除
- */
- public void remove(int id) {
- Session s = null;
- Transaction tx =null;
- User user = new User();
- user.setId(id);
- try {
- s=HibernateUtil.getSession();
- tx=s.beginTransaction();
- s.delete(user);
- tx.commit();
- } finally{
- if(s!=null){
- s.close();
- }
- }
- }
- /**
- * 保存对象
- */
- public void saveUser(User user) {
- Session s = null;
- Transaction tx =null;
- try {
- s=HibernateUtil.getSession();
- tx=s.beginTransaction();
- s.save(user);
- tx.commit();
- } finally{
- if(s!=null){
- s.close();
- }
- }
- }
- /**
- * 更新对象
- */
- public void updateUser(User user) {
- Session s = null;
- Transaction tx =null;
- try {
- s=HibernateUtil.getSession();
- tx=s.beginTransaction();
- s.update(user);
- tx.commit();
- } finally{
- if(s!=null){
- s.close();
- }
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- }
- }
dimain:
- package cn.itcast.domain;
- import java.util.Date;
- public class User {
- private int id;
- private String name;
- private Date birthday;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- }
映射文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="cn.itcast.domain">
- <class name="User" table="tb_user">
- <!-- 对象标示符,类型可以不写,hibernate自己识别 -->
- <id name="id" column="id">
- <!-- 指定主键生成方式。
- native根据方言判定生成主键的方式
- -->
- <generator class="native"/>
- </id>
- <property name="name" column="name" unique="true" not-null="true"/><!--标示name唯一性,非空的限制 -->
- <property name="birthday" />
- </class>
- </hibernate-mapping>
下面就是简单粗暴的测试类:
- package cn.itcast;
- import java.util.Date;
- import cn.itcast.dao.UserDao;
- import cn.itcast.dao.imp.UserDaoHibernateImpl;
- import cn.itcast.domain.User;
- public class DaoText {
- /**
- * 模拟业务逻辑层在使用数据访问层的东西
- */
- public static void main(String[] args) {
- UserDao dao = new UserDaoHibernateImpl();
- UserDaoHibernateImpl daoimp = new UserDaoHibernateImpl();
- User user = new User();
- user.setName("nimei");
- user.setBirthday(new Date());
- System.out.println("1111");
- dao.saveUser(user);
- int id = dao.findUserByName("nimei").getId();
- System.out.println("id: "+id);
- user.setName("new name");
- System.out.println("2222");
- dao.updateUser(user);
- //User u = dao.findUserByName(user.getName());
- System.out.println("3333");
- //dao.remove(user);
- //封装的对象只封装如id和非空字段,实施删除测试
- //daoimp.remove(id);
- //封装的对象只封装如id和非空字段,实施更新测试
- User user2 = new User();
- user2.setId(id);
- user2.setName("涅米");
- dao.updateUser(user2);
- }
- }
备注:
备注1:对于方言可以不添加,hibernate在启动时会自行进行测试匹配,一般都能识别出相应的数据库,但是最好还是加上。
<property>节点中的name属性中不要有在结尾处有空格
备注2:hibernante:不再是更新单列,完全面对的是对象,更新就是更新对象状态,删除就删除对象。
所以对于删除来说删除是根据id,只要将id和映射文件中不为空的字段封装入user即可,之后就可以轻松的调用remove();
例如:不满足映射文件
<property name="name" column="name" unique="true" not-null="true"/><!--标示name唯一性 ,非空的限制-->
则运行时报错。
以上有关于删除的规则,更新同样适用
备注3.hibernate对domain Object限制
(1)默认构造方法(必须的)
(2)有无意义的标示符id(主键)(可选)
(3)非fianl的,对懒加载有影响(可选)
hibernate学习笔记6--Criteria查询方式、完整小练习(开发步骤)的更多相关文章
- HIbernate学习笔记5 之 查询
一.HQL查询 * 按条件查询,条件中写的是属性名,之后在query对象为添加赋值,如: String hql = " from User where uid=?"; Sessio ...
- Hibernate学习笔记(十) — HQL查询
一.HQL的一对多查询 班级(1)->(多)学生 /** * 实现Classes与Student的内连接 * * SELECT c.*,s.* * from classes c INNER JO ...
- [SAM4N学习笔记]按键程序(查询方式)
一.准备工作: 将上一节搭建的工程复制一份,命名为"5.key scanf".这一节主要讲如何使用SAM4N的GPIO输入功能,实现按键的输入. 二.程序编写: ...
- NHibernate3.2学习笔记-几种查询方式
一.开发环境 数据库:SQLServer2008 编译器:VS2010 .Net版本:.Net Framework 4.0 二.开发过程 1.项目结构 承接上一篇 2.执行sql语句 (1)基本语法 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- mybatis学习笔记(10)-一对一查询
mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
随机推荐
- NYOJ-244 16进制的简单运算 AC 分类: NYOJ 2014-01-17 21:11 195人阅读 评论(0) 收藏
#include<stdio.h> int main() { long x,y; char op; int t; scanf("%d ", &t); while ...
- [usaco2009febgold]道路翻新 最短路+dp
这道题居然卡SPFA,难受,写了这么长时间的SPFA,都快把dij忘光了: 设d[i][j]为修j条路到i的最短距离,然后跑堆优化dij就行了: 实测中SPFA两组大数据超时严重: dij约300ms ...
- 引擎设计跟踪(九.14.2f) 最近更新: OpenGL ES & tools
之前骨骼动画的IK暂时放一放, 最近在搞GLES的实现. 之前除了GLES没有实现, Android的代码移植已经完毕: [原]跨平台编程注意事项(三): window 到 android 的 移植 ...
- Linux软件安装方法小结(附:rpm详解)(转载)
在使用Linux系统的过程中,软件包的安装是避免不了的,在Linux下,软件安装程序的种类很多,安装方法也各式各样,(舒适性自然比不上windows :-))不过我们常见的软件包有两种: 1)含有软件 ...
- Codeforces Round #283 (Div. 2)
A:暴力弄就好,怎么方便怎么来. B:我们知道最多加10次, 然后每次加1后我们求能移动的最小值,大概O(N)的效率. #include<bits/stdc++.h> using name ...
- Java NIO 与 基于reactor设计模式的事件处理模型
Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...
- SOA之(3)——面向服务计算基础
面向服务计算基础(Service-Oriented Computing Fundamentals) 面向服务的计算(Service-Oriented Computing) 面向服务的计算是一个伞状术语 ...
- centos 安装软件
1)一种是软件的源代码,您需要自己动手编译它.这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz).2)另一种是软件的可执行程序,你只要安装它就可以了.这种软件安装包通常被是一个RP ...
- hadoop开发环境-----eclipse
1.eclipse下载 http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/lunasr1 2.hadoo ...
- JavaScript创建命名空间、类及类成员
JavaScript代码: //为String对象增加方法isNullOrEmpty String.isNullOrEmpty = function (a) { if (a != null & ...