------------恢复内容开始------------
------------恢复内容开始------------
------------恢复内容开始------------
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
-
javaType:指定集合属性本身的类型(如ArrayList、LinkedList等)
- 这告诉MyBatis使用什么类型的集合来存储元素
- 虽然可以省略(MyBatis会使用默认集合类型),但显式指定可以确保类型安全
-
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属性的本质是 “OGNL 表达式判断”
标签的test属性用于判断条件是否成立(决定是否拼接后续 SQL 片段),它遵循的是OGNL 表达式语法,作用是在 MyBatis 解析 SQL 之前,对传入的参数进行逻辑判断。
这里的uname直接引用的是通过@Param("uname")定义的参数变量本身(可以理解为 Java 代码中的变量名),OGNL 表达式会直接读取该变量的值进行判断(如uname != null是判断参数是否为 null,uname != ''是判断参数是否为空字符串)。 -
{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的值。
浙公网安备 33010602011771号