Hibernate的增删查改(分页+其他查询)

本文介绍了如何使用Hibernate框架进行基本的增删查改操作,并深入讲解了HQL查询语言的特点及多种实用查询技巧。

首先先把Hibernate的配置信息和关系全部建立好。接下来就可以进行增删查改了。

    private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;

    /**
     *所有方法之前调用 
     */
	@Before
	public void before(){
		//1.读取hibernate配置文件
		Configuration configuration=new Configuration().configure();
		
		//获取sessionFactory
		sessionFactory = configuration.buildSessionFactory();
		
		//获取session
		session = sessionFactory.openSession();
		transaction = session.beginTransaction();
	}
	
	/**
	 * 所有方法之后调用   注意:查询不需要commit 
	 */
	@After
	public void after(){
		//提交事务
		transaction.commit();
		
		session.close();
		sessionFactory.close();
	}
	
	/**
	 * 添加的方法 
	 */
	@Test
	public void testAdd(){
		Student student=new Student("哥哥", 18);
		session.save(student);
	}

增加是这样,删改也差不多啦!

    /**
     *查询所有的方法 
     */
    public List selectAll(){
        //读取Hibernate配置文件
		Configuration configuration=new Configuration().configure();
		//获取sessionFactory
		SessionFactory sessionFactory= configuration.buildSessionFactory();
		//获取session
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		List persons=session.createCriteria(Person.class).list();
		//提交事务
		transaction.commit();
		return persons;
	}
	
    /**
     * 修改的方法 
     */
	public void updatePerson(Person person){
	//读取Hibernate配置文件
		Configuration configuration=new Configuration().configure();
		//获取sessionFactory
		SessionFactory sessionFactory= configuration.buildSessionFactory();
		//获取session
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		session.update(person);
		//提交事务
		transaction.commit();
	}
	
	/**
	 * 
	 * 博主这里是获取到用户自己确定删除的id或者对象进行删除,也可以用session.get("实体类".class,id号);
	 * 进行获取某单一个对象或者id进行删除
	 * 
	 * 删除方法 
	 */
	public void deletePerson(Person person){
		//读取Hibernate配置文件
		Configuration configuration=new Configuration().configure();
		//获取sessionFactory
		SessionFactory sessionFactory= configuration.buildSessionFactory();
		//获取session
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		session.delete(person);
		//提交事务
		transaction.commit();
	}


接下来给大家重点说说查询!博主说的查询是HQL查询,跟以上的查询全部和单个查询不一样。

众所周知,Hibernate是全封装框架,最大的特点就是不用自己写SQL语句(具体参照上面案例),但是Hibernate也是可以使用SQL语句查询的,也就是今天所说的HQL查询。


HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。

public class TestHQL {
	
	private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;

	@Before
	public void before(){
		//读取hibernate配置文件
		Configuration configuration=new Configuration().configure();
		//获取sessionFactory
		sessionFactory = configuration.buildSessionFactory();
		//获取session
		session = sessionFactory.openSession();
		transaction = session.beginTransaction();
	}
	
	@After
	public void after(){
	    //提交事务
		transaction.commit();
		session.close();
		sessionFactory.close();
	}
	
	@Test
	public void testhql(){
		//查询所有  可以省略select *
//		List persons=session.createQuery("from Person").list();
//		for (Person person : persons) {
//			System.out.println(person);
//		}
		
		//查询某一列
//		List names=session.createQuery("select pname from Person").list();
//		for (String string : names) {
//			System.out.println(string);
//		}
		
		//查询某几列    查询结果来源于多张表
//		List objects=session.createQuery("select pname,page from Person").list();
//		for (Object[] objects2 : objects) {
//			String pname=objects2[0].toString();
//			int page=Integer.parseInt(objects2[1].toString());
//			System.out.println(pname+" "+page);
//		}
		
		
		//构造查询
//		List persons=session.createQuery("select new Person(pname,page) from Person").list();
//		for (Person person : persons) {
//			System.out.println(person);
//		}
		
		//带条件查询
		//查询年龄在15 到 60 之间
//		List persons=session.createQuery("from Person where page between ? and ?").setInteger(0, 15).setInteger(1, 60).list();
//		List persons=session.createQuery("from Person where page between :min and :max").setInteger("min", 15).setInteger("max", 60).list();
//		for (Person person : persons) {
//			System.out.println(person);
//		}
		
		
		//聚合函数
//		int page=Integer.parseInt(session.createQuery("select max(page) from Person").uniqueResult().toString());
//		System.out.println(page);
		
		//分页
//		int pageNo=2;
//		int pageSize=2;
//		List persons=session.createQuery("from Person").setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize).list();
//		for (Person person : persons) {
//			System.out.println(person);
//		}
		
		//排序
		//年龄
//		List persons=session.createQuery("from Person order by page desc").list();
//		for (Person person : persons) {
//			System.out.println(person);
//		}
		
		//对象导航
//		session.createQuery("from Person p where p.city.caddress like '湖南省'");
	}


内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值