首页 > 其他分享 >MyBatis基础使用三

MyBatis基础使用三

时间:2022-10-18 23:25:48浏览次数:50  
标签:映射 基础 查询 emp 使用 MyBatis 主键 id 属性

MyBatis基础使用三

批量删除的基础用法

Sql基础语句

delete from user where id in(6,7)

接口处书写语句

//批量删除
 
  void DeleteMoreUsers(@Param("ids") String ids);

 

映射文件

注意:这里只能使用“${ids}”的方式来获取传输过来的id值,因为“#{ids}”在编译过程中是通过单引号进行拼接的,转换成查询语句in内就变成了(‘6,7’)错误查询,详细的有关${}与#{}的区别,请参考MyBatis基础使用一

 <delete id="DeleteMoreUsers">
        delete  from user where id in (${ids})
    </delete>

 

测试文件

   @Test
    public void DeleteMoreUsers(){
        SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.DeleteMoreUsers("4,7");
            sqlSession.close();
​
    }

 

添加用户信息并获取自增的主键

接口处书写语句

   //添加用户信息并获取自增的主键
   void AddUser(User user);

 

映射文件

useGeneratedKeys:表示当前添加功能使用自增的主键
useGeneratedKeys:参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回
keyProperty:将添加的数据的自增主键为实体类类型的参数的属性赋值
keyProperty:返回的主键信息存储到插入信息的对象所包含的属性中,即id
  
 <insert id="AddUser" useGeneratedKeys="true" keyProperty="id" >
      insert into user values (null,#{username},#{password},#{age},#{gender},#{email})
    </insert>

 

测试文件

    @Test
    public void AddUser(){
        SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user =new User(null,"比起谷八幡","125810",20,"男","[email protected]");
        mapper.AddUser(user);
        System.out.println("id=  "+user.getId());
        sqlSession.close();
    }

 

最后返回结果,即为插入数据自增的主键的值

处理字段名和属性名不一致的情况

  1. 为查询的字段设置别名,和属性名保持一致

<select emp_id empId,emp_name empName,age,gender from emp where emp_id=#{empId}>

 

emp_id 、emp_name 为sql表中的字段名,empId、empName为属性名

  1. 当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰。 此时可以在MyBatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰 需要注意不能随便映射,这里必须符合下划线到驼峰的换名规则 emp_id:empId,emp_name:empName

这里通过在核心配置文件中配置setting,设置驼峰命名的别名

<!-- 将下划线映射为驼峰-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

 

 
  1. 使用resultMap自定义映射处理

    • resultMap:设置自定义的映射关系

    • id:唯一标识

    • type:处理映射关系的实体类类型

      • 常用的标签:

        • id:处理主键和实体类中属性的映射关系

        • result:处理普通字段和实体类中属性的映射关系

        • column:设置映射关系中的字段名,必须是sql查询出的某个字段

        • property:设置映射关系中的属性的属性名,必须是处理的实体类类型中的属性

        • association:处理多对一的映射关系(主要处理实体类类型的属性)

       

通过一个简单的例子来熟悉一下resultMap的用法

首先,在接口中编写一个查询的方法

 //根据查询数据
    Emp SelectById(@Param("empId") int id);

在xml映射中编写sql查询语句

这里通过resultMap配置sql中的文段和实体类中的属性

<resultMap id="EmpResultMap" type="com.wfy.pojo.Emp">
    <id column="emp_id" property="empId"></id>
    <result column="emp_name" property="empName"></result>
</resultMap>
 <select id="SelectById" resultMap="EmpResultMap">
        select * from emp where emp_id=#{empId}
    </select>

 

编写一个简单的测试类

    @Test
    public void SelectById(){
        SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.SelectById(1);
        System.out.println(emp);
    }

 

多对一的查询(多表查询)

通过三种不同的映射方式多对一的进行查询

  1. 级联方式处理

  2. association

  3. 分步查询(优点:可以实现延迟加载)

 

级联方式处理多对一的查询

这里通过映射文件进行举例说明:

<resultMap id="EmpAndDeptResultMap" type="Emp">
    <id column="emp_id" property="empId"></id>
    <result column="emp_name" property="empName"></result>
<!--级联方式-->
   <result column="dept_id" property="dept.deptId"></result>
   <result column="dept_name" property="dept.deptName"></result>
</resultMap>
    <select id="SelectEmpAndDeptById" resultMap="EmpAndDeptResultMap">
          select
              emp.*,dept.*
          from emp
              left join dept
                  on emp.dept_id=dept.dept_id
          where emp.emp_id =#{empId}
    </select>

association的方式处理多对一的查询

association:处理多对一的映射关系(处理实体类类型的属性)

  • property:设置需要处理映射关系的属性的属性名

  • javaType:设置要处理的属性的类型

<resultMap id="EmpAndDeptResultMap" type="Emp">
    <id column="emp_id" property="empId"></id>
    <result column="emp_name" property="empName"></result>
    <association property="dept" javaType="Dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
    </association>
</resultMap>

 

分步查询的方式处理多对一的查询

一个表中嵌套其他的表,通过分步骤的查询

这里使用了两张表Emp和Dept

 

 

通过在两个不同的接口和映射文件中编写,通过association进行连接

EmpMapper接口:

   //通过分步查询查询员工以及所对应的部门信息的第一步
 Emp SelectEmpAndDeptByStepOne(@Param("empId") int id);

DeptMapper接口:

    //  通过分步查询员工以及所对应的部门信息的第二步
 Dept SelectEmpAndDeptByStepTwo(@Param("deptId") int id);
 

EmpMapper的映射文件:

核心配置文件中配置延迟加载:

<settings>
<!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
<!-- 按需加载,默认设置为false;若设置为true则表示不管需不需要都全部加载sql语句-->
        <setting name="aggressiveLazyLoading" value="false"/>
</settings>
    <resultMap id="EmpAndDeptByStepResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
<!--association
     property:设置需要处理映射关系的属性的属性名
     select:设置分步查询的sql的唯一标识 ==说白了就是现属性的属性值有哪一个sql查询而来
     column:将查询出的某个字段作为分步查询的sql的条件
     fetchType:在开启了延迟加载的环境中,通过该属性设置当前的分步查询是否使用延迟加载
     fetchType="eager(立即加载)/lazy(延迟加载)"
-->
        <association property="dept"  fetchType="eager"
                     select="com.wfy.mapper.DeptMapper.SelectEmpAndDeptByStepTwo"
                     column="dept_id">
​
        </association>
    </resultMap>
  <select id="SelectEmpAndDeptByStepOne" resultMap="EmpAndDeptByStepResultMap">
       select * from emp where emp_id=#{empId}
    </select>

DeptMapper的映射文件:

<select id="SelectEmpAndDeptByStepTwo" resultType="com.wfy.pojo.Dept">
        select * from dept where dept_id=#{deptId}
    </select>

 

测试文件:

   @Test
    public void SelectEmpAndDeptByStep(){
        SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.SelectEmpAndDeptByStepOne(1);
        System.out.println(emp);
    }
 

标签:映射,基础,查询,emp,使用,MyBatis,主键,id,属性
From: https://www.cnblogs.com/wfy-studying/p/16804578.html

相关文章

  • 01#嵌入式系统基础:定义、由来、分类
    嵌入式系统的定义嵌入式系统是一种计算机硬件和软件的组合,也许还有机械装置,用于实现一个特定功能。在某些特定情况下,嵌入式系统是一个大系统或产品的一部分。例如,微波炉......
  • Python 操作Excel-openpyxl模块使用
    openpyxl的用法实例1.1Openpyxl库的安装使用openpyxl模块是一个读写Excel2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一......
  • Java中使用List的add方法后元素相同问题
    在写JavaWeb时,我在后端通过JDBC读取了数据后逐个使用List.add()方法添加元素并通过request方法传给jsp页面解析,但是添加以后出现了在列表里有n个(假设添加了n个元素)最后一个......
  • mybatis-plugin插件执行原理
    mybatis-plugin插件执行原理今天主要是在看mybatis的主流程源码,其中比较感兴趣的是mybatis的plugin功能,这里主要记录下mybatis-plugin的插件功能原理。plugin集合列表:在......
  • 干货 | Elasticsearch基础但非常有用的功能之二:模板
    Elasticsearch最少必要知识实战教程直播回放1、引言业务场景1:数据量非常大,需要进行索引生命周期管理,按日期划分索引,要求多个索引的Mapping一致,每次手动创建或者脚本创......
  • C语言基础-数组得初始化
    #include<stdio.h>intmain(){inta[10];intsize=sizeof(a)/sizeof(a[0]);//计算数组得大小for(inti=0;i<size;i++){a[i]=i*100;......
  • linux基础命令
    转载:https://www.cnblogs.com/wwjjll/p/16804230.html虚拟机关键配置名词解释远程链接工具xshell基本使用linux命令准则系统运行命令常用快捷方式文件命令操作快......
  • 申请ssl证书并使用ACME.SH自动部署ssl证书
    申请ssl证书并使用ACME.SH自动部署ssl证书一、申请ssl证书1、前往https://freessl.cn申请免费的亚信SSL证书![image](https://img2022.cnblogs.com/blog/2379015/202210......
  • linux基础
    今日内容概要虚拟机关键配置名词解释远程链接工具xshell基本使用linux命令准则系统运行命令常用快捷方式文件命令操作快照功能文件编辑命令文件编辑异常情况......
  • JavaScript学习--基础语法03
    流程控制语句if,switch,for,while,dowhile。与之前学过的一样。 函数定义:通过function关键词定义语法:functionfunctionName(参数1,参数2) {  具体代码 }例子fu......