详解mybatis通过mapper接口加载映射文件

通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的。那么什么是通过 mapper 接口加载映射文件呢?

我们首先看以前的做法,在全局配置文件 mybatis-configuration.xml 通过 <mappers> 标签来加载映射文件,那么如果我们项目足够大,有很多映射文件呢,难道我们每一个映射文件都这样加载吗,这样肯定是不行的,那么我们就需要使用 mapper 接口来加载映射文件

以前的做法:

  

改进做法:使用 mapper 接口来加载映射文件

1、定义 userMapper 接口

package com.ys.mapper;

import org.apache.ibatis.annotations.Delete;

import org.apache.ibatis.annotations.Insert;

import org.apache.ibatis.annotations.Select;

import org.apache.ibatis.annotations.Update;

import com.ys.po.User;

public interface UserMapper {

  //根据 id 查询 user 表数据

  public User selectUserById(int id) throws Exception;

  //向 user 表插入一条数据

  public void insertUser(User user) throws Exception;

  //根据 id 修改 user 表数据

  public void updateUserById(User user) throws Exception;

  //根据 id 删除 user 表数据

  public void deleteUserById(int id) throws Exception;

}

2、在全局配置文件 mybatis-configuration.xml 文件中加载 UserMapper 接口(单个加载映射文件)

3、编写UserMapper.xml 文件

