对比着学
hibernate的关联关系
一对多(order、orderIte)
前提:在对应的类中添加引用
一方:order
order. hbm. xml
< set>
< key. . .
< one- to- many . . .
< / set>
多方: orderItem
< many- to- one . . .
多对多:(可以拆分为两个一对多book CateGory book_Category)
多方: book
< set table= "" . .
< key . . .
< many- to- many . . .
< / set>
多方:Category
mybatis的关联关系
一对多(order、orderIte)
前提:在对应的类中添加引用
准备工作
使用逆向生成工具生成实体类以及配置文件
< ? xml version= "1.0" encoding= "UTF-8" ? >
< ! DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
< generatorConfiguration>
< ! -- 引入配置文件 -- >
< properties resource= "jdbc.properties" / >
< ! -- 指定数据库jdbc驱动jar包的位置-- >
< classPathEntry location= "D:\\Maven\\repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar" / >
< ! -- 一个数据库一个context -- >
< context id= "infoGuardian" >
< ! -- 注释 -- >
< commentGenerator>
< property name= "suppressAllComments" value= "true" / > < ! -- 是否取消注释 -- >
< property name= "suppressDate" value= "true" / > < ! -- 是否生成注释代时间戳 -- >
< / commentGenerator>
< ! -- jdbc连接 -- >
< jdbcConnection driverClass= "${jdbc.driver}"
connectionURL= "${jdbc.url}" userId= "${jdbc.username}" password= "${jdbc.password}" / >
< ! -- 类型转换 -- >
< javaTypeResolver>
< ! -- 是否使用bigDecimal, false 可自动转化以下类型(Long, Integer, Short, etc. ) -- >
< property name= "forceBigDecimals" value= "false" / >
< / javaTypeResolver>
< ! -- 01 指定javaBean生成的位置 -- >
< ! -- targetPackage:指定生成的model生成所在的包名 -- >
< ! -- targetProject:指定在该项目下所在的路径 -- >
< javaModelGenerator targetPackage= "com.onlyK.ssm.model"
targetProject= "src/main/java" >
< ! -- 是否允许子包,即targetPackage. schemaName. tableName -- >
< property name= "enableSubPackages" value= "false" / >
< ! -- 是否对model添加构造函数 -- >
< property name= "constructorBased" value= "true" / >
< ! -- 是否针对string类型的字段在set的时候进行trim调用 -- >
< property name= "trimStrings" value= "false" / >
< ! -- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -- >
< property name= "immutable" value= "false" / >
< / javaModelGenerator>
< ! -- 02 指定sql映射文件生成的位置 -- >
< sqlMapGenerator targetPackage= "com.onlyK.ssm.mapper"
targetProject= "src/main/java" >
< ! -- 是否允许子包,即targetPackage. schemaName. tableName -- >
< property name= "enableSubPackages" value= "false" / >
< / sqlMapGenerator>
< ! -- 03 生成XxxMapper接口 -- >
< ! -- type= "ANNOTATEDMAPPER" , 生成Java Model 和基于注解的Mapper对象 -- >
< ! -- type= "MIXEDMAPPER" , 生成基于注解的Java Model 和相应的Mapper对象 -- >
< ! -- type= "XMLMAPPER" , 生成SQLMap XML文件和独立的Mapper接口 -- >
< javaClientGenerator targetPackage= "com.onlyK.ssm.mapper"
targetProject= "src/main/java" type= "XMLMAPPER" >
< ! -- 是否在当前路径下新加一层schema, false 路径com. oop. eksp. user. model, true : com. oop. eksp. user. model. [ schemaName] -- >
< property name= "enableSubPackages" value= "false" / >
< / javaClientGenerator>
< ! -- 配置表信息 -- >
< ! -- schema即为数据库名 -- >
< ! -- tableName为对应的数据库表 -- >
< ! -- domainObjectName是要生成的实体类 -- >
< ! -- enable* ByExample是否生成 example类 -- >
< ! -- < table schema= "" tableName= "t_book" domainObjectName= "Book" -- >
< ! -- enableCountByExample= "false" enableDeleteByExample= "false" -- >
< ! -- enableSelectByExample= "false" enableUpdateByExample= "false" > -- >
< ! -- & lt; ! & ndash; 忽略列,不生成bean 字段 & ndash; & gt; -- >
< ! -- & lt; ! & ndash; < ignoreColumn column= "FRED" / > & ndash; & gt; -- >
< ! -- & lt; ! & ndash; 指定列的java数据类型 & ndash; & gt; -- >
< ! -- & lt; ! & ndash; < columnOverride column= "LONG_VARCHAR_FIELD" jdbcType= "VARCHAR" / > & ndash; & gt; -- >
< ! -- < / table> -- >
< table schema= "" tableName= "t_hibernate_order" domainObjectName= "Order"
enableCountByExample= "false" enableDeleteByExample= "false"
enableSelectByExample= "false" enableUpdateByExample= "false" >
< ! -- 忽略列,不生成bean 字段 -- >
< ! -- < ignoreColumn column= "FRED" / > -- >
< ! -- 指定列的java数据类型 -- >
< ! -- < columnOverride column= "LONG_VARCHAR_FIELD" jdbcType= "VARCHAR" / > -- >
< / table>
< table schema= "" tableName= "t_hibernate_order_item" domainObjectName= "OrderItem"
enableCountByExample= "false" enableDeleteByExample= "false"
enableSelectByExample= "false" enableUpdateByExample= "false" >
< ! -- 忽略列,不生成bean 字段 -- >
< ! -- < ignoreColumn column= "FRED" / > -- >
< ! -- 指定列的java数据类型 -- >
< ! -- < columnOverride column= "LONG_VARCHAR_FIELD" jdbcType= "VARCHAR" / > -- >
< / table>
< table schema= "" tableName= "t_hibernate_book" domainObjectName= "Hbook"
enableCountByExample= "false" enableDeleteByExample= "false"
enableSelectByExample= "false" enableUpdateByExample= "false" >
< ! -- 忽略列,不生成bean 字段 -- >
< ! -- < ignoreColumn column= "FRED" / > -- >
< ! -- 指定列的java数据类型 -- >
< ! -- < columnOverride column= "LONG_VARCHAR_FIELD" jdbcType= "VARCHAR" / > -- >
< / table>
< table schema= "" tableName= "t_hibernate_category" domainObjectName= "Category"
enableCountByExample= "false" enableDeleteByExample= "false"
enableSelectByExample= "false" enableUpdateByExample= "false" >
< ! -- 忽略列,不生成bean 字段 -- >
< ! -- < ignoreColumn column= "FRED" / > -- >
< ! -- 指定列的java数据类型 -- >
< ! -- < columnOverride column= "LONG_VARCHAR_FIELD" jdbcType= "VARCHAR" / > -- >
< / table>
< table schema= "" tableName= "t_hibernate_book_category" domainObjectName= "HbookCategory"
enableCountByExample= "false" enableDeleteByExample= "false"
enableSelectByExample= "false" enableUpdateByExample= "false" >
< ! -- 忽略列,不生成bean 字段 -- >
< ! -- < ignoreColumn column= "FRED" / > -- >
< ! -- 指定列的java数据类型 -- >
< ! -- < columnOverride column= "LONG_VARCHAR_FIELD" jdbcType= "VARCHAR" / > -- >
< / table>
< / context>
< / generatorConfiguration>
效果图
创建OrderVo
package com. onlyK. ssm. model. vo;
import com. onlyK. ssm. model. Order;
import com. onlyK. ssm. model. OrderItem;
import java. util. List;
public class OrderVo extends Order {
private List< OrderItem> OrderItem;
public List< com. onlyK. ssm. model. OrderItem> getOrderItem ( ) {
return OrderItem;
}
public void setOrderItem ( List< com. onlyK. ssm. model. OrderItem> orderItem) {
OrderItem = orderItem;
}
}
创建OrderItemVo
package com. onlyK. ssm. model. vo;
import com. onlyK. ssm. model. Order;
import com. onlyK. ssm. model. OrderItem;
public class OrderItemVo extends OrderItem {
private Order order;
public Order getOrder ( ) {
return order;
}
public void setOrder ( Order order) {
this . order = order;
}
}
关联关系一对多
编写映射关系
OrderMapper.xml
< ! -- 关联关系映射 一对多中的一这方 -- >
< resultMap id= "OrderVoMap" type= "com.onlyK.ssm.model.vo.OrderVo" >
< result property= "orderId" column= "order_id" > < / result>
< result property= "orderNo" column= "order_no" > < / result>
< collection property= "orderItems" ofType= "com.onlyK.ssm.model.OrderItem" >
< result property= "orderItemId" column= "order_item_id" > < / result>
< result property= "productId" column= "product_id" > < / result>
< result property= "quantity" column= "quantity" > < / result>
< result property= "oid" column= "oid" > < / result>
< / collection>
< / resultMap>
OrderItemMapper.xml
< ! -- 关联关系映射 一对多中的多-- >
< resultMap id= "OrderItemVoMap" type= "com.onlyK.ssm.model.vo.OrderItemVo" >
< result property= "orderItemId" column= "order_item_id" > < / result>
< result property= "productId" column= "product_id" > < / result>
< result property= "quantity" column= "quantity" > < / result>
< result property= "oid" column= "oid" > < / result>
< association property= "order" javaType= "com.onlyK.ssm.model.Order" >
< result property= "orderId" column= "order_id" > < / result>
< result property= "orderNo" column= "order_no" > < / result>
< / association>
< / resultMap>
编写测试方法
OrderMapper.xml
< select id= "queryOrderVoByOrderId" resultMap= "OrderVoMap" parameterType= "java.lang.Integer" >
select * from t_hibernate_order o, t_hibernate_order_item oi
where o. order_id = oi. oid
and o. order_id = #{ orderId}
< / select>
OrderItemMapper.xml
< select id= "queryOrderItemVoByOrderItemId" resultMap= "OrderItemVoMap" parameterType= "java.lang.Integer" >
select * from t_hibernate_order o, t_hibernate_order_item oi
where o. order_id = oi. oid
and oi. order_item_id = #{ orderItemId}
< / select>
OneToManyService.java
package com. onlyK. ssm. service;
import com. onlyK. ssm. model. vo. OrderItemVo;
import com. onlyK. ssm. model. vo. OrderVo;
import org. apache. ibatis. annotations. Param;
public interface OneToManyService {
OrderVo queryOrderVoByOrderId ( Integer orderId) ;
OrderItemVo queryOrderItemVoByOrderItemId ( Integer orderItemId) ;
}
OneToManyServiceImpl.java
package com. onlyK. ssm. service;
import com. onlyK. ssm. mapper. OrderItemMapper;
import com. onlyK. ssm. mapper. OrderMapper;
import com. onlyK. ssm. model. vo. OrderItemVo;
import com. onlyK. ssm. model. vo. OrderVo;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. stereotype. Service;
@Service
public class OneToManyServiceImpl implements OneToManyService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderItemMapper orderItemMapper;
@Override
public OrderVo queryOrderVoByOrderId ( Integer orderId) {
return orderMapper. queryOrderVoByOrderId ( orderId) ;
}
@Override
public OrderItemVo queryOrderItemVoByOrderItemId ( Integer orderItemId) {
return orderItemMapper. queryOrderItemVoByOrderItemId ( orderItemId) ;
}
}
测试
OneToManyServiceImplTest.java
package com. onlyK. ssm. service;
import com. onlyK. ssm. SpringBaseTestCase;
import com. onlyK. ssm. model. OrderItem;
import com. onlyK. ssm. model. vo. OrderItemVo;
import com. onlyK. ssm. model. vo. OrderVo;
import org. junit. Test;
import org. springframework. beans. factory. annotation. Autowired;
import static org. junit. Assert. * ;
public class OneToManyServiceImplTest extends SpringBaseTestCase {
@Autowired
private OneToManyService oneToManyService;
@Test
public void queryOrderVoByOrderId ( ) {
OrderVo orderVo= oneToManyService. queryOrderVoByOrderId ( 8 ) ;
System. out. println ( orderVo. getOrderNo ( ) ) ;
for ( OrderItem orderItem : orderVo. getOrderItem ( ) ) {
System. out. println ( orderItem) ;
}
}
@Test
public void queryOrderItemVoByOrderItemId ( ) {
OrderItemVo orderItemVo = oneToManyService. queryOrderItemVoByOrderItemId ( 36 ) ;
System. out. println ( orderItemVo) ;
System. out. println ( orderItemVo. getOrder ( ) . getOrderNo ( ) ) ;
}
}
结果一
结果二
关联关系多对多
准备工作
创建CategoryVo
package com. onlyK. ssm. model. vo;
import com. onlyK. ssm. model. Category;
import com. onlyK. ssm. model. Hbook;
import java. util. List;
public class CategoryVo extends Category {
private List< Hbook> hbooks;
public List< Hbook> getHbooks ( ) {
return hbooks;
}
public void setHbooks ( List< Hbook> hbooks) {
this . hbooks = hbooks;
}
}
创建HbookVo
package com. onlyK. ssm. model. vo;
import com. onlyK. ssm. model. Category;
import com. onlyK. ssm. model. Hbook;
import java. util. List;
public class HbookVo extends Hbook {
private List< Category> categories;
public List< Category> getCategories ( ) {
return categories;
}
public void setCategories ( List< Category> categories) {
this . categories = categories;
}
}
编写映射关系
HbookCategoryMapper.xml
< ! -- 关联关系多对多-- >
< resultMap id= "HbookVoMap" type= "com.onlyK.ssm.model.vo.HbookVo" >
< result property= "bookId" column= "book_id" > < / result>
< result property= "bookName" column= "book_name" > < / result>
< result property= "price" column= "price" > < / result>
< collection property= "categories" ofType= "com.onlyK.ssm.model.Category" >
< result property= "categoryId" column= "category_id" > < / result>
< result property= "categoryName" column= "category_name" > < / result>
< / collection>
< / resultMap>
< resultMap id= "CategoryVoMap" type= "com.onlyK.ssm.model.vo.CategoryVo" >
< result property= "categoryId" column= "category_id" > < / result>
< result property= "categoryName" column= "category_name" > < / result>
< collection property= "hbooks" ofType= "com.onlyK.ssm.model.Hbook" >
< result property= "bookId" column= "book_id" > < / result>
< result property= "bookName" column= "book_name" > < / result>
< result property= "price" column= "price" > < / result>
< / collection>
< / resultMap>
编写测试方法
HbookCategoryMapper.xml
< select id= "queryByBookId" resultMap= "HbookVoMap" parameterType= "java.lang.Integer" >
select * from t_hibernate_book b, t_hibernate_book_category bc, t_hibernate_category c
where b. book_id = bc. bid and bc. cid = c. category_id and b. book_id = #{ bookId}
< / select>
< select id= "queryByCid" resultMap= "CategoryVoMap" parameterType= "java.lang.Integer" >
select * from t_hibernate_book b, t_hibernate_book_category bc, t_hibernate_category c
where b. book_id = bc. bid and bc. cid = c. category_id and c. category_id= #{ cid}
< / select>
ManyToMany
package com. onlyK. ssm. service;
import com. onlyK. ssm. model. vo. CategoryVo;
import com. onlyK. ssm. model. vo. HbookVo;
import org. apache. ibatis. annotations. Param;
public interface ManyToMany {
HbookVo queryByBookId ( Integer bookId) ;
CategoryVo queryByCid ( Integer cid) ;
}
ManyToManyImpl.java
package com. onlyK. ssm. service;
import com. onlyK. ssm. mapper. HbookCategoryMapper;
import com. onlyK. ssm. model. vo. CategoryVo;
import com. onlyK. ssm. model. vo. HbookVo;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. stereotype. Service;
@Service
public class ManyToManyImpl implements ManyToMany {
@Autowired
private HbookCategoryMapper hbookCategoryMappero;
@Override
public HbookVo queryByBookId ( Integer bookId) {
return hbookCategoryMappero. queryByBookId ( bookId) ;
}
@Override
public CategoryVo queryByCid ( Integer cid) {
return hbookCategoryMappero. queryByCid ( cid) ;
}
}
ManyToManyImplTest.java
package com. onlyK. ssm. service;
import com. onlyK. ssm. SpringBaseTestCase;
import com. onlyK. ssm. model. Category;
import com. onlyK. ssm. model. Hbook;
import com. onlyK. ssm. model. vo. CategoryVo;
import com. onlyK. ssm. model. vo. HbookVo;
import org. junit. Test;
import org. springframework. beans. factory. annotation. Autowired;
import static org. junit. Assert. * ;
public class ManyToManyImplTest extends SpringBaseTestCase {
@Autowired
private ManyToMany manyToMany;
@Test
public void queryByBookId ( ) {
HbookVo hbookVo = manyToMany. queryByBookId ( 8 ) ;
System. out. println ( hbookVo. getBookName ( ) ) ;
for ( Category category : hbookVo. getCategories ( ) ) {
System. out. println ( category. getCategoryName ( ) ) ;
}
}
@Test
public void queryByCid ( ) {
CategoryVo categoryVo = manyToMany. queryByCid ( 8 ) ;
System. out. println ( categoryVo. getCategoryName ( ) ) ;
for ( Hbook hbook : categoryVo. getHbooks ( ) ) {
System. out. println ( hbook. getBookName ( ) ) ;
}
}
}
效果一
效果二