代码结构和使用jar包
HibernateUtil.java
package com.orange.demo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session openSession() {
return sessionFactory.openSession();
}
}
UserDao.java
package com.orange.demo;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class UserDao {
public void save(User user) {
Session session = HibernateUtil.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(user);
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
} finally {
session.close();
}
}
public void update(User user) {
Session session = HibernateUtil.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.update(user);
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
} finally {
session.close();
}
}
public void delete(int id) {
Session session = HibernateUtil.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Object user = session.get(User.class, id);
session.delete(user);
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
} finally {
session.close();
}
}
public User getUserById(int id) {
Session session = HibernateUtil.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
User user = (User) session.get(User.class, id);
tx.commit();
return user;
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
session.close();
}
}
public List<User> findAll() {
Session session = HibernateUtil.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
List<User> list = session.createQuery("FROM User").list();
tx.commit();
return list;
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
session.close();
}
}
public QueryResult findAll(int firstResult, int maxResult) {
Session session = HibernateUtil.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Query query = session.createQuery("FROM User");
query.setFirstResult(firstResult);
query.setMaxResults(maxResult);
List<User> list = query.list();
Long count = (Long) session
.createQuery("SELECT COUNT(*) FROM User").uniqueResult();
tx.commit();
return new QueryResult(count.intValue(), list);
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
session.close();
}
}
}
QueryResult.java
package com.orange.demo;
import java.util.List;
/**
* 分页类
*/
public class QueryResult {
private int count; // 总页数
private List list; // 每页的数据
public QueryResult(int count, List list) {
this.count = count;
this.list = list;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
}
User.java(省略了各属性的get set方法)
package com.orange.demo;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* 实体对象 一般与映射文件hbm.xml名一样
*/
public class User {
private int id;
private String name;
private int age;
private Date date;
private String text;
private Set<String> addressSet;
private List<String> addressList;
@Override
public String toString() {
return "User: id=" + id + ", name=" + name ;
}
}
Test.java
package com.orange.demo;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Test {
private static UserDao userDao = null;
public static void main(String[] args) {
userDao = new UserDao();
// save();
// delete();
// update();
// getById();
// getAll();
// getPage();
}
public static void save(){
User user = new User();
Set<String> set = new HashSet<String>();
List<String> list = new ArrayList<String>();
set.add("北京丰台");
set.add("北京海淀");
list.add("中国");
list.add("中国");
list.add("美国");
user.setName("orange");
user.setAge(88);
user.setDate(new Date());
user.setText("一篇文章");
user.setAddressSet(set);
user.setAddressList(list);
userDao.save(user);
}
public static void save100(){
for(int i =1 ;i<=100;i++){
User user = new User();
user.setName("orange_" + i);
userDao.save(user);
}
}
public static void delete(){
userDao.delete(1);
}
public static void update(){
User user = userDao.getUserById(1);
user.setName("大橙子");
userDao.update(user);
}
public static void getById(){
User user = userDao.getUserById(1);
System.out.println(user);
}
public static void getAll(){
List<User> list = userDao.findAll();
for(User user :list){
System.out.println(user);
}
}
public static void getPage(){
QueryResult qr = userDao.findAll(100, 10);
System.out.println("总数:" + qr.getCount());
for(Object obj : qr.getList()){
System.out.println(obj);
}
}
}
save方法保存时,会向三个表添加数据t_user,address_set,address_list,t_user和address_set存在依赖关系,t_user和address_list存在依赖关系,所以要先删除address_list表和address_set表的数据才能删除t_user表,这里只是演示如何映射集合类型的属性。关于一对多和多对一的关联关系请参考http://blog.csdn.net/itjavaer/article/details/40982725
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">
<!-- 指定映射的类所在的包 -->
<hibernate-mapping package="com.orange.demo">
<!-- class 指定类的全名 如果配置hibernate-mapping package属性直接写类名即可-->
<!-- table 属性可以不写,不写映射的表名是类的简单名称 -->
<class name="User" table="t_user">
<id name="id" type="int" column="id">
<!-- 自动增长 -->
<generator class="native"/>
<!--手工指定主键 <generator class="assigned"/>-->
</id>
<!-- length string类型不写为255,int类型没有长度 -->
<property name="name" type="string" column="name" length="50" not-null="true"/>
<property name="age" type="int" column="age" />
<property name="date" type="date" column="date" />
<!-- text 大文本类型 -->
<property name="text" type="text" length="2000" column="text" />
<!-- set集合映射 将生成一张address_set是表-->
<set name="addressSet" table="address_set">
<key column="userId"></key>
<element type="string" column="address"></element>
</set>
<!-- list集合映射 将生成一张address_list是表-->
<list name="addressList" table="address_list">
<key column="userId"></key>
<list-index column="idx"></list-index>
<element type="string" column="address" ></element>
</list>
</class>
</hibernate-mapping>
hibernate.cfg.xml(在src目录下)
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="foo">
<!-- 数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.url">jdbc:mysql://localhost:3306/t1?characterEncoding=UTF-8</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 在控制台打印SQL,但不能打印建表语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 打印SQL是否格式化 false:不格式化 -->
<property name="hibernate.format_sql">false</property>
<!--自动更新数据库结构 -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="com/orange/demo/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>