Mybatis的基本使用(2) - 参数的传递与接收

1、mybatis的参数传递问题

1.1、简单类型的参数对象
 <!--简单类型的参数
        举个简单的例子 :传一个 int   String   float   date
        简单的说就是你只是传递过来了一个值而已
        下面涉及到数据类型的时候可以写两种数据类型
        1:第一种数据类型是mybatis中的数据类型
        2:java中常见的数据类型

        也就是说在mybatis中定义了很多种数据类型,这个数据类型和Java中的常见的数据类型是一一对应的

         parameterType:传输参数的数据类型
         resultType:返回数据的数据类型
    -->

  <!-- 如果传递的这个值过来是一个值,那么下面在接受数据的时候引用的变量的名字是可以随便写的
    但是一般情况下写value
    -->
    <select id="getUserById" parameterType="java.lang.Integer" resultType="com.qf.ibatis.pojo.User">
        select * from t_user where id=#{value}
    </select>

1.2、对象类型的参数对象
 <!--传递对象类型
        现在有一个add的操作
        parameterType:这里是可以直接传输一个用户对象的

        如果传递的是一个用户对象
        那么这个用户对象在后面值的引用的时候直接写这个对象的属性的名字
    -->
    <insert id="add" parameterType="com.qf.ibatis.pojo.User">
        insert into t_user(userName,password) values(#{userName},#{password})
    </insert>

1.3、map集合类型的参数对象
  <!--要传递 两个键值过去-->

    <!--通过用户的名字 和 密码去找到用户对象
        记住这里传递map对象的时候 在引用数据的时候使用key的名字去进行引用
        前面传递的时候 传递一个HashMap的对象过来就好了
    -->
    <select id="findUserByNameAndPassword" parameterType="map" resultType="com.qf.ibatis.pojo.User">
        select * from t_user where userName=#{userName} and password=#{password}
    </select>

2、mybatis中返回参数的接受问题

2.1、返回简单类型的参数
 <!--返回参数的测试:
        返回一个简单类型的参数
    -->

    <!--通过id找到用户名,不是用户对象
        如果返回的是单一的值,那么直接写这个的数据类型就好了
    -->
    <select id="findUserNameById" parameterType="java.lang.Integer" resultType="java.lang.String">
        select userName from t_user where id=#{value }
    </select>

2.2、返回对象类型的参数
    <!--返回一个对象-->
    <select id="findUserById1" parameterType="int" resultType="com.qf.ibatis.pojo.User">
        select * from t_user where id=#{value }
    </select>
2.3、返回集合类型的参数
  <!--测试返回来一个集合
        注意:如果返回的数据是一个集合,那么后面的resultType中就写这个集合中泛型的数据类型
        List<User>
    -->
    <select id="findUserAll" resultType="com.qf.ibatis.pojo.User">
        select * from t_user
    </select>
2.4、数据库的字段和本地对象不对应怎么办
2.4.1、取别名的形式来完成字段的映射
    <!--接下来玩的是数据库的字段和本地对象中属性的名称不一样怎么办?
        第一种方式:通过取别名的形式来实现
    -->
    <select id="findUserAll1" resultType="com.qf.ibatis.pojo.User1">
        SELECT id AS userId,userName AS username,PASSWORD AS passwd FROM t_user
    </select>
2.4.2、通过建立映射关系来完成映射
  <!--接下来玩的是 数据库的字段和本地对象中属性的名称不一样怎么办?
        通过映射关系来实现
    -->
    <!--建立一个对象属性和表字段的映射关系
        申明了一种映射关系  就类似于申明了变量
        这个文件中导出都是可以使用的
        id名字 虽然可以随便写 但是一般情况下 就写 查询语句的id的名字ResultMap
        type:一般写的是 与表对应的java对象的这个全路径
    -->
    <resultMap id="findUserAll1ResultMap" type="com.qf.ibatis.pojo.User1">
        <!--配置主键映射
            id:表示的是id映射
            property:表示的是映射关系中java对象的属性的名字
            column:表示的是映射关系中表字段的名字
        -->
         <id property="userId" column="id"></id>
        <!--配置其他字段映射
            result:表示的是普通属性的映射关系
        -->
        <result property="username" column="userName"></result>
        <result property="passwd" column="password"></result>
    </resultMap>
    <!--
        resultMap:这个使用的前提:一般情况下就是数据库的字段和java对象的属性名称不一致的时候进行映射关系的
        这样一个字段

    -->
    <select id="findUserAll12" resultMap="findUserAll1ResultMap">
        SELECT * FROM t_user
    </select>
2.5、映射关系的一对一的返回

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i3j6s50r-1655947461028)(img/1615188139035.png)]

