目录
说明
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>
说明:
- 使用hibernate插件实现的。
- 文件路径要和实体类在一个目录内。
实体类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();
}
}
说明:
- 包括了所以的API内容.
- 使用了Junit测试框架
总结
1. hibernate的API可以简化数据库操作,不显示的使用sql语句。
2. hibernate操作的是实体对象,而不是表,是面向对象的操作。
3. 要记得在编程时主动关闭资源。
**引用包是最大的困难(一步一步来)**