• Mybatis输入类型和结果类型


    参数类型:

    •          简单类型:引用时名称随便写

                         基本数据类型

                         基本数据类型的包装类型

                         String

    •          pojo对象:引用时写实体类的属性名

                         #{name},引用的是实体类User中的name属性

    public class QueryVo {
    
    // 包含其他的pojo
    
    private User user;
    
    private Integer startIndex;
    
    private Integer pageSize;
    
    }
    <!--#{user.name}  引用属性中的属性名-->
    <select id="findUserByQueryVo" parameterType="queryVO" resultType="user">
        select * from user where name like "%"#{user.name}"%" limit #{startIndex},#{pageSize}
    </select>

    1.传递的多个参数

    /**
    * 多条件查询
    */

    public List<User> findUsers(Integer startIndex, Integer pageSize, String name);

     parameterType:省略不配置

         引入时: param1 ,param2,......

    <select id="findUsers" resultType="user">
    
        select * from user where name like "%"#{param3}"%" limit #{param1},#{param2}
    
    </select>

    2.传递map

    //获取session
    SqlSession session = sessionFactory.openSession();
    //通过getMapper方法获取某接口的动态代理类对象
    UserDao userDao = session.getMapper(UserDao.class);
    
    Map<String,Object> map = new HashMap<>();
    map.put("startIndex",2);
    map.put("pageSize",2);
    map.put("name","zhang");
    
    List<User> userList = userDao.findUserByMap(map);

            属性名自己指定

            引用时引用属性名即可

    <select id="findUserByMap" parameterType="map" resultType="User">
    
        select * from user where name like "%"#{name}"%" limit #{startIndex},#{pageSize}
    
    </select>

    返回值

       <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->

       <!-- id:设置ResultMap的id -->

       <resultMap id="users" type="user">

           <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->

           <!-- property:主键在pojo中的属性名 -->

           <!-- column:主键在数据库中的列名 -->

      <id property="id" column="id" />

     

    <resultMap id="users" type="user">
        <id column="u_id" property="id"></id>
        <result column="name" property="name"></result>
        <result column="address" property="address"></result>
        <result column="birthday" property="birthday"></result>
        <result column="sex" property="sex"></result>
    </resultMap>
    
     
    
    <select id="findAll" resultMap="users">
    
       select * from sys_user
    
    </select>

    根据id查询

    <!--根据id查询-->

        <!--parameterType:指定参数类型-->

        <!--简单类型:基本数据类型&包装类型   String

            如果参数是简单类型,引用时名称随便写-->

    <!--根据id查询-->

    <select id="findById" resultType="com.wqy.domain.User" parameterType="java.lang.Integer">
        select * from user where id = #{id}
    
    </select>
    select * from user where id = #{abc}
    select * from user where id = #{id}

    模糊查询

    <!--

            参数类型:pojo对象,引用实体类中的属性名

            #{name},引用的是实体类中的name属性

        -->

    <!--模糊查询-->
    //第一种
    <select id="findByUser" parameterType="com.wqy.domain.User" resultType="com.wqy.domain.User"> SELECT * from user WHERE name LIKE "%"#{name}"%" </select> //第二种 <select id="findByName" resultType="com.wqy.domain.User" parameterType="java.lang.String"> SELECT * from user WHERE name LIKE "%"#{abc}"%" </select>

    #{} 和${}

    关于#{}:

    1、#{}等同于 PreparedStatement 中的占位符?,会自动对传入的字符串数据加一对单引号,可以避免 Sql 注入。

             比如

             select * from user where username = #{username} ,  传入的 username 为小张,那么最后打印出来的就是

             select * from user where username = ‘小张’

    2、#{}可以接收简单类型值或 Pojo 属性值。

             如果 parameterType 传输单个简单类型值,#{}括号中可以是任意名称。

    关于${}:

    1、${}将传入的数据直接显示生成在 Sql 中,只是简单的拼接。

             如:order by ${id},如果传入的值是 id,则解析成的 Sql 为 order by id。

             如果上面的例子使用${},则成了 select * from user where username = 小张

    2、${}可以接收简单类型值或 Pojo 属性值,

             如果 parameterType 传输单个简单类型值,${}括号中只能是“value”这个字符串

    <!--模糊查询-->
    <select id="findByUser" parameterType="com.wqy.domain.User" resultType="com.wqy.domain.User">
        SELECT * from user WHERE name LIKE "%"#{name}"%"
    </select>

    user.setName("Rose");

    "%"#{name}"%"     Rose
    #{name}           %Rose%
    ${name}          '%Rose%'
    '%${name}%'      Rose

    <select id="findByName" resultType="com.wqy.domain.User" parameterType="java.lang.String">
        SELECT * from user WHERE name LIKE "%"#{abc}"%"
    </select>

    "%"#{abc}"%"   Rose

    '%${value}%'   Rose

         如果传递的是简单类型参数,必须使用${value}

         如果是pojo, 必须${属性名}

     

    总结:

    1、$方式一般用于传入数据库对象,例如传入表名、order by 的字段

    2、一般能用#的就别用$.

    增加用户

    <insert id="addUser" parameterType="com.wqy.domain.User">
        INSERT INTO user values (null,#{name},#{age})
    </insert>

    <!--
           selectKey: 查询键值
               属性:order:在添加之前查询,还是之后查询
                     keyProperty: 对应pojo对象中的属性名
                     keyColumn: 对应数据库中某列
                     resultType: 返回值类型
                select last_insert_id(): 是mysql数据库的一个函数,获取该表最后一次添加的自增的值
       -->

    <insert id="addUser" parameterType="com.wqy.domain.User">
        <selectKey order="AFTER" keyProperty="id" keyColumn="id" resultType="java.lang.Integer">
            SELECT last_insert_id();
        </selectKey>
        INSERT INTO user values (null,#{name},#{age})
    </insert>
    sqlSession.insert("com.wqy.dao.UserDao.addUser", user);
    System.out.println(user.getId());

    在执行插入操纵后,可以打印用户的id

  • 相关阅读:
    网站常见的反爬虫和应对方法 + [评论]
    斯坦福大学自然语言处理第一课——引言(Introduction)
    爬虫入门实战,知乎小爬虫
    使用情感分析技术做营销
    字符串匹配的KMP算法
    向Array中添加希尔排序
    向Array中添加二分插入排序
    向Array中添加插入排序
    开辟我的前端之旅!
    【apache】yum 安装Apache(Centos 6.5)
  • 原文地址:https://www.cnblogs.com/Cyan-W/p/9866013.html
Copyright © 2020-2023  润新知