多对一映射简例:
1.我使用学生和地址的关系来做示例:
student[s_id,s_name,s_addr]
address[a_id,city]
2.建立数据库表:
create table address(
a_id int(10) auto_increment primary key,
city varchar(16)
)engine=MyISAM CHARACTER SET=utf8;
create table student(
s_id int(10) auto_increment primary key,
s_name varchar(20) not null,
s_addr int(10),
foreign key (s_addr) references address(a_id)
)engine=MyISAM CHARACTER SET=utf8;
3.jar包:和数据库映射:
/hibernate_many2one_1/lib/antlr-2.7.6.jar /hibernate_many2one_1/lib/commons-collections-3.1.jar /hibernate_many2one_1/lib/dom4j-1.6.1.jar /hibernate_many2one_1/lib/hibernate-jpa-2.0-api-1.0.0.Final.jar /hibernate_many2one_1/lib/hibernate3.jar /hibernate_many2one_1/lib/javassist-3.12.0.GA.jar /hibernate_many2one_1/lib/jta-1.1.jar /hibernate_many2one_1/lib/junit-4.9b1.jar /hibernate_many2one_1/lib/mysql6.jar /hibernate_many2one_1/lib/slf4j-api-1.6.1.jar /hibernate_many2one_1/lib/slf4j-simple-1.6.1.jar
hibernate.cfg.xml
<!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> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/hnie?useUnicode=true&characterEncoding=UTF-8</property> <property name="connection.username">root</property> <property name="connection.password">1234</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <mapping resource="model/Student.hbm.xml"/> <mapping resource="model/Address.hbm.xml"/> </session-factory> </hibernate-configuration>
4.model层:Address和Student
(1)Address.java
package model;
public class Address {
private int id;
private String city;
public int getId() {
return id;
}
private void setId(int id) {
this.id = id;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
(-1)Address.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="model"> <class name="Address" table="address" lazy="false"> <id name="id" type="integer" column="a_id"> <generator class="identity"/> </id> <property name="city" type="string" column="city"/> </class> </hibernate-mapping>
(2)Student.java
package model;
public class Student {
private int stuId;
private String stuName;
private Address address;
public int getStuId() {
return stuId;
}
private void setStuId(int stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
(-2)Student.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="model"> <class name="Student" table="student" lazy="false"> <id name="stuId" type="integer" column="s_id"> <generator class="identity"/> </id> <property name="stuName" type="string" column="s_name" /> <many-to-one name="address" class="Address" column="s_addr" not-null="true" cascade="save-update"/> </class> </hibernate-mapping>
5.获取Session的工具类:
HibernateUtil.java
package util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory=buildSessionFactory();
/** init sessionFactory */
private static SessionFactory buildSessionFactory() {
SessionFactory sessionFactory=null;
try{
sessionFactory=new Configuration().configure().buildSessionFactory();
}catch(Throwable te){
System.err.println("init sessionFactory Error:"+te);
te.printStackTrace();
}
return sessionFactory;
}
/** get session */
public static Session getSession(){
Session session=sessionFactory.openSession();
return session;
}
}
6.dao层:AddressDao.java和StudentDao.java
1).AddressDao操作address表:
package dao;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import util.HibernateUtil;
import model.Address;
public class AddressDao {
/** 增加地址记录; */
public void addAddress(Address addr){
Session session=HibernateUtil.getSession();
Transaction tx=null;
try{
tx=session.beginTransaction();
session.save(addr);
tx.commit();
}catch(HibernateException he){
tx.rollback();
he.printStackTrace();
}finally{
session.close();
}
}
/** 使用id查询一条记录; */
public Address getById(int aid){
Session session=HibernateUtil.getSession();
Transaction tx=null;
Address addr=null;
try{
tx=session.beginTransaction();
addr=(Address)session.load(Address.class,new Integer(aid));
// addr=(Address)session.get(Address.class,new Integer(aid));
tx.commit();
}catch(HibernateException he){
tx.rollback();
he.printStackTrace();
}finally{
session.close();
}
return addr;
}
/** 使用属性列查询所有匹配某个值的记录; */
public List<Address> getByField(String fld,String value){
List<Address> list=null;
Session session=HibernateUtil.getSession();
Transaction tx=null;
try{
tx=session.beginTransaction();
Query q=session.createQuery("from Address a where a."+fld+"=?");
q.setParameter(0, value);
list=q.list();
tx.commit();
}catch(HibernateException he){
tx.rollback();
he.printStackTrace();
}finally{
session.close();
}
return list;
}
/** 更新一条记录; */
public void updateAddress(int id,String city){
Session session=HibernateUtil.getSession();
Transaction tran=null;
try{
tran=session.beginTransaction();
Address addr=(Address)session.load(Address.class,new Integer(id));
addr.setCity(city);
session.flush();
tran.commit();
}catch(HibernateException he){
tran.rollback();
he.printStackTrace();
}finally{
session.close();
}
}
/** 使用like通配符删除指定列 */
public void deleteAddress(String fld,String val){
Session session=HibernateUtil.getSession();
Transaction tx=null;
try {
tx=session.beginTransaction();
/* 1.Criteria查询; */
Criteria criter=session.createCriteria(Address.class).add(Restrictions.like(fld,"%"+val+"%"));
Iterator<Address> it=criter.list().iterator();
/* 2.Query查询
Query q=session.createQuery("from Address as s where s.? like ?");
q.setParameter(0, fld);
q.setParameter(1, "%"+val+"%");
Iterator<Address> it=q.list().iterator(); */
/* 3.Native sql查询 表名和表中的列名而不是实体类的类名和属性名了
SQLQuery sqlq=session.createSQLQuery("SELECT * FROM address WHERE ? like ?").addEntity(Address.class);
sqlq.setParameter(0,fld);
sqlq.setParameter(1, "%"+val+"%");
Iterator<Address> it=sqlq.list().iterator(); */
while(it.hasNext()){
session.delete(it.next());
}
tx.commit();
} catch (HibernateException he) {
tx.rollback();
he.printStackTrace();
} finally {
session.close();
}
}
}
2).StudentDao操作student表
package dao;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import util.HibernateUtil;
import model.Student;
public class StudentDao {
/** 存入一条记录; */
public void addStudent(Student stu){
Session session=HibernateUtil.getSession();
Transaction tx=null;
try{
tx=session.beginTransaction();
session.save(stu);
tx.commit();
}catch(HibernateException he){
tx.rollback();
he.printStackTrace();
}finally{
session.close();
}
}
/** 根据id查询学生一条; */
public Student getStudentById(int sid){
Session session=HibernateUtil.getSession();
Transaction tx=null;
Student stu=null;
try{
tx=session.beginTransaction();
// stu=(Student)session.load(Student.class,new Integer(sid));
stu=(Student)session.get(Student.class,new Integer(sid));
tx.commit();
}catch(HibernateException he){
tx.rollback();
he.printStackTrace();
}finally{
session.close();
}
return stu;
}
/** 查询所有学生; */
public List<Student> getAll(){
List<Student> list=null;
Session session=HibernateUtil.getSession();
Transaction tx=null;
try{
tx=session.beginTransaction();
list=session.createQuery("from Student as a").list();
tx.commit();
}catch(HibernateException he){
tx.rollback();
he.printStackTrace();
}finally{
session.close();
}
return list;
}
/** 根据指定属性查询学生; */
public List<Student> getByField(String fld,String val){
List<Student> list=null;
Session session=HibernateUtil.getSession();
Transaction tx=null;
try{
tx=session.beginTransaction();
Query q=session.createQuery("from Student s where s."+fld+"=?");
q.setParameter(0,val);
list=q.list();
tx.commit();
}catch(HibernateException he){
tx.rollback();
he.printStackTrace();
}finally{
session.close();
}
return list;
}
/** 修改 stuName */
public void updateName(String oldName,String newName){
Session session=HibernateUtil.getSession();
Transaction tx=null;
try{
tx=session.beginTransaction();
/* 1.hibernate3新update */
Query q=session.createQuery("update Student set stuName=? where stuName=?");
q.setParameter(0, newName);
q.setParameter(1, oldName);
q.executeUpdate();
/* 2.查询删除!
Query q=session.createQuery("from Student s where s.stuName= ?");
q.setParameter(0, oldName);
Iterator<Student> it=q.list().iterator();
while(it.hasNext()){
Student s=it.next();
s.setStuName(newName);
session.update(s);
} */
tx.commit();
}catch(HibernateException he){
tx.rollback();
he.printStackTrace();
}finally{
session.close();
}
}
/** 删除指定列为指定值的记录; */
public void deleteStudent(String fld,String val){
Session session=HibernateUtil.getSession();
Transaction tx=null;
try {
tx=session.beginTransaction();
/* 4.hibernate3支持删除实体
Query q=session.createQuery("delete Student where "+fld+"=?");
q.setParameter(0, val);
q.executeUpdate(); */
/* 1.Criteria查询;
Criteria criter=session.createCriteria(Student.class).add(Restrictions.eq(fld,val));
Iterator<Student> it=criter.list().iterator(); */
/* 2.Query查询 */
Query q=session.createQuery("from Student as s where s."+fld+" = ?");
q.setParameter(0, val);
Iterator<Student> it=q.list().iterator();
/* 3.Native sql查询 表名和表中的列名而不是实体类的类名和属性名了
SQLQuery sqlq=session.createSQLQuery("delete FROM student WHERE "+fld+" = '"+val+"';").addEntity(Student.class);
sqlq.executeUpdate(); */
while(it.hasNext()){
Student s=it.next();
session.delete(s);
}
tx.commit();
} catch (HibernateException he) {
tx.rollback();
he.printStackTrace();
} finally {
session.close();
}
}
}
7.业务层:
1)AddressManager.java
package service;
import java.util.List;
import dao.AddressDao;
import model.Address;
public class AddressManager {
AddressDao dao=new AddressDao();
/** 增加地址记录; */
public void save(Address addr){
dao.addAddress(addr);
}
/** 使用id查询一条记录;*/
public Address getById(int id){
return dao.getById(id);
}
/** 使用属性列查询所有匹配某个值的记录; */
public List<Address> getByField(String fld,String val){
return dao.getByField(fld, val);
}
/**更新一条记录;*/
public void update(int id,String city){
dao.updateAddress(id,city);
}
/**使用like通配符删除指定列*/
public void deleteWithLike(String fld,String val){
dao.deleteAddress(fld, val);
}
}
2)StudentManager.java
package service;
import java.util.List;
import dao.StudentDao;
import model.Student;
public class StudentManager {
StudentDao dao=new StudentDao();
/** 存入一个学生实体; */
public void save(Student stu){
dao.addStudent(stu);
}
/** 根据id查询学生一条; */
public Student getById(int id){
return dao.getStudentById(id);
}
/** 根据指定属性查询学生; */
public List<Student> getByField(String fld,String val){
return dao.getByField(fld, val);
}
/** 修改 stuName */
public void update(String oldName,String newName){
dao.updateName(oldName, newName);
}
/** 删除指定列为指定值的记录; */
public void deleteByField(String fld,String val){
dao.deleteStudent(fld, val);
}
/** 查询所有学生; */
public List<Student> getAll(){
return dao.getAll();
}
}
8.Junit4测试:
1)测试业务类AddressManager
package service;
import java.util.List;
import model.Address;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class AddressManagerTest {
AddressManager man;
@Before public void init(){
man=new AddressManager();
}
@After public void close(){
man=null;
}
/** 增加地址记录; */
@Test public void testSave() {
Address addr=new Address();
addr.setCity("天津");
man.save(addr);
}
/** 使用id查询一条记录; */
@Test public void testGetById() {
Address addr=man.getById(3);
System.out.println(addr.getCity());
}
/** 使用属性列查询所有匹配某个值的记录; */
@Test public void testGetByField() {
List<Address> list=man.getByField("city","南京");
for(Address ad:list){
System.out.println(ad.getId()+"="+ad.getCity());
}
}
/** 更新一条记录; */
@Test public void testUpdate() {
man.update(10,"金陵");
}
/** 使用like通配符删除指定列 */
@Test public void testDeleteWithLike() {
man.deleteWithLike("city","京");
}
}
2)测试业务类StudentManager
package service;
import java.util.Iterator;
import java.util.List;
import model.Address;
import model.Student;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class StudentManagerTest {
StudentManager manager;
AddressManager aman;
@Before public void init(){
manager=new StudentManager();
aman=new AddressManager();
}
@After public void close(){
manager=null;
aman=null;
}
/** 测试存储一个学生 */
@Test public void testSave(){
Student s=new Student();
String ct="上海";
List<Address> list=aman.getByField("city",ct);
Address addr=null;
if(list.size()<1){
addr=new Address();
addr.setCity("上海");
s.setAddress(addr);
}else{
addr=list.get(0);
s.setAddress(addr);
}
s.setStuName("彬彬");
manager.save(s);
}
/** 根据id查询学生一条; */
@Test public void testGetById() {
Student s=manager.getById(20);
System.out.println(s.getStuName()+s.getAddress().getCity());
}
/** 根据指定属性查询学生; */
@Test public void testGetByField() {
Iterator<Student> it=manager.getByField("stuName","彬").iterator();
while(it.hasNext()){
Student student=it.next();
System.out.println(student.getStuId()+"-"+student.getStuName()+"-"+student.getAddress().getCity());
}
}
/** 查询所有学生; */
@Test public void testGetAll() {
Iterator<Student> it=manager.getAll().iterator();
while(it.hasNext()){
Student s=it.next();
System.out.println("id:"+s.getStuId()+"-"+"sname:"+s.getStuName()+"-"+"addr:"+s.getAddress().getCity());
}
}
/** 删除指定列为指定值的记录; */
@Test public void testDeleteByField() {
manager.deleteByField("stuName", "彬");
}
/** 修改 stuName */
@Test public void testReplaceName() {
manager.update("彬彬","彬");
}
}
9.over!
在javaeye做笔记可真不错!