多对一测试的时候无法初始化MyBatisUtils

多对一测试的时候无法初始化MyBatisUtils

之前写goods的时候测试还好好的,然后写了一对多的也可以运行,写完这个就说无法初始化了。。

MyBatisUtils

public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory = null;
    static{
        Reader reader = null;
        try {
            reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        }catch(IOException e){
            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }
    public static SqlSession openSession(){
        return sqlSessionFactory.openSession();
    }
    public static void closeSession(SqlSession sqlSession){
        if(sqlSession != null){
            sqlSession.close();
        }
    }
}

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>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <environments default="dev">
        <environment id="dev">
            <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&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mappers/goods.xml"/>
        <mapper resource="mappers/players.xml"/>
        <mapper resource="mappers/goods_detail.xml"/>
        <mapper resource="mappers/club.xml"/>
    </mappers>
</configuration>

player.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="players">
    <!-- 开启二级缓存 -->
    <cache eviction="LRU" flushInterval="600000" size="512" readOnly="true"/>
    <select id="selectAll" resultType="com.lzq.mybatis.entity.Player">
        select * from student
    </select>

    <insert id="insert" parameterType="com.lzq.mybatis.entity.Player">
    INSERT INTO student(reg_no,name, sex, age, grade, major)
    VALUES (#{regNo},#{name},#{sex},#{age},#{grade},#{major})
      <selectKey resultType="Integer" keyProperty="id" order="AFTER">
        select last_insert_id()
      </selectKey>
    </insert>

    <select id="dynamicSQL" parameterType="java.util.Map" resultType="com.lzq.mybatis.entity.Player">
        select * from student
        <where>
            <if test="age != null">
                and age &gt; #{age}
            </if>
            <if test="sex != null">
                and sex = #{sex}
            </if>
        </where>
    </select>

    <select id="selectById" resultType="com.lzq.mybatis.entity.Player" parameterType="String">
        select * from student where clubno = #{value}
    </select>

    <resultMap id="rmPlayers" type="com.lzq.mybatis.entity.Player">
        <id column="id" property="id"/>
        <association property="club" select="club.selectById"/>
    </resultMap>

    <select id="selectManyToOne" resultMap="rmPlayers">
        select * from players limit 0,5
    </select>

</mapper>

club.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="club">

    <select id="selectById" parameterType="String" resultType="com.lzq.mybatis.entity.Club">
        select * from club where clubno = #{value}
    </select>

    <resultMap id="rmClub" type="com.lzq.mybatis.entity.Club">
        <!-- 映射club对象的主键到goods_id字段 -->
        <id column="id" property="id"/>
        <!--
           collection的含义是,在
           select * from t_goods limit 0,1 得到结果后,对所有Goods对象遍历得到goods_id字段值,
           并代入到goodsDetail命名空间的findByGoodsId的SQL中执行查询,
           将得到的"商品详情"集合赋值给goodsDetails List对象.
       
        <collection property="goodsDetails" select="goodsDetail.selectByGoodsId"
                    column="goods_id"/> -->
        <collection property="player" select="players.selectById" column="clubno"/>
    </resultMap>
    
    <select id="selectOneToMany" resultMap="rmClub">
        select * from club limit 0,3
    </select>
</mapper>

测试单元

@Test
public void testManyToOne1(){
    SqlSession sqlSession = null;
    try{
        sqlSession = MyBatisUtils.openSession();
        List<Player> list = sqlSession.selectList("players.selectManyToOne");
        for(Player player : list){
            System.out.println(player.getName() + player.getClub().getCountry());
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally {
        MyBatisUtils.closeSession(sqlSession);
    }
}

报错信息

https://img1.sycdn.imooc.com//climg/6386a0b409db859718970902.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2022-11-30 09:56:53

同学你好,老师先给同学提供一个解决的思路,同学可以先自行尝试一下,如果依然不能解决,老师再给出解决方式。这样可以锻炼同学自己解决问题的能力。

通常遇到MyBatis工具类无法初始化时,可以将代码中的关闭SqlSession的代码注释掉,这样可以将完整的报错信息展示出来。

由于截图中的179行代码写在finally中,是必然会执行的,那么一定会关闭SqlSession,此时其中的异常信息也会一并被消除掉。所以注释掉这行代码就能看到完整的报错信息了,根据报错信息就可以精准的定位错误原因。

祝学习愉快~

  • 好的。我试一下,但试之前我想问一下为什么之前跑测试用例的时候就没问题呀。然后出了这个错之后之前没问题的也有问题了。。。

    2022-11-30 10:05:03
  • 同学你好,可能出现的原因很多,例如xml中新增的部分有语法错误,或者重名等等,都是可能导致“以前没问题,但是加了代码之后就不行了”这样的情况的。

    祝学习愉快~

    2022-11-30 10:41:39
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师