hibernate数据库基础操作

目录

说明

hibernate使用API操作实体类,HQL语句查询,Criteria查询

配置文件hibernate.cfg.xml

MySQL数据库,代码片.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory name="">
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test_db</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.connection.username" />
		<property name="hibernate.connection.password" />
		<!-- 显示sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式化显示的sql语句 -->
		<property name="hibernate.format_sql">true</property>
		<!-- 启动Hibernate时,重建数据库 create;更新数据库 update -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<mapping class="hibernate.user" resource="hibernate/user.hbm.xml" />
	</session-factory>
</hibernate-configuration>

配置文件user.hbm.xml

代码片.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated xxxx by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping default-access="field" default-lazy="false">
	<!-- 映射为表:USER -->
	<class name="hibernate.user" table="USER">
		<!-- 主键名NAME,类型string(也可以直接使用数据库的类型),手动添加assigned ,长45,非空-->
		<id name="name" type="java.lang.String">
			<column name="NAME" length="45" not-null="true" />
			<generator class="assigned" />
		</id>
		<!-- 属性名PASS,关闭懒加载 -->
		<property generated="never" lazy="false" name="pass"
			type="java.lang.String">
			<column name="PASS" length="45" not-null="true" />
		</property>
	</class>
</hibernate-mapping>

说明:

  1. 使用hibernate插件实现的。
  2. 文件路径要和实体类在一个目录内。

实体类user.java

代码片.

package hibernate;
public class user {
	private String name;
	private String pass;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}	
}

hibernate操作类–测试类textAPI

使用了Junit测试,代码片.

package hibernate;

import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

//hibernate操作的是实体对象,而不是数据库表,实体对象对应表的记录
public class textAPI {

	Session session; // 会话对象
	Transaction tx; // 事务对象

	@Before
	// 初始化
	public void before() {

		//获取配置对象
		Configuration configuration = new Configuration().configure();
		//获取注册服务对象 
		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
		//获取session工厂对象
		SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
		//创建会话对象,需要手动关闭session
		//Session session = sessionFactory.openSession();
		//无需手动关闭session,这种会话对象在事物提交或者回滚后会自动关闭
		Session session = sessionFactory.getCurrentSession();
		//创建事务
		Transaction transaction = session.getTransaction();
		//开启事务
		transaction.begin();
		
		/*
		Configuration cfg; // 配置对象
		SessionFactory sessionFactory;// session工厂
		Session session; // 会话对象
		Transaction tx; // 事务对象
		cfg = new Configuration().configure(); // 获取配置对象
		sessionFactory = cfg.buildSessionFactory();// 创建session工厂
		session = sessionFactory.openSession();// 创建session,每次创建都是新的,手动关闭事务
		// session=sessionFactory.getCurrentSession();//创建session,"单例"一个session,自动关闭事务

		tx = session.beginTransaction();// 打开事务
		*/
	}

	@Test
	// 使用hibernate的API操作数据库时都是以主键来标识,进行操作的
	public void api() {
		user user = new user();
		user.setName("123");
		user.setPass("123");
		int id=1;
		
		this.api_add(user);//增
		this.api_update(id, user);//改
		this.api_delate(id);//将id对应的实体对象中的值更新为user对象的值
		user reuser1=this.api_get(id);//查
		user reuser2=this.api_load(id);//查
		user reuser3=this.api_query();//查,hql对实体对象进行查找的语句
			
	}

	// 查get,立即查询
	public user api_get(int n) {

		// hibernate查询,返回实体对象
		user user = (user) session.get(user.class, n);//API
		return user;
	}

	// 查load,在使用到实体对象时,才真正的去查询
	public user api_load(int n) {

		// hibernate查询,返回实体对象
		user user = (user) session.load(user.class, n);//API
		return user;
	}

	// 增
	public void api_add(user user) {
		session.save(user);//API
	}

	// 更
	public void api_update(int n, user u) {
		user user = this.api_get(n);
		user.setName(u.getName());
		user.setPass(u.getPass());
		session.update(user);// API 可以省,一个实体对象对应一个表记录,同步变化
	}

	// 删
	public void api_delate(int n) {
		user user = this.api_get(n);
		session.delete(user);//API
	}

	// 条件查询,使用hql语句
	public user api_query() {
		String hql = "form user u where u.id=?";
		Query query = session.createQuery(hql);// 创建Query对象
		query.setParameter(1, 10);// 参数绑定
		user user = (user) query.uniqueResult();
		return user;
	}

	{// hql-查询语句-没有范围查询   u--别名
		String hql = "form user u where " + "u.id=:uid " + "and u.name=:uname " + "and u.password=:upassword";
		Query query = session.createQuery(hql);// 创建Query对象

		{// 根据参数名称绑定
			query.setInteger("uid", 1);// 参数绑定
			query.setString("uname", "张三");// 参数绑定
			query.setString("upassword", "123");// 参数绑定
		}

		{// 根据参数序列绑定
			query.setInteger(1, 1);// 参数绑定
			query.setString(2, "张三");// 参数绑定
			query.setString(3, "123");// 参数绑定

		}

		// 获得查询结果集
		List<?> list = query.list();
		// Iterator<?> it =query.iterate();
		Iterator<?> it = list.iterator();
		while (it.hasNext()) {
			user user = (user) it.next();
			System.out.println(user.toString());
		}
		
		{
			//可以使用聚类函数:avg,count,max,min,sum
			String hql1 = "select count(*) form user";
			String hql2 = "select sum(u.money) form user u";
			//支持order by,group by,having,子句查询

		}

	}
	
	{//Criteria查询--可以范围查询
		Criteria criteria = session.createCriteria(user.class);
		criteria.setMaxResults(20);//设置最大查询对象数
		criteria.add(Restrictions.like("name","李%",MatchMode.ANYWHERE));//模糊查询名字姓李的对象,根据不同的参数选择查询策略
		criteria.add(Restrictions.le("age",22));//年龄小于等于22的对象
		criteria.add(Restrictions.ge("age",12));//年龄大于等于12的对象
		criteria.addOrder(Order.asc("id"));//添加排序按照id升序
		criteria.setMaxResults(20);
		List users=criteria.list();
		Iterator it=users.iterator();
		while(it.hasNext()){
			user user=(user)it.next();
			System.out.println(user.toString());
		}
		
	}

	@After
	// 销毁
	public void api_after() {
		tx.commit();
		session.close();
	}

}

说明:

  1. 包括了所以的API内容.
  2. 使用了Junit测试框架

总结

	1. hibernate的API可以简化数据库操作,不显示的使用sql语句。
	2. hibernate操作的是实体对象,而不是表,是面向对象的操作。
	3. 要记得在编程时主动关闭资源。
**引用包是最大的困难(一步一步来)**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值