------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

本篇博客将讲述Hibernate中的关联查询,及其级联(cascade)操作,以及指定哪一方维护关联关系的(inverse)

一,讲述目录如下:

  1.单向一对多:(增加一个区县及其它以下的对应街道)

  2.单项一对多:(查询一个区县,以及它下面所有的对应街道)

  3.单项多对一:(查询一个指定的街道,并同时展示出其对应的区县)

  4.双向一对多(多对一):(值得注意:toString()套路不对容易引发错误Error------StackOverflowError)

  5.inverse的使用和详解:(指定哪一方来维护关联关系)

  6.级联删除:(删除主表中的数据,同时将会干掉外键是它的数据,慎用!!!!!!)

  注:其实还想讲一下多对多,但是没有准备,下篇博客会详细总结;

二,单向一对多:(增加一个区县及其它以下的对应街道)

  1.简介:

    我会在此案例下做好全部准备工作,其他的案例会在此案例上做略改操作:

  2.实体类的准备:

    2.1:District区县实体类:

  1. package cn.dawn.day03.entity;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. /**
  7. * Created by Dawn on 2018/5/30.
  8. */
  9.  
  10. /*区县*/
  11. public class District {
  12. private Integer id;//区县id
  13. private String name;//区县名称
  14.  
  15. /*一个区县对应多个街道*/
  16. private List<Street> streets=new ArrayList<Street>();
  17.  
  18. @Override
  19. public String toString() {
  20. return "District{" +
  21. "id=" + id +
  22. ", name='" + name + '\'' +
  23. ", streets=" + streets +
  24. '}';
  25. }
  26.  
  27. public Integer getId() {
  28. return id;
  29. }
  30.  
  31. public void setId(Integer id) {
  32. this.id = id;
  33. }
  34.  
  35. public String getName() {
  36. return name;
  37. }
  38.  
  39. public void setName(String name) {
  40. this.name = name;
  41. }
  42.  
  43. public List<Street> getStreets() {
  44. return streets;
  45. }
  46.  
  47. public void setStreets(List<Street> streets) {
  48. this.streets = streets;
  49. }
  50.  
  51. public District() {
  52. }
  53.  
  54. public District(Integer id, String name, List<Street> streets) {
  55. this.id = id;
  56. this.name = name;
  57. this.streets = streets;
  58. }
  59.  
  60. public District(Integer id, String name) {
  61. this.id = id;
  62. this.name = name;
  63. }
  64. }

    2.2:Street街道类:

  1. package cn.dawn.day03.entity;
  2.  
  3. /**
  4. * Created by Dawn on 2018/5/30.
  5. */
  6. /*街道类*/
  7. public class Street {
  8. private Integer id;//街道id
  9. private String name;//街道名称
  10.  
  11. private District district;
  12.  
  13. @Override
  14. public String toString() {
  15. return "Street{" +
  16. "id=" + id +
  17. ", name='" + name + '\'' +
  18. ", district=" + district +
  19. '}';
  20. }
  21.  
  22. public Street() {
  23. }
  24.  
  25. public Street(Integer id, String name) {
  26. this.id = id;
  27. this.name = name;
  28. }
  29.  
  30. public District getDistrict() {
  31. return district;
  32. }
  33.  
  34. public void setDistrict(District district) {
  35. this.district = district;
  36. }
  37.  
  38. public Integer getId() {
  39. return id;
  40. }
  41.  
  42. public void setId(Integer id) {
  43. this.id = id;
  44. }
  45.  
  46. public String getName() {
  47. return name;
  48. }
  49.  
  50. public void setName(String name) {
  51. this.name = name;
  52. }
  53. }

  3.hbm文件的准备:

    3.1:District.hbm.xml文件的配置:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="cn.dawn.day03.entity">
  6. <!--如果上面指定package的话,class的name就不必写全类名-->
  7. <!--lazy:是否懒加载(延迟加载) 默认值是true,延迟加载-->
  8. <!--<class name="Teacher">-->
  9. <!--直接加载-->
  10. <class name="District" lazy="false">
  11. <!--主键-->
  12. <id name="id" column="id">
  13. <!--主键生成策咯 assigned程序员自己创建-->
  14. <!--identity是mysql里的自增,一会做增加操作不必再给主键赋值-->
  15. <!--increment是先查最大的主键列,在下一条给主键加一-->
  16. <!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>-->
  17. <generator class="assigned"></generator>
  18. </id>
  19. <property name="name" column="name"></property>
  20. <!-- 配置一对多的关联管理
  21. name:关联关系属性名
  22. column:数据库中对应的外键
  23. class:关联关系的类型
  24. cascade:对当前对象操作的时候,是否影响关联对象
  25. inverse="true": 放弃与数据库的交互
  26. -->
  27. <bag name="streets" cascade="save-update" >
  28. <key column="districtid"></key>
  29. <one-to-many class="Street"></one-to-many>
  30. </bag>
  31. </class>
  32. </hibernate-mapping>

    3.2:Street.hbm.xml文件配置:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="cn.dawn.day03.entity">
  6. <!--如果上面指定package的话,class的name就不必写全类名-->
  7. <!--lazy:是否懒加载(延迟加载) 默认值是true,延迟加载-->
  8. <!--<class name="Teacher">-->
  9. <!--直接加载-->
  10. <class name="Street" lazy="false">
  11. <!--主键-->
  12. <id name="id" column="id">
  13. <!--主键生成策咯 assigned程序员自己创建-->
  14. <!--identity是mysql里的自增,一会做增加操作不必再给主键赋值-->
  15. <!--increment是先查最大的主键列,在下一条给主键加一-->
  16. <!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>-->
  17. <generator class="assigned"></generator>
  18. </id>
  19. <property name="name" column="name"></property>
  20. <!--配置多对一的关联关系
  21. name: 本类中 关联关系的属性名
  22. class:关联关系的类型
  23. column:在数据库中两个表的外键
  24. -->
  25. <!--<many-to-one name="district" class="District" column="districtId"/>-->
  26. </class>
  27. </hibernate-mapping>

  4.单测方法,增加一个区县及其它以下的对应街道:

  1. @Test
  2. /**
  3. * 单项一对多,增加一个区县及其他下面的对应街道
  4. * 千万注意,在hbm中要加:级联
  5. * cascade="save-update"
  6. */
  7. public void t1OneToMany(){
  8. /*创建三个街道*/
  9. Street street1=new Street(1,"海淀1街");
  10. Street street2=new Street(2,"海淀2街");
  11. Street street3=new Street(3,"海淀3街");
  12. List<Street> streets=new ArrayList<Street>();
  13. streets.add(street1);
  14. streets.add(street2);
  15. streets.add(street3);
  16. /*添加一个区到数据库*/
  17. District district=new District(1,"测试海淀区");
  18. /*也可以从数据库中获取一个区,推荐第二种*/
  19. /*District district = session.get(District.class, 1);*/
  20. district.setStreets(streets);
  21.  
  22. /*新增街道*/
  23. session.save(district);
  24. tr.commit();
  25.  
  26. /*执行结果
  27. Hibernate: create table District (id integer not null, name varchar(255), primary key (id)) engine=MyISAM
  28. Hibernate: create table Street (id integer not null, name varchar(255), districtid integer, primary key (id)) engine=MyISAM
  29. Hibernate: alter table Street add constraint FKjuba2team1j6124qeurjyblk1 foreign key (districtid) references District (id)
  30. Hibernate: select street_.id, street_.name as name2_1_ from Street street_ where street_.id=?
  31. Hibernate: select street_.id, street_.name as name2_1_ from Street street_ where street_.id=?
  32. Hibernate: select street_.id, street_.name as name2_1_ from Street street_ where street_.id=?
  33. Hibernate: insert into District (name, id) values (?, ?)
  34. Hibernate: insert into Street (name, id) values (?, ?)
  35. Hibernate: insert into Street (name, id) values (?, ?)
  36. Hibernate: insert into Street (name, id) values (?, ?)
  37. Hibernate: update Street set districtid=? where id=?
  38. Hibernate: update Street set districtid=? where id=?
  39. Hibernate: update Street set districtid=? where id=?
  40. */
  41. }

