Mybatis的传参方式

举报
QGS 发表于 2023/02/18 13:55:31 2023/02/18
【摘要】 Mybatis的传参方式

Mybatis-使用@Param传参(推荐)

 

多个参数,使用@Param命名参数,在形参定义的前面加入@Param("自定义参数名称")

接口

List<User> selecMulitParamtUser(@Param("myid") int id, @Param("myadress") String address);

在mapper文件使用

使用@Param(“参数名”) String name

<!--   使用@Param传参 -->

    <select id="selecMulitParamtUser" resultType="org.example.daomain.User">

        SELECT * FROM TEST1 WHERE p_id=#{myid} and address=#{myadress};

    </select>

测试类

    //使用@Param命名参数

    @Test

    public void selecMulitParamtUser(){

        SqlSession sqlSession =MyBatisUtils.getSqlSessionAuto();

        UserDao dao =sqlSession.getMapper(UserDao.class);

        //调用dao的方法,执行数据库的操作

        List<User> users =dao.selecMulitParamtUser(2,"深圳");

        users.forEach(user -> System.out.println(user));

    }

Mybatis-java对象传参(推荐)

使用java对象传递参数,java的属性值就是sql需要的参数值。每一个属性就是一个参数。

语法格式:#{propert,javaType=”数据类型”,jdbcType=”数据类型名称”}

JavaType: 和jdbcType:

接口

  /**

     * 使用java对象传递参数

     * 多个参数,使用java对象作为接口中方法的参数

     */

List<User> selecUserjavaType(User u);

Mapper

<!-- 多个参数,使用java对象的属性值,作为参数的实际值

    使用对象语法:#{属性名,javaTpye=类型名称,jdbcTtpe=数据类型} 完整的语法格式,很少用

    javaTpye:指java中属性的数据类型。

    jdbcTtpe:在数据库中的数据类型

    列:#{p_id,javaType=java.lang.Interge,jdbcType=int}

    简化方式:#{属性名} ,javaType和jdbcType的值由Mybatis反射获取,不用手动提供

-->

    <!--完整方式-->

    <select id="selecUserjavaType" resultType="org.example.daomain.User">

        SELECT * FROM TEST1 WHERE p_id=#{p_id,javaType=java.lang.Interge,jdbcType=int}

        and p_name#{p_name,javaType=java.lang.Interge,jdbcType=varchar}

        and address#{address,javaType=java.lang.Interge,jdbcType=varchar}

        and birth=#{birth,javaType=java.lang.Interge,jdbcType=date}

        and gender=#{gender,javaType=java.lang.Interge,jdbcType=varchar};

    </select>

<!--简化方式-->

    <select id="selecUserjavaType" resultType="org.example.daomain.User">

        SELECT * FROM TEST1 WHERE p_id=#{p_id}

                                and p_name#{p_name}

                                and address#{address}

                                and birth=#{birth}

                                and gender=#{gender};

</select>

完整方式(理解原理)

简化方式

测试对象

//使用java对象传参

    @Test

    public void selecUserjavaType(){

        SqlSession sqlSession =MyBatisUtils.getSqlSessionAuto();

        UserDao dao =sqlSession.getMapper(UserDao.class);

        User uParam =new User(2,"小红","深圳","2022-09-01","女");

        List<User> users =dao.selecUserjavaType(uParam);

        users.forEach(user -> System.out.println(user));

}

    @Test

    public void  selecUserjavaTypeone(){

        SqlSession sqlSession =MyBatisUtils.getSqlSessionAuto();

        UserDao dao =sqlSession.getMapper(UserDao.class);

        User uParam =new User();

        uParam.setP_id(2);

        List<User> users =dao.selecUserjavaTypeone(uParam);

        users.forEach(user -> System.out.println(user));

    }

 Mybatis-按位传值

参数位置从0开始,引用参数语法#{arg位置},第一个参数是#{arg0},第二个是#{arg1}

注意:mybatis-3.3版本和之前的版本使用#{0},#{1}方式,从mybatis3.4开始使用#{arg0}方式。

//接口

/**

     * 按位传值

     */

List<User> selectByPosition(int p_id,String gender);

//mapper,sql映射文件

<!--    按位置传值-->

    <select id=" selectByPosition " resultType="org.example.daomain.User">

        SELECT * FROM TEST1 WHERE p_id=#{arg0} or gender=#{arg1};

    </select>


Mybatis-占位替$换列名

//接口

/**

     * 使用占位替换列名

     */

    List<User> selecUserOeder(@Param("myid") int id, @Param("myadress") String address);

//Mapper

<!--使用占位替换列名-->

    <select id="selecUserOeder" resultType="org.example.daomain.User">

        SELECT * FROM TEST1 order by #{myadress};

    </select>

//测试类

  @Test

    public void selecUserOeder(){

        SqlSession sqlSession =MyBatisUtils.getSqlSessionAuto();

        UserDao dao =sqlSession.getMapper(UserDao.class);

        List<User> users =dao.selecUserOeder(2,"深圳");

        users.forEach(user -> System.out.println(user));

    }

#和$区别

#使用?在sql语句中做站位的,使用PreparedStatement执行sql,效率高

#能够避免sql注入,更安全

$不能使用占位符,是字符串拼接的方式,使用Statement对象执行sql,执行

$有sql注入的风险,缺乏安全性。

$可以替代表名或者列名

#:占位符,告诉mybatis使用实际的参数值代替。并使用PrepareStatement对象执行sql语句,#{..}代替sql语句的”?”。这样做,安全,迅速,是首选做法,防SQL注入。

$字符串替换,告诉mybatis使用$包含的”字符串”替换所在位置。使用Statement把sql语句和${..}的内容连接起来(String+拼接方式)。主要用在替换表名,列名,不同列排序等操作。


Mybatis-Map传参(不推荐)

Map传参不推荐

Map集合可以存储多个值,使用Map想mapper文件一次传入多个参数

//接口

List<Student> selectMultiByMap(Map<String,Object> map);

//mapper,sql映射文件

<select id="selectMultiMap" resultType="org.example.daomain.User">

        SELECT * FROM TEST1 WHERE p_id=#{Mapp_id} or gender=#{gender};

    </select>

//测试类

//使用map传值

    @Test

    public void selecMulitByMap(){

        SqlSession sqlSession =MyBatisUtils.getSqlSessionAuto();

        UserDao dao =sqlSession.getMapper(UserDao.class);

        //

        Map<String,Object> data = new HashMap<>();

        data.put("Mapp_id",2);

        data.put("gender","女");

        //调用dao的方法,执行数据库的操作

        List<User> users = dao.selectMultiMap(data);

        users.forEach(user -> System.out.println(user));

    }

Map<String,object> data =new HashMap<>();
Date.put(“name”,”张三”);
Data.put(“age”,15);



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。