一.一对多,多对一查询
例:县区表和街道表的查询
District(县区) 表:
Street(街道)表:
1.利用自动生成的DAO里面进行修改
2.获得session
3.使用session.get方法获取类反射
4.对数据进行增删改查操作
1.查询黄埔大道属于什么区
public void Select(){
Session session =super.getSession();
District ds = (District) session.get(District.class,(short)1);
Set st = ds.getStreets();
Iterator<Street> it = st.iterator();
while(it.hasNext()){
Street jd=it.next();
System.out.println(jd.getName()+jd.getDistrict().getName());
}
session.close();
}
2.通过街道获取县区
public void Select2(){
Session session =super.getSession();
Street st =(Street)session.get(Street.class,(short)1);
System.out.println(st.getName()+st.getDistrict().getName());
session.close();
}
3.新增县区
public void insert1(){
Session session =super.getSession();
District ds = new District();
ds.setName("黄浦区");
session.beginTransaction();
session.save(ds);
session.getTransaction().commit();
session.close();
}
4.新增县区并添加街道
public void insert2(){
Session session=super.getSession();
District ds = (District) session.get(District.class,(short)1);
Street st = new Street();
st.setName("中山大道");
st.setDistrict(ds);
session.beginTransaction();
session.save(st);
session.getTransaction().commit();
session.close();
}
5.删除街道从表数据
public void delete1(){
Session session=super.getSession();
Street st = (Street) session.get(Street.class,(short)3);
session.beginTransaction();
session.delete(st);
session.getTransaction().commit();
session.close();
}
6.删除县区并把所属街道也删掉
public void delete2(){
Session session =super.getSession();
District ds = (District) session.get(District.class, (short)3);
session.beginTransaction();
session.delete(ds);
session.getTransaction().commit();
session.close();
}
7.修改街道的ID成县区的ID
public void update1(){
Session session=super.getSession();
Street st=(Street) session.get(Street.class,(short)2);
District dt=(District) session.get(District.class,(short)2);
session.beginTransaction();
st.setDistrict(dt);
session.getTransaction().commit();
}
二.延迟加载
概念:查询一张表,如果不设置延迟加载就会查询该表有关联的其他表并进入内存,如需使用延迟加载需在xml.配置文件中设置
1.普通属性延迟加载(一般没用),所有属性都会延迟,写配置文件中在class后面 lazy="true"
2.部分延迟加载 写在set标签后面 lazy="xx";
//false所有都不延迟加载,true延迟加载xx.getxx().size再加载,extra超强延迟加载
3.代理延迟加载 设置在many to one标签 lazy="xx"
//false所有都不延迟加载,proxy(代理)延迟加载xx.getxx().size再加载,no-proxy(不代理)超强延迟加载
三.OpenSessionInView
概念:可以作用与过滤器负责调用Session,每次调用DAO方法就不用自己手动调用get.Session();
1.创建一个类并实现接口 Filter
2.修改dofilter方法,参考代码如下:
Configuration cg =new Configuration().configure();
SessionFactory factory=configuration.buildSessionFactory();
Session session=factory.openSession();
session.beginTransaction();
arg2.doFilter(arg0,arg1);
session.getTranction().comfig();
注:通过web.xml进行配置监听器