MyBatis,进阶

UserMapper.xml中标签元素:

id: statement唯一标示
parameterType:参数类型.java类型(全类名或别名)
resultType:结果集类型 全类名
resultMap:自定义结果集(当类中的属性名和表中的字段名称不一致时,如类中为userId,表中为User_id,就要自定义结果集,用来匹配属性和字段)

//自定义结果集
<resultMap id="userMap" type="com.test.po.User">
<id column="user_id" property="userId"/>
<result column="username" property="username"/>
<result column="password" property="password"/>

</resultMap>
<insert id="addUser" parameterType="user">
insert into t_user(username,password) values
(#{username},#{password})
</insert>

接口命名规范:

  1. 接口名必须和 配置文件名一致 例如:userMapper.java –>userMapper.xml
  2. 接口中的抽象方法名,参数类型,返回值必须和配置文件中的对应项一致
    如:方法名–>id, 参数类型–>parameterType, 返回值–>resultType或resultMap
  3. 配置文件名必须和接口的全类名一致
    如: 接口全类名为 com.test.dao.UserMapper
    namespace=”com.test.dao.UserMapper
    1. 以前的写法就可以更加安全规范了如下:
@Test
public void addUser()
{
    SqlSession session = M3Util.getSession();
    String statement = "com.test.dao";
    session.insert(statement,new User(0,username,password));
    session.commit();
    session.close();
}
//安全规范
public void addUser()
{
    sqlSession session = M3Util.getSession();
    //通过反射获取到接口的实现类
    UserMapper userMapper = session.getMapper(UserMapper.class);
    userMapper.insert(new User(0,username, password));
}

关于update要注意做判断

//注意此处set,if的使用
<update id="updUser" parameterType="com.test.po.User">
        update t_user 
        <set>
              <if test="username != null">
                      username=#{username},
              </if>
              <if test="password != null">
                      password=#{password},
              </if>
              <if test="birthday != null">
                      birthday = #{birthday},
              </if>
        </set> 
         where user_id=#{userId}
    </update>
### MyBatis 的高级用法与技巧 #### 1. 动态 SQL 动态 SQL 是 MyBatis 中非常强大的功能之一,允许开发者根据条件构建灵活的 SQL 查询语句。通过 `<if>`、`<choose>`、`<when>` 和 `<otherwise>` 等标签可以实现复杂的查询逻辑。 ```xml <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = 1 <if test="title != null"> AND title like #{title} </if> </select> ``` 此方法能够显著减少硬编码 SQL 并提高代码可维护性[^3]。 #### 2. 缓存机制 MyBatis 提供了一级缓存(Session 级别)和二级缓存(Mapper 级别)。合理利用缓存可以有效降低数据库访问频率并提升性能。 - **一级缓存**: 默认开启,在同一个 SqlSession 范围内生效。 - **二级缓存**: 需要手动启用,并在 Mapper 文件中声明 `cache` 或者引入第三方缓存框架如 EhCache。 ```xml <mapper namespace="com.example.mapper.BlogMapper"> <!-- 启用二级缓存 --> <cache/> <select id="getBlogById" parameterType="int" resultType="Blog"> SELECT * FROM Blog WHERE id = #{id} </select> </mapper> ``` 注意:当启用了二级缓存时,应确保数据一致性问题得到妥善处理[^3]。 #### 3. 插件开发 MyBatis 支持自定义插件来拦截执行链中的某些操作,比如日志记录、性能监控或者分页支持。官方推荐使用的 PageHelper 就是一个典型的例子。 配置方式如下: ```xml <!-- 在 mybatis-config.xml 中添加插件 --> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> </plugin> </plugins> ``` 此外还可以编写自己的插件类继承 `org.apache.ibatis.plugin.Interceptor` 接口完成特定需求[^3]。 #### 4. 结果映射复杂关系 对于存在关联表的情况,可以通过嵌套结果集的方式简化对象之间的映射过程。 假设有一个博客及其作者的关系模型,则可以在 XML 映射文件里这样写: ```xml <resultMap id="blogResultMap" type="Blog"> <association property="author" javaType="Author"> <id column="author_id" property="id"/> <result column="username" property="name"/> </association> </resultMap> <select id="selectBlogWithAuthor" resultMap="blogResultMap"> SELECT b.*, a.id AS author_id, a.username FROM blog b LEFT JOIN author a ON b.author_id = a.id </select> ``` 这种方法使得即使面对多层嵌套的数据结构也变得清晰易懂。 #### 5. 使用注解替代XML 如果不喜欢基于 XML 的配置风格,也可以采用纯 Java 注解的方式来定义SQL语句。这种方式更加紧凑直观但可能牺牲部分灵活性。 例如下面这段代码实现了同样的效果: ```java @Select("SELECT * FROM users WHERE username=#{username}") User findUserByUsername(@Param("username") String userName); ``` 不过需要注意的是并非所有的特性都能完全由注解决定,因此实际项目中通常会混合使用两者。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值