请老师解惑
问题描述:
对着视频校对,消耗了几个小时,仍然找不到错误。请老师解惑

相关代码:
在商品详情实体类GoodsDetail.java中:
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中:
<?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>进行对象关联:
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`中:
<?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>在测试用例中:
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中:
<?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”,不能使用空串。
祝学习愉快~
2023版Java工程师
- 参与学习 人
- 提交作业 8790 份
- 解答问题 9886 个
综合就业常年第一,编程排行常年霸榜,北上广深月薪过万! 不需要基础,无需脱产即可学习,只要你有梦想,想高薪! 全新升级:技术栈升级(包含VUE3.0,ES6,Git)+项目升级(前后端联调与功能升级)
了解课程



恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星