多对一映射简例:
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做笔记可真不错!