1、编写User类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User1 {

    private int userId;
    private String username;
    private String passwd;
    private IdCard idCard;

}

2、编写IdCard类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class IdCard {
    private int id;
    private String address;
    private Date startTime;
    private Date endTime;
    private int userId;
}

3、编写映射关系和查询的描述

 <!--下面测试下一对一的返回数据的问题
        下面就是咋们的 要查询id是22的这个人的个人信息 以及身份证号码

        这种关联关系中只能使用 resultMap不能使用resultType
    -->

    <!--首先定义映射关系-->
    <resultMap id="findUserInfoByIdResultMap" type="com.qf.ibatis.pojo.User1">
        <!--自己的主键和自己的普通属性的映射-->
        <!--配置主键映射
          id:表示的是id映射
          property:表示的是映射关系中java对象的属性的名字
          column:表示的是映射关系中 表字段的名字
      -->
        <id property="userId" column="id"></id>
        <!--配置其他字段映射
            result:表示的是普通属性的映射关系
        -->
        <result property="username" column="userName"></result>
        <result property="passwd" column="password"></result>

        <!--在定义一对一的数据的关联映射
            property:写的是用户对象中的这个IdCard这个对象的名字
            javaType:写的是IdCard这个类的全路径
        -->
        <association property="idCard" javaType="com.qf.ibatis.pojo.IdCard">
            <!--定义主键映射-->
            <id property="id" column="idCardId"></id>
            <!--定义普通字段的映射-->
            <result property="address" column="address"></result>
            <result property="userId" column="userId"></result>
        </association>

    </resultMap>


    <select id="findUserInfoById" parameterType="int" resultMap="findUserInfoByIdResultMap">
        SELECT * FROM t_user t1,t_idcard t2 WHERE t1.id=t2.userId AND t1.id=#{value }
    </select>

4、测试

    /**
     * 测试的是一对一
     * @throws IOException
     */
    @Test
    public void testFindUserIdCard() throws IOException {
        SqlSession sqlSession = JdbcUtils.getSqlSession();
        Object o = sqlSession.selectOne("UserMapper.findUserInfoById", 24);
        System.out.println("查询回来的数据是:"+o);
        JdbcUtils.close();
    }
2.6、映射关系的一对多的返回

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k1xsCBeO-1655947461030)(img/1615189038319.png)]

1、准备部门对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
    private int deptId;
    private String deptName;
    private String deptAddress;
    List<Employee> employees;
}

2、准备员工对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    private int empId;
    private String empName;
    private int gender;
}

3、准备配置文件和映射关系

  
    <!--接下来玩下一对多的映射关系-->
    <!--首先是准备映射关系-->
    <resultMap id="findDeptByDeptIdResultMap" type="com.qf.ibatis.pojo.Dept">
       <!--配置主对象的主键和普通属性映射-->
        <id property="deptId" column="deptId"></id>
        <result property="deptName" column="deptName"></result>
        <result property="deptAddress" column="deptAddress"></result>
        <!--配置一对多的关联映射-->
        <collection property="employees" ofType="com.qf.ibatis.pojo.Employee">
            <!--配置主键映射-->
            <id property="empId" column="empId"></id>
            <!--配置普通属性映射-->
            <result property="empName" column="empName"></result>
            <result property="gender" column="gender"></result>
        </collection>
    </resultMap>

    <select id="findDeptByDeptId" parameterType="int" resultMap="findDeptByDeptIdResultMap">
       SELECT * FROM t_dept t1,t_emp t2 WHERE t1.deptId=t2.dId AND t1.deptId=#{value }
    </select>

4、准备测试

    /*
     * 测试的是一对多
     * @throws IOException
     */
    @Test
    public void testFindDeptByDeptId() throws IOException {
        SqlSession sqlSession = JdbcUtils.getSqlSession();
        Object o = sqlSession.selectOne("UserMapper.findDeptByDeptId", 1);
        System.out.println("查询回来的数据是:"+o);
        JdbcUtils.close();
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦及海深@无

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值