<?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="com.ys.mapper.UserMapper">

  <!-- 根据 id 查询 user 表中的数据

    id:唯一标识符,此文件中的id值不能重复

    resultType:返回值类型,一条数据库记录也就对应实体类的一个对象

    parameterType:参数类型,也就是查询条件的类型

  -->

  <select id="selectUserById"

      resultType="com.ys.po.User" parameterType="int">

    <!-- 这里和普通的sql 查询语句差不多,后面的 #{id}表示占位符,里面不一定要写id,写啥都可以,但是不要空着 -->

    select * from user where id = #{id1}

  </select>

  <!-- 根据 id 更新 user 表的数据 -->

  <update id="updateUserById" parameterType="com.ys.po.User">

    update user u

      <!-- <set>

        <if test="username != null and username != ''">

          u.username = #{username},

        </if>

        <if test="sex != null and sex != ''">

          u.sex = #{sex}

        </if>

      </set> -->

      <trim prefix="set" suffixOverrides=",">

        <if test="username != null and username != ''">

          u.username = #{username},

        </if>

        <if test="sex != null and sex != ''">

          u.sex = #{sex},

        </if>

      </trim>

     where id=#{id}

  </update>

  <!-- 向 user 表插入一条数据 -->

  <insert id="insertUser" parameterType="com.ys.po.User">

    <!-- 将插入的数据主键返回到 user 对象中

       keyProperty:将查询到的主键设置到parameterType 指定到对象的那个属性

       select LAST_INSERT_ID():查询上一次执行insert 操作返回的主键id值,只适用于自增主键

       resultType:指定 select LAST_INSERT_ID() 的结果类型

       order:AFTER,相对于 select LAST_INSERT_ID()操作的顺序

     -->

    <selectKey keyProperty="id" resultType="int" order="AFTER">

      select LAST_INSERT_ID() 

    </selectKey>

    insert into user(username,sex,birthday,address)

      value(#{username},#{sex},#{birthday},#{address})

  </insert>

  <!-- 根据 id 删除 user 表的数据 -->

  <delete id="deleteUserById" parameterType="int">

    delete from user where id=#{id}

  </delete>

</mapper>

4、测试

//根据id查询user表数据

@Test

public void testSelectUserById(){

  /*这个字符串由 userMapper.xml 文件中 两个部分构成

    <mapper namespace="com.ys.po.userMapper"> 的 namespace 的值

    <select id="selectUserById" > id 值*/

  String statement = "com.ys.mapper.UserMapper.selectUserById";

  User user = session.selectOne(statement, 1);

  System.out.println(user);

  session.close();

}

5、批量加载映射文件

<mappers>

    <!--批量加载mapper

     指定 mapper 接口的包名,mybatis自动扫描包下的mapper接口进行加载

     -->

    <package name="com.ys.mapper"/>

</mappers>

6、注意 

1、UserMapper 接口必须要和 UserMapper.xml 文件同名且在同一个包下,也就是说 UserMapper.xml 文件中的namespace是UserMapper接口的全类名

  

2、UserMapper接口中的方法名和 UserMapper.xml 文件中定义的 id 一致

3、UserMapper接口输入参数类型要和 UserMapper.xml 中定义的 parameterType 一致

4、UserMapper接口返回数据类型要和 UserMapper.xml 中定义的 resultType 一致

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java的MyBatis框架中Mapper映射配置的使用及原理解析

    Mapper的内置方法 model层就是实体类,对应数据库的表.controller层是Servlet,主要是负责业务模块流程的控制,调用service接口的方法,在struts2就是Action.Service层主要做逻辑判断,Dao层是数据访问层,与数据库进行对接.至于Mapper是mybtis框架的映射用到,mapper映射文件在dao层用. 下面是介绍一下Mapper的内置方法: 1.countByExample ===>根据条件查询数量 int countByExample(UserE

  • 详解mybatis通过mapper接口加载映射文件

    通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的.那么什么是通过 mapper 接口加载映射文件呢? 我们首先看以前的做法,在全局配置文件 mybatis-configuration.xml 通过 <mappers> 标签来加载映射文件,那么如果我们项目足够大,有很多映射文件呢,难道我们每一个映射文件都这样加载吗,这样肯定是不行的,那么我们就需要使用 mapper 接口来加载映射文件 以前的做法: 改进做法:使用 mapper 接口来加载映射文件 1.定义

  • Mybatis对mapper的加载流程深入讲解

    今天来分析Configuration初始化的最后一部分mapper的加载.​ 加载方法mapperElement XMLConfigBuilder配置Configuration的parseConfiguration方法还剩最后一行解析代码:mapperElement(root.evalNode("mappers")); mapperElement方法源码与详解如下图: 从源码可以得出一些结论: mappers节点支持mapper和package两种类型子节点: package子节点只需

  • 详解Mybatis拦截器安全加解密MySQL数据实战

    需求背景 公司为了通过一些金融安全指标(政策问题)和防止数据泄漏,需要对用户敏感数据进行加密,所以在公司项目中所有存储了用户信息的数据库都需要进行数据加密改造.包括Mysql.redis.mongodb.es.HBase等. 因为在项目中是使用springboot+mybatis方式连接数据库进行增删改查,并且项目是中途改造数据.所以为了不影响正常业务,打算这次改动尽量不侵入到业务代码,加上mybatis开放的各种拦截器接口,所以就以此进行改造数据. 本篇文章讲述如何在现有项目中尽量不侵入业务方

  • 详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作

    一.getMapper()接口 解析:getMapper()接口 IDept.class定义一个接口, 挂载一个没有实现的方法,特殊之处,借楼任何方法,必须和小配置中id属性是一致的 通过代理:生成接口的实现类名称,在MyBatis底层维护名称$$Dept_abc,selectDeptByNo() 相当于是一个强类型 Eg 第一步:在cn.happy.dao中定义一个接口 package cn.happy.dao; import java.util.List; import cn.happy.e

  • 详解vue-router的Import异步加载模块问题的解决方案

    1.问题现象 2.出现问题的代码点 3.替代方案: 把import() 替换成如下: Promise.resolve().then(()=>require(`@/views/${str}`)) 4.原因分析 项目在编译时,出现一个警告 这个警告的含义: require接收了一个变量,会报上面的警告,接收一个写死的字符串值时则没有警告! 我们通过控制台查看到import()对应编译过后的代码: 从上图可以看到require接收了一个变量,所以运行时出现了警告. 那这样就会报上面找不到对应的模块.

  • 详解polyfills如何按需加载及场景示例详解

    目录 前言 青铜时代 火枪时代 webpack添加babel-loader @babel/preset-env @babel/polyfill 配置 useBuiltIns 加入 @babel/plugin-transform-runtime 前言 青铜时代 最使前端头痛的问题,莫过于浏览器兼容性,无论是js,还是css都要考虑浏览器兼容性问题,在webpack出来之前,这无非是一个非常头疼的问题,查到一个兼容性问题,查找很多资料,解决一下,再出来一个问题又要花很长时间解决一下,这无疑要花费很长

  • 详解webpack分包及异步加载套路

    最近一个小项目是用webpack来进行构建的.其中用到了webpack分包异步加载的功能.今天抽时间看了下webpack打包后的文件,大致弄明白了webpack分包及异步加载的套路. 由于这个小项目是用自己写的一个路由,路由定义好了不同路径对应下的模板及逻辑代码: webpack配置文件: var path = require('path'), DashboardPlugin = require('webpack-dashboard/plugin'), HtmlWebpackPlugin = r

  • 详解asp.net core重新加载应用配置

    asp.net core重新加载应用配置Intro 我把配置放在了数据库或者是Redis里,配置需要修改的时候我要直接修改数据库,然后调用一个接口去重新加载应用配置,于是就尝试写一个运行时重新加载配置的接口. Configuration 重新加载实现 重新加载配置的接口其实很简单,经过看 Configuration 的源码可以知道,如果想要重新加载应用配置,需要一个 IConfigurationRoot 对象,而 IConfigurationRoot 其实可以直接拿注入服务中的 IConfigu

  • 详解Mybatis通用Mapper介绍与使用

    使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改.这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障.这时,通用Mapper便应运而生-- 什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件.开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删

  • 详解angularjs利用ui-route异步加载组件

    ui-route相比于angularjs的原生视图路由更好地支持了路由嵌套,状态转移等等.随着视图不断增加,打包的js体积也会越来越大,比如我在应用里面用到了wangeditor里面单独依赖的jquery就300多k.异步加载各个组件就很有必要.在这里我就以ui-route为框架来进行异步加载说明. 首先看一下路由加载文件 angular.module('webtrn-sns').config(['$stateProvider', function ($stateProvider) { $sta

随机推荐