------------恢复内容开始------------
------------恢复内容开始------------
------------恢复内容开始------------
1.之前写的ResultSet结果集不能直接强转成实体,要next遍历。

2.避免绝对路径,它从根目录开始。先对路径从该路径的上一级开始拼接,或则说把当前最高一级换掉

3.表单的提交:menthod=post时候,数据会在消息体里,安全又不会把 ?=add覆盖掉(action:teacher?op=add)
如果时get,就要写一个hiden的input,op赋值给value。

Cookie:Cookie 值中包含了空格(ASCII 码 32),而 Tomcat 等服务器对 Cookie 值有严格的字符限制(不允许包含空格、逗号、分号等特殊字符)。
你的时间格式 "yyyy-MM-dd HH:mm:ss" 中包含空格(比如 2025-10-11 16:30:00 中的空格),这正是导致错误的根源。
修复方案:修改时间格式,移除空格
将时间格式中的空格替换为其他允许的字符(如下划线、连字符或直接去掉),例如 "yyyy-MM-dd_HH:mm:ss" 或 "yyyyMMddHHmmss"。

------------恢复内容结束------------

maven工程中默认所有xml资源只能在resource下面加载,如果不是在resource里,还需要再pom里加入

MyBatis中集合映射的两种不同配置场景

您提出了一个很好的问题,这涉及到MyBatis中两种不同场景下的集合配置方式。让我为您详细解释其中的区别:

两种不同的配置场景

场景1:直接在select语句中使用resultType

<select id="findAllTeachers" resultType="Teacher">
    SELECT * FROM t_teacher
</select>
  • 这是最常见的配置方式,当方法返回List<Teacher>
  • MyBatis会自动识别返回类型是集合,并创建合适的集合对象(通常是ArrayList)
  • 因此只需要指定集合中元素的类型,不需要显式声明List类型

场景2:在resultMap中配置对象内部的集合属性

<resultMap id="orderWithDetailsMap" type="OrderWithDetailsDTO">
    <!-- 其他属性映射 -->
    <collection property="orderDetails" javaType="java.util.List" ofType="OrderDetail">
        <!-- 集合元素属性映射 -->
    </collection>
</resultMap>
  • 这种情况是映射一个对象(如OrderWithDetailsDTO)内部的集合属性(orderDetails)
  • MyBatis需要知道如何构建这个集合属性,以及集合中包含的元素类型

为什么需要同时指定javaType和ofType

  1. javaType:指定集合属性本身的类型(如ArrayList、LinkedList等)

    • 这告诉MyBatis使用什么类型的集合来存储元素
    • 虽然可以省略(MyBatis会使用默认集合类型),但显式指定可以确保类型安全
  2. ofType:指定集合中元素的具体类型

    • 这告诉MyBatis如何将数据库结果映射到集合中的每个元素对象

核心区别

  • resultType顶层查询结果类型的配置
  • collection对象内部集合属性的配置
  • 两者所处的层次和作用范围完全不同,因此配置方式也不同

代码优化建议

您的理解是正确的,如果您想简化配置,可以省略javaType,MyBatis会使用默认的ArrayList作为集合实现:

<?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="dao.CustomerDao">
    <resultMap id="dto" type="OrderWithDetailsDTO">
        <id property="oid" column="oid"/>
        <result property="cid" column="cid"/>
        <result property="orderTime" column="orderTime"/>
        <result property="totalPrice" column="total_price"/>
        <result property="address" column="address"/>
        <!-- 可以省略javaType,只保留ofType -->
        <collection property="orderDetails" ofType="OrderDetail">
            <id property="odid" column="odid"/>
            <result property="oid" column="oid"/>
            <result property="pid" column="pid"/>
            <result property="num" column="num"/>
            <result property="littlePrice" column="little_price"/>
        </collection>
    </resultMap>
    
    <select id="findOrderWithDetailsDTO" resultMap="dto">
        SELECT orders.*, order_detail.odid, order_detail.pid, order_detail.num, order_detail.little_price
        FROM orders, order_detail
        WHERE orders.oid = order_detail.oid AND orders.oid = #{id}
    </select>
</mapper>

这个优化版本保留了关键的ofType配置,同时省略了可选的javaType配置,使代码更简洁。

//17
在 MyBatis 的动态 SQL 中,标签的test属性里直接使用uname而不需要#{uname},核心原因是两者的作用场景和解析方式完全不同:

  1. test属性的本质是 “OGNL 表达式判断”
    标签的test属性用于判断条件是否成立(决定是否拼接后续 SQL 片段),它遵循的是OGNL 表达式语法,作用是在 MyBatis 解析 SQL 之前,对传入的参数进行逻辑判断。
    这里的uname直接引用的是通过@Param("uname")定义的参数变量本身(可以理解为 Java 代码中的变量名),OGNL 表达式会直接读取该变量的值进行判断(如uname != null是判断参数是否为 null,uname != ''是判断参数是否为空字符串)。
  2. {uname}的本质是 “SQL 参数占位符”

{uname}是 MyBatis 中用于在 SQL 语句中插入参数值的语法,它的作用是:

告诉 MyBatis:这里需要替换为uname参数的值;
会自动进行 SQL 预编译(生成?占位符),防止 SQL 注入;
仅在最终生成的 SQL 语句中生效(属于 SQL 语法的一部分)。
关键区别
test属性中的uname:是 OGNL 表达式中对 “参数变量” 的直接引用,用于逻辑判断(和 Java 代码中if (uname != null)的uname含义一致)。

{uname}:是 SQL 语句中对 “参数值” 的占位符,用于替换为实际数据(和 SQL 中where uname = ?的?作用一致)。

因此,在test属性的判断逻辑中,直接用参数名(如uname)即可,不需要也不能用#{}包裹 —— 否则 MyBatis 会将#{uname}识别为字符串的一部分,导致判断逻辑失效。

//10月20日,开始学习spring
bean管理用的是单例模式,今年首次了解到单例模式

//10月21日
@Repository("firstRepository")定义了bean名称为firstRepository。
Service中注入时:用@Autowired+@Qualifier("firstRepository")或@Resource(name = "firstRepository")。
@Autowired本身不指定名称,需配合@Qualifier;@Resource可直接指定名称,是JDK标准注解。

10月23日,数据回显和json交互
1.返回modelandview时候,返回的视图名称是setName()里的值不是return的值。