三,单项一对多:(查询一个区县,以及它下面所有的对应街道)

  1.在原有代码不改变的情况下,做如下操作:

  2.查询一个区县,以及它下面所有的对应街道:

  1. @Test
  2. /*查询指定区县下所有的街道*/
  3. public void t2selectStreetByDistrict(){
  4. /*获取id为1的区县*/
  5. District district=session.get(District.class,1);
  6. /*获取区县下所有的街道*/
  7. List<Street> streets = district.getStreets();
  8. for (Street street:streets) {
  9. System.out.println(street);
  10. }
  11.  
  12. /*运行结果
  13. Hibernate: alter table Street add constraint FKjuba2team1j6124qeurjyblk1 foreign key (districtid) references District (id)
  14. Hibernate: select district0_.id as id1_0_0_, district0_.name as name2_0_0_ from District district0_ where district0_.id=?
  15. Hibernate: select streets0_.districtid as district3_1_0_, streets0_.id as id1_1_0_, streets0_.id as id1_1_1_, streets0_.name as name2_1_1_ from Street streets0_ where streets0_.districtid=?
  16. Street{id=1, name='海淀1街'}
  17. Street{id=2, name='海淀2街'}
  18. Street{id=3, name='海淀3街'}
  19. * */
  20. }

四,单项多对一:(查询一个指定的街道,并同时展示出其对应的区县)

  1.先把二.3.3.1中District.hbm.xml把  <bag节点注释掉,或者直接干掉>

  1. <!--<bag name="streets" cascade="save-update" >
  2. <key column="districtid"></key>
  3. <one-to-many class="Street"></one-to-many>
  4. </bag>-->

  2.其实应该再多的一方,植入一个少的一方的对象,但是我在准备工作中就已经做过了

  1. /*街道类*/
  2. public class Street {
  3. private Integer id;//街道id
  4. private String name;//街道名称
  5.  
  6. /*重点:::::::::*/
  7. private District district;

  3.在Street.hbm.xml配置文件中,把我注释掉的那个<many-to-one>的节点放开:

  1.      <!--配置多对一的关联关系
  2. name: 本类中 关联关系的属性名
  3. class:关联关系的类型
  4. column:在数据库中两个表的外键
  5. -->
  6. <many-to-one name="district" class="District" column="districtId"/>

  4.书写测试方法:查询一个指定的街道,并同时展示出其对应的区县:

  1. @Test
  2. /*查询指定街道所对应的县区*/
  3. /*多对一*/
  4. /*先把之前配置的那个干掉*/
  5. public void t3ManyToOne(){
  6. /*需要在多的一方的实体类加入少的一方对象,并且在hbm配置manytoone*/
  7. Street street = session.get(Street.class, 1);
  8. System.out.println(street);
  9.  
  10. /*
  11. Hibernate: alter table Street add constraint FKfch89j84iailpfqs5bpkj2rs0 foreign key (districtId) references District (id)
  12. Hibernate: select street0_.id as id1_1_0_, street0_.name as name2_1_0_, street0_.districtId as district3_1_0_ from Street street0_ where street0_.id=?
  13. Hibernate: select district0_.id as id1_0_0_, district0_.name as name2_0_0_ from District district0_ where district0_.id=?
  14. Street{id=1, name='海淀1街', district=District{id=1, name='测试海淀区', streets=[]}}
  15. */
  16. }

五,双向一对多(多对一):(值得注意:toString()套路不对容易引发错误Error------StackOverflowError)

  1.解释:

    他们的的关系是相互的,都要参与维护关联关系

  2.讲四中注释掉District.hbm.xml中的<bag>标签再放开

  1. <bag name="streets" cascade="save-update" >
  2. <key column="districtid"></key>
  3. <one-to-many class="Street"></one-to-many>
  4. </bag>

  3.值得注意的是,需要修改toString()方法,否者他会互相调用,出现堆栈溢出的错误

  4.先不改toString()的时候,书写测试方法:(查询一个街道及其对应的区县)

  1. @Test
  2. /*双向的一对多,就是关系是相互的!!!!!!!!*/
  3. /*将t3干掉的配置再加回去*/
  4. public void t4twoway(){
  5. Street street = session.get(Street.class, 1);
  6. System.out.println(street);
  7.  
  8. /*注:toString需要做个手段,否则互相调用的话就死循环,堆栈溢出java.lang.StackOverflowError*/
  9.  
  10. /*
  11. Hibernate: alter table Street add constraint FKfch89j84iailpfqs5bpkj2rs0 foreign key (districtId) references District (id)
  12. Hibernate: select street0_.id as id1_1_0_, street0_.name as name2_1_0_, street0_.districtId as district3_1_0_ from Street street0_ where street0_.id=?
  13. Hibernate: select district0_.id as id1_0_0_, district0_.name as name2_0_0_ from District district0_ where district0_.id=?
  14. Hibernate: select streets0_.districtid as district3_1_0_, streets0_.id as id1_1_0_, streets0_.id as id1_1_1_, streets0_.name as name2_1_1_, streets0_.districtId as district3_1_1_ from Street streets0_ where streets0_.districtid=?
  15.  
  16. java.lang.StackOverflowError
  17. ......
  18. * */
  19. }

  5.修改任意一toString()方法,使其不再互相无节制的调用:

  1. /*区县*/
  2. public class District {
  3. private Integer id;//区县id
  4. private String name;//区县名称
  5.  
  6. /*一个区县对应多个街道*/
  7. private List<Street> streets=new ArrayList<Street>();
  8.  
  9. @Override
  10. public String toString() {
  11. return "District{" +
  12. "id=" + id +
  13. ", name='" + name + '\'' +
  14. ", streets=" + streets.size() +
  15. '}';
  16. }

  6.重新执行4中的代码,发现不会再出现错误,成功查询

六,inverse的使用和详解:(指定哪一方来维护关联关系)

  1.讲解:

    (1).Hibernate中的规则是,多的一方必须维护关联关系,所以,我们只能修改一的一方(one-to-many)

    (2).inverse默认值为false,就是与数据库交互,会维护关联关系,如果为了性能的提升,我们可以放弃一的一方与数据库交互,即放弃维护关联关系,将值改为true即可;

  2.District.hbm.xml中的配置修改的如下:

  1. <!-- 配置一对多的关联管理
  2. name:关联关系属性名
  3. column:数据库中对应的外键
  4. class:关联关系的类型
  5. cascade:对当前对象操作的时候,是否影响关联对象
  6. inverse="true": 放弃与数据库的交互
  7. -->
  8. <bag name="streets" cascade="save-update" inverse="false">
  9. <key column="districtid"></key>
  10. <one-to-many class="Street"></one-to-many>
  11. </bag>

  3.单测方法(先测试一的一方维护关联关系):

  1. @Test
  2. public void t5inverse(){
  3. //创建区县
  4. District district=new District(2,"大兴区");
  5. //创建街道
  6. Street street1=new Street(4,"大兴3街道");
  7. Street street2=new Street(5,"大兴4街道");
  8. //把街道放进区县的街道集合中
  9. district.getStreets().add(street1);
  10. district.getStreets().add(street2);
  11. //新增区县
  12. session.save(district);
  13. tr.commit();
  14. /**
  15. * 产生了8条sql语句! 发现 后面两条update 是无用功!!!!
  16. Hibernate: alter table Street add constraint FKfch89j84iailpfqs5bpkj2rs0 foreign key (districtId) references District (id)
  17. Hibernate: select street_.id, street_.name as name2_1_, street_.districtId as district3_1_ from Street street_ where street_.id=?
  18. Hibernate: select street_.id, street_.name as name2_1_, street_.districtId as district3_1_ from Street street_ where street_.id=?
  19. Hibernate: insert into District (name, id) values (?, ?)
  20. Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
  21. Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
  22. Hibernate: update Street set districtid=? where id=?
  23. Hibernate: update Street set districtid=? where id=?
  24.  
  25. 3条insert是 District产生的!
  26. 为什么会产生两条update?? Street!
  27. hibernate中 规定:
  28. 01.多的一方 many-to-one,必须去维护双方的关系!
  29. 因为many-to-one压根就没有inverse这个属性!
  30. 02.inverse默认为false! 不反转! 我来维护!
  31. 03.必须在一的一方 设置 inverse="true" 放弃维护的权力!
  32. 维护===》是否与数据库产生交互!
  33. */
  34. }

  4.将inverse改为true,放弃维护的权力,再执行刚才的代码,发现:

  1. /*修改inverse=true,删除刚才添加的数据,再次执行单测*/
  2. /*
  3. Hibernate: alter table Street add constraint FKfch89j84iailpfqs5bpkj2rs0 foreign key (districtId) references District (id)
  4. Hibernate: select street_.id, street_.name as name2_1_, street_.districtId as district3_1_ from Street street_ where street_.id=?
  5. Hibernate: select street_.id, street_.name as name2_1_, street_.districtId as district3_1_ from Street street_ where street_.id=?
  6. Hibernate: insert into District (name, id) values (?, ?)
  7. Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
  8. Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
  9. 发现后面的update没有了
  10. */

七,级联删除(慎用慎用慎用!!!!!!!!!!!!!!!!!!!!!!!)

  1.讲述:

    如果设置完毕后,当干掉主键所在的那张表中的一台记录,它所关联的外键的那一行记录也会被干掉,所以说很危险,不要使用!!

  2.设置District.hbm.xml中的cascade="delete"和inverse="false"(或者inverse不配置)

  1. <bag name="streets" cascade="delete" inverse="false">
  2. <key column="districtid"></key>
  3. <one-to-many class="Street"></one-to-many>
  4. </bag>

  3.书写测试代码,比如删一个区县:

  1. @Test
  2. /*级联删除*/
  3. /*cascade="delete" inverse="false"*/
  4. public void t6deleteMapping(){
  5. /*cascade="delete" inverse="false"记得改这个参数*/
  6. /*获取id为2的区县*/
  7. District district=session.get(District.class,2);
  8. /*删除*/
  9. session.delete(district);
  10.  
  11. tr.commit();
  12.  
  13. /*
  14. Hibernate: alter table Street add constraint FKfch89j84iailpfqs5bpkj2rs0 foreign key (districtId) references District (id)
  15. Hibernate: select district0_.id as id1_0_0_, district0_.name as name2_0_0_ from District district0_ where district0_.id=?
  16. Hibernate: select streets0_.districtid as district3_1_0_, streets0_.id as id1_1_0_, streets0_.id as id1_1_1_, streets0_.name as name2_1_1_, streets0_.districtId as district3_1_1_ from Street streets0_ where streets0_.districtid=?
  17. Hibernate: update Street set districtid=null where districtid=?
  18. Hibernate: delete from Street where id=?
  19. Hibernate: delete from Street where id=?
  20. Hibernate: delete from District where id=?
  21. * */
  22. /*他会把俩张表的都干掉了,所以,慎用!!!!!!!!!!!!!*/
  23. }

作者:晨曦Dawn

转载请注明出处:https://www.cnblogs.com/DawnCHENXI/p/9123184.html

如果有错误请您指出,感激不尽!!!!!!!!!!!!!!!!

Hibernate-ORM:11.Hibernate中的关联查询的更多相关文章

  1. laravel 中with关联查询限定查询字段

    学习了下laravel5.6框架,果然很优雅,比如ActiveJieSuan model中作如下关联:(laravel模型关联关系可以查看https://laravelacademy.org/post ...

  2. Entity Framework入门教程(11)---EF6中的异步查询和异步保存

    EF6中的异步查询和异步保存 在.NET4.5中介绍了异步操作,异步操作在EF中也很有用,在EF6中我们可以使用DbContext的实例进行异步查询和异步保存. 1.异步查询 下边是一个通过L2E语法 ...

  3. Hibernate学习11——Hibernate 高级配置(连接池、log4j)

    第一节:配置数据库连接池 这里配置c3p0连接池,需要的jar包: jar包位于hibernate压缩包的:hibernate-release-4.3.5.Final\lib\optional\c3p ...

  4. Atitit.Hibernate于Criteria 使用汇总and 关系查询 and 按照子对象查询 o9o

    Atitit.Hibernate于Criteria 使用总结and 关联查询 and 依照子对象查询 o9o 1. Criteria,,Criterion ,, 1 <2. 基本的对象黑头配置磊 ...

  5. MyBatis:一对一关联查询

    MyBatis从入门到放弃三:一对一关联查询 前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是 ...

  6. MyBatis从入门到放弃三:一对一关联查询

    前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是使用association属性和resultM ...

  7. MyBatis初级实战之六:一对多关联查询

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. MyBatis 实践 -动态SQL/关联查询

    MyBatis 实践 标签: Java与存储 动态SQL 动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装. if 对查询条件进行判断,如果输入参数不为空才进行查询条 ...

  9. Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o

    Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o 1. Criteria,,Criterion ,, 1 <2. 主要的对象黑头配置磊 ...

随机推荐

  1. IOS 触摸事件的处理

    触摸事件的处理1.判断触摸点在谁身上: 调用所有UI控件的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 2.pointIn ...

  2. c++11之为什么C++11引入了std::ref?

    C++本身有引用(&),为什么C++11又引入了std::ref? 主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用.如下例子: #include <f ...

  3. libevent evbuffer参考文章

    https://blog.csdn.net/FreeeLinux/article/details/52799951 http://cache.baiducontent.com/c?m=9d78d513 ...

  4. POJ-1836 Alignment---LIS

    题目链接: https://cn.vjudge.net/problem/POJ-1836 题目大意: 题意:令到原队列的最少士兵出列后,使得新队列任意一个士兵都能看到左边或者右边的无穷远处.就是使新队 ...

  5. UOJ 48 次最大公约数

    次最大公约数 = gcd / 其中一个数质因数中最小的. gcd(42,12) = 6;    div(42) = 2*3*7   div(12) = 2^2*3 sgcd(42,12) = 6 / ...

  6. CF235C 【Cyclical Quest】

    厚颜无耻的发一篇可能是全网最劣解法 我们发现要求给定的串所有不同的循环同构出现的次数,可以直接暴力啊 因为一个长度为\(n\)的串,不同的循环同构次数显然是不会超过\(n\)的,所以我们可以直接对每一 ...

  7. iOS 代码混淆--pch实现

    之前实现代码的混淆一般是使用sh脚本,不过也是需要把一写需要混淆的方法写到一个文件中(除非是使用特定的命名规范统一混淆), 现在发现,实现代码的混淆pch 文件就可以轻松完成! 1,在新建的工程中 创 ...

  8. 【luogu P3979 遥远的国度】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3979 除了换根操作都是裸的树剖 所以换根时考虑: 1.我查询的根等于换的根:无影响 2.我查询的根是换的根的 ...

  9. android:TableLayout表格布局详解

    http://blog.csdn.net/justoneroad/article/details/6835915 这篇博文包括的内容:1.TableLayout简介2.TableLayout行列数的确 ...

  10. EJB结合struts2创建项目、发布jboss服务器和访问、父类(BaseDaoImpl)的封装

    一.环境搭建: 1.准备jboss服务器,将对应数据库的xml配置好放到jboss的发布目录下. <?xml version="1.0" encoding="UTF ...