Mybatis 一些细节

  • parameterType 可以忽略掉不写 , 下面是摘自官网文档对它的解释。

将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。

如果不写,那么可读性就稍微差一点 , 要求程序员对代码的把握度要高一点,因为有时候,你并不知道现在要传递什么类型进来。当然你可以通过saveUser这样的字眼来识别出来要传递一个user对象。所以,大家按照自己的习惯来选择。[这段话是我想的]

<insert id="saveUser">
    /*下面这行是早期我们执行添加的语句*/
   INSERT INTO  t_user VALUES (NULL , #{username} , #{password});
</insert>

映射文件

重点是resultType . 下面的这段话摘自官网文档对它的描述:

属性介绍
resultType从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用。
resultMap外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用。 这个属性一般多用于复杂查询,后面的表关联查询就能看到它的身影了。
<!--查询总数, resultType 用于表示返回结果类型。
    这里的long其实是Long类型,这里写的是别名,其实可以写全路径。别名的声明在
    源码中的 TypeAliasRegistry 中有声明
    查询不写返回值类型,那么是无法获取到结果的。
-->
<select id="findCount" resultType="long">
    SELECT  count(*) FROM  t_user;
</select>

#{} 和 ${} 区别

总体概括: #{} 具有预编译效果, ${}仅仅起到替换作用而已

如果传递的参数就是一个简单类型(String 、 基本数据类型) ,那么#{} 可以写随意的文字, 但是${} 里面只能写 ${value} 。 当然如果传递过来的是对象,那么大家写法都是些对象的属性名。 比如 #{username} | ${username}

模糊查询也可以写成这样

   name like CONCAT("%",?,"%")

<think>好的,我现在需要帮助用户了解MyBatis的相关细节。用户提到了几个引用内容,我需要结合这些内容来组织回答。 首先,用户提供的引用[1]提到了配置MyBatis识别Mapper接口,无论是纯MyBatis还是集成到Spring Boot。这说明用户可能对Mapper的配置流程不太清楚,需要详细解释配置步骤,特别是不同环境下的差异。 接下来,引用[2]讨论了MyBatis的动态SQL中的set标签问题。用户可能遇到了更新操作时SQL语句的错误,比如多余的逗号或者没有set字段的情况。这里需要详细说明set标签的作用,以及如何正确使用它来避免语法错误。 然后,引用[3]提到了#{}和${}的区别,以及resultType的使用。用户可能对参数注入的安全性和结果映射有疑问,需要解释两者的区别,强调防止SQL注入的重要性,并举例说明resultType的应用场景。 我需要确保回答结构清晰,分点说明每个细节,并引用对应的参考资料。同时,按照用户的要求,使用中文,行内公式用$...$,独立公式用$$...$$,但考虑到MyBatis主要是Java框架,可能数学公式不多,但如果有相关的表达式需要处理的话,比如动态SQL的条件判断,可能需要用代码块展示。 此外,用户要求生成相关问题,我需要根据回答内容提出三个相关的问题,帮助用户进一步深入学习。比如,关于动态SQL的其他标签、配置多数据源的方法、MyBatis的缓存机制等。 最后,检查回答是否符合系统级指令,特别是引用标识是否正确添加,格式是否正确,避免使用任何Markdown,保持自然的中文表达。确保每个引用对应的内容在回答中有提及,并在段落末尾添加引用标识,如[^1]、[^2]、[^3]。</think>### MyBatis 细节说明 #### 1. Mapper接口的配置 MyBatis通过Mapper接口与XML映射文件关联实现数据库操作。若使用纯MyBatis框架,需在`mybatis-config.xml`中配置Mapper文件路径: ```xml <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> ``` 若集成到Spring Boot,则通过`@MapperScan`注解扫描接口包: ```java @SpringBootApplication @MapperScan("com.example.mapper") public class Application { ... } ``` 此配置使MyBatis自动生成接口代理类。 --- #### 2. 动态SQL的`<set>`标签 在更新操作中,若直接拼接字段可能因条件缺失或尾部逗号导致SQL错误。例如: ```xml <update id="updateUser"> UPDATE user <set> <if test="name != null">name = #{name},</if> <if test="age != null">age = #{age},</if> </set> WHERE id = #{id} </update> ``` `<set>`标签会自动去除末尾多余的逗号,并在至少一个条件成立时添加`SET`关键字。若所有条件不成立,`SET`会被忽略,避免语法错误。 --- #### 3. `#{}`与`${}`的区别 - **`#{}`**:使用预编译占位符,参数值以安全方式替换,防止SQL注入。例如: ```xml SELECT * FROM user WHERE name = #{name} ``` 会被编译为`SELECT * FROM user WHERE name = ?`,运行时传入参数值。 - **`${}`**:直接拼接字符串,适用于动态表名或列名,但需注意安全性。例如: ```xml SELECT * FROM ${tableName} ``` 若`tableName`来自用户输入,需严格校验。 --- #### 4. `resultType`与`resultMap` - **`resultType`**:直接映射到Java类,要求数据库列名与类属性名一致。例如: ```xml <select id="getUser" resultType="com.example.User"> SELECT id, name FROM user </select> ``` - **`resultMap`**:自定义复杂映射关系,支持嵌套对象和集合。例如: ```xml <resultMap id="userMap" type="User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> </resultMap> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值