六、MyBatis 的 ${} 和 #{} 的区别

特性

#{}

${}

底层实现

使用 PreparedStatement

使用 Statement

类型转换

自动进行类型转换

不进行类型转换

单个简单类型参数

#{任意字符串}

${value}

防止 SQL 注入

有效防止

无法防止

应用场景建议:

  • 绝大多数情况下使用 #{},安全且高效

  • 只有在需要动态拼接 SQL 片段(如表名、列名等)时使用 ${},但需注意安全风险

七、MyBatis 的 ORM 映射

1. 字段起别名

-- 直接在 SQL 查询中为字段起别名
SELECT id, role_name roleName, role_desc roleDesc FROM role

2. 结果映射(ResultMap)【重点】

<!-- 定义结果映射 -->
<resultMap id="roleResultMap" type="com.example.pojo.Role">
    <!-- 主键字段映射 -->
    <id column="id" property="id"/>
    
    <!-- 非主键字段映射 -->
    <result column="role_name" property="roleName"/>
    <result column="role_desc" property="roleDesc"/>
</resultMap>

<!-- 使用结果映射 -->
<select id="findAllRoles" resultMap="roleResultMap">
    SELECT * FROM role
</select>

优点:

  • 将数据库字段与Java对象属性解耦

  • 支持复杂的关联关系映射

  • 提高代码的可维护性

八、MyBatis 的别名配置

1. MyBatis 内置别名

  • Java 基本类型:_int, _integer, _long, _double, _float, _boolean

  • 包装类型:int, integer, long, double, float, boolean, string

  • 集合类型:list, arraylist, map, hashmap

  • 注意:所有内置别名全部小写

2. 自定义别名

<typeAliases>
    <!-- 方式1:单个定义别名 -->
    <typeAlias type="com.example.pojo.User" alias="user"/>
    
    <!-- 方式2:批量定义别名(推荐) -->
    <!-- 默认将包下所有类的类名(首字母小写)作为别名 -->
    <package name="com.example.pojo"/>
</typeAliases>

九、批量引入映射配置文件

<mappers>
    <!-- 方式1:直接引入单个映射文件 -->
    <mapper resource="com/example/mapper/UserMapper.xml"/>
    
    <!-- 方式2:通过接口类引入单个映射文件 -->
    <mapper class="com.example.mapper.UserMapper"/>
    
    <!-- 方式3:批量引入映射文件(推荐) -->
    <package name="com.example.mapper"/>
</mappers>

注意事项:

  • 使用package方式时,要求接口名与映射文件名相同且在同一目录下

  • 批量引入可减少配置,提高开发效率

  • 确保MyBatis能够找到对应的映射文件


Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