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的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
随机推荐
- TestDriven.Net
转: http://www.cnblogs.com/AlexLiu/archive/2008/12/01/1345002.html
- 用HAProxy和KeepAlived构建高可用的反向代理
用HAProxy和KeepAlived构建高可用的反向代理 用HAProxy和KeepAlived构建高可用的反向代理 前言对于访问量较大的网站来说,随着流量的增加单台服务器已经无法处理所有的请求 ...
- 利用URLRewriter.dll 实现ASP.NET实现伪静态
大家一定经常在网络上看到很多网站的地址后缀都是用XX.HTML或者XX.ASPX等类似静态文件的标示来操作的吧,那么大家有怀疑过他真的是一个一个的静态生成的文件么,静态文件的生成的优缺有好有坏,对于访 ...
- ExtJS与jQuery的一点细节上的对比
首先说明这不是一篇完整解读ExtJS和jQuery所有方面差异的文章,只是针对我个人刚看了两天的jQuery产生的一些疑问的整理.之前用过一段时间ExtJS,了解ExtJS的一些机制.现在做移动开发, ...
- CodeIgniter 常量ENVIRONMENT设置要注意的地方
http://bbs.phpchina.com/thread-274514-1-1.html index.php ,这是CodeIgniter的入口文件,做开发是,都会设置一下define('ENVI ...
- jxl.dll操作总结
1)Jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Excel文档.除了Jxl之外,还有Apache的一个POI项目,也可以操作Excel,两者相比之下: ...
- m_pMainWnd(转载)
今天写程序时遇到个简单而又很有意思的问题,封装了一个网络接口类,发送数据以及网络的回调接口都在这个类里面,打算在回调函数里给AfxGetMainWnd()发送消息以更新主界面的数据,同时程序有一个登录 ...
- UVA 10780 Again Prime? No Time. 分解质因子
The problem statement is very easy. Given a number n you have to determine the largest power of m,no ...
- 【poj1061-青蛙的约会】拓展欧几里得-不定方程
http://poj.org/problem?id=1061 题意:裸题.注意负数. //poj1061 #include<cstdio> #include<cstdlib> ...
- YII框架的依赖注入容器与服务定位器简述
依赖注入容器 依赖注入(Dependency Injection,DI)容器就是一个对象use yii\di\Container,它知道怎样初始化并配置对象及其依赖的所有对象. 依赖注入和服务定位器都 ...