请老师解惑
问题描述:
对着视频校对,消耗了几个小时,仍然找不到错误。请老师解惑
相关代码:
在商品详情实体类GoodsDetail.java
中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package com.imooc.mybatis.entity; import java.util.zip.ZipInputStream; public class GoodsDetail { private Integer gdId; private Integer goodsId; private String gdPicUrl; private Integer gdOrder; public Integer getGdId() { return gdId; } public void setGdId(Integer gdId) { this .gdId = gdId; } public Integer getGoodsId() { return goodsId; } public void setGoodsId(Integer goodsId) { this .goodsId = goodsId; } public String getGdPicUrl() { return gdPicUrl; } public void setGdPicUrl(String gdPicUrl) { this .gdPicUrl = gdPicUrl; } public Integer getGdOrder() { return gdOrder; } public void setGdOrder(Integer gdOrder) { this .gdOrder = gdOrder; } } |
相对应的,增加对应的mappers文件:
在goods_detail.xml
中:
1 2 3 4 5 6 7 8 9 10 11 12 | <? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> < mapper namespace = "goodsDetail" > < select id = "selectByGoodsId" parameterType = "Integer" resultType = "com.imooc.mybatis.entity.GoodsDetail" > select * from t_goods_detail where goods_id = #{value} </ select > </ mapper > |
进行对象关联:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | package com.imooc.mybatis.entity; import java.util.List; public class Goods { private Integer goodsId; // 商品编号 // 包装类 private String title; // 标题 private String subTitle; // 子标题 private Float originalCost; // 原始价格 private Float currentPrice; // 当前价格 private Float discount; // 折扣率 private Integer isFreeDelivery; // 是否包邮:1-包邮;0-不包邮 private Integer categoryId; // 分类编号 private List<GoodsDetail> goodsDetails; // 将Many设为One的属性集合,这样一个One对象下面,就有多个Many对象 public Integer getGoodsId() { return goodsId; } public void setGoodsId(Integer goodsId) { this .goodsId = goodsId; } public String getTitle() { return title; } public void setTitle(String title) { this .title = title; } public String getSubTitle() { return subTitle; } public void setSubTitle(String subTitle) { this .subTitle = subTitle; } public Float getOriginalCost() { return originalCost; } public void setOriginalCost(Float originalCost) { this .originalCost = originalCost; } public Float getCurrentPrice() { return currentPrice; } public void setCurrentPrice(Float currentPrice) { this .currentPrice = currentPrice; } public Float getDiscount() { return discount; } public void setDiscount(Float discount) { this .discount = discount; } public Integer getIsFreeDelivery() { return isFreeDelivery; } public void setIsFreeDelivery(Integer isFreeDelivery) { this .isFreeDelivery = isFreeDelivery; } public Integer getCategoryId() { return categoryId; } public void setCategoryId(Integer categoryId) { this .categoryId = categoryId; } public List<GoodsDetail> getGoodsDetails() { return goodsDetails; } public void setGoodsDetails(List<GoodsDetail> goodsDetails) { this .goodsDetails = goodsDetails; } } |
上述已进行关联,但是list集合中的数据仍然是空的:
在`goods.xml`中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | <? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> < mapper namespace = "goods" > <!--开启了二级缓存--> < cache eviction = "LRU" flushInterval = "600000" size = "512" readOnly = "true" /> < select id = "selectAll" resultType = "com.imooc.mybatis.entity.Goods" useCache = "" > select * from t_goods order by goods_id desc limit 10 </ select > < select id = "selectById" parameterType = "Integer" resultType = "com.imooc.mybatis.entity.Goods" > select * from t_goods where goods_id = #{value}; </ select > <!--注意标点符号!是英文句号,不是英文逗号--> < select id = "selectByPriceRange" parameterType = "java.util.Map" resultType = "com.imooc.mybatis.entity.Goods" > select * from t_goods where current_price between #{min} and #{max} order by current_price limit 0,#{limt} </ select > < select id = "selectGoodsMap" resultType = "java.util.LinkedHashMap" > select g.*,c.category_name,'1' as test from t_goods g,t_category c where g.category_id=c.category_id </ select > <!--先结果映射--> < resultMap id = "rmGoods" type = "com.imooc.mybatis.dto.GoodsDTO" > <!--设置主键字段与属性映射--> < id property = "goods.goodsId" column = "goods_id" ></ id > <!--设置非主键字段与属性约束--> < result property = "goods.title" column = "title" ></ result > < result property = "goods.originalCost" column = "original_cost" ></ result > < result property = "goods.currentPrice" column = "current_price" ></ result > < result property = "goods.discount" column = "discount" ></ result > < result property = "goods.isFreeDelivery" column = "is_free_delivery" ></ result > < result property = "goods.categoryId" column = "category_id" ></ result > < result property = "category.categoryId" column = "category_id" ></ result > < result property = "category.categoryName" column = "category_name" ></ result > < result property = "category.parentId" column = "parent_id" ></ result > < result property = "category.categoryLevel" column = "category_level" ></ result > < result property = "category.categoryOrder" column = "category_order" ></ result > < result property = "test" column = "test" ></ result > </ resultMap > <!---将上面的映射规则,放进来--> < select id = "selectGoodsDTO" resultMap = "rmGoods" > select g.*,c.*,'1' as test from t_goods g,t_category c where g.category_id=c.category_id </ select > < insert id = "insert" parameterType = "com.imooc.mybatis.entity.Goods" useGeneratedKeys = "true" keyProperty = "goodsId" keyColumn = "goods_id" > <!--不用加主键id字段,因为是自动生成的编号--> insert into t_goods(title,sub_title,original_cost,current_price,discount,is_free_delivery,category_id) values (#{title},#{subTitle},#{originalCost},#{currentPrice},#{discount},#{isFreeDelivery},#{categoryId}); </ insert > < insert id = "insert2" parameterType = "com.imooc.mybatis.entity.Goods" flushCache = "true" > <!--不用加主键id字段,因为是自动生成的编号--> insert into t_goods(title,sub_title,original_cost,current_price,discount,is_free_delivery,category_id) values (#{title},#{subTitle},#{originalCost},#{currentPrice},#{discount},#{isFreeDelivery},#{categoryId}); <!--帮助主键回填--> <!--代表上面insert语句执行完后,再执行这个主键回填--> < selectKey resultType = "Integer" keyProperty = "goodsId" order = "AFTER" > select last_insert_id() </ selectKey > </ insert > < update id = "update" parameterType = "com.imooc.mybatis.entity.Goods" > update t_goods set title=#{title}, sub_title=#{subTitle}, original_cost=#{originalCost}, current_price=#{currentPrice}, discount=#{discount}, is_free_delivery=#{isFreeDelivery}, category_id=#{categoryId} where goods_id = #{goodsId}; </ update > < delete id = "delete" parameterType = "Integer" > delete from t_goods where goods_id=#{value} </ delete > < select id = "selectByTitle" parameterType = "java.util.Map" resultType = "com.imooc.mybatis.entity.Goods" > select * from t_goods where title=#{title} ${order} </ select > <!----> < select id = "dynamicSQL" parameterType = "java.util.Map" resultType = "com.imooc.mybatis.entity.Goods" > select * from t_goods < where > < if test = "categoryId!=null" > <!--表示在参数的Map中,存在categoryId这个key--> and category_id=#{categoryId} <!--SQL子句1--> </ if > < if test = "currentPrice!=null" > and current_price<#{currentPrice} <!--SQL子句2--> </ if > </ where > </ select > <!--type:执行One的实体--> < resultMap id = "rmGoods1" type = "com.imooc.mybatis.entity.Goods" > < id column = "goods_id" property = "goodsId" ></ id > <!--映射:goods对象的主键到goods_id字段--> <!--对集合list进行说明,说明从哪里取值--> < collection property = "goodsDetails" select = "goodsDetail.selectByGoodsId" column = "goods_id" /> </ resultMap > < select id = "selectOneToMany" resultMap = "rmGoods1" > select * from t_goods limit 0,1 </ select > </ mapper > |
在测试用例中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package com.imooc.mybatis; import com.imooc.mybatis.dto.GoodsDTO; import com.imooc.mybatis.entity.Goods; import com.imooc.mybatis.utils.MyBatisUtils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.Reader; import java.sql.Connection; import java.util.HashMap; import java.util.List; import java.util.Map; // 单元测试类 public class MyBatisTestor { // 单元测试用例 @Test public void testOneToMany() throws Exception { SqlSession session = null ; try { session = MyBatisUtils.openSession(); List<Goods> list = session.selectList( "goods.selectOneToMany" ); for (Goods goods : list) { System.out.println(goods.getTitle() + ":" + goods.getGoodsDetails().size()); } } catch (Exception e){ throw e; } finally { MyBatisUtils.closeSession(session); } } } |
在核心配置文件mybatis-config.xml
中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> < configuration > < settings > <!--比如数据表的字段名goods_id转换为goodsId,实现驼峰命名转换--> < setting name = "mapUnderscoreToCamelCase" value = "true" /> </ settings > <!--设置默认指向的数据库,便捷切换--> < environments default = "dev" > <!--开发环境--> < environment id = "dev" > <!--采用JDBC方式对数据库事务进行commit/rollback--> < transactionManager type = "JDBC" ></ transactionManager > <!--采用连接池方式管理数据库连接--> < dataSource type = "POOLED" > < property name = "driver" value = "com.mysql.jdbc.Driver" /> < property name = "url" value = "jdbc:mysql://localhost:3306/babytun?useUnicode=true&characterEncoding=UTF-8" /> < property name = "username" value = "root" /> < property name = "password" value = "1234abcd" /> </ dataSource > </ environment > <!--(线上)生产环境--> < environment id = "prd" > <!--采用JDBC方式对数据库事务进行commit/rollback--> < transactionManager type = "JDBC" ></ transactionManager > <!--采用连接池方式管理数据库连接--> < dataSource type = "POOLED" > < property name = "driver" value = "com.mysql.jdbc.Driver" /> < property name = "url" value = "jdbc:mysql://192.168.1.155:3306/babytun?useUnicode=true&characterEncoding=UTF-8" /> < property name = "username" value = "root" /> < property name = "password" value = "1234abcd" /> </ dataSource > </ environment > </ environments > < mappers > < mapper resource = "mappers/goods.xml" /> < mapper resource = "mappers/goods_detail.xml" /> </ mappers > </ configuration > |
14
收起
正在回答
1回答
同学你好,错误的位置在good.xml中的selectAll标签中,同学书写的useCache属性中没有具体的值,此处应当书写“true”或者“false”,不能使用空串。
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