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

posted on 2018-10-28 16:26  Cyan_W  阅读(321)  评论(0编辑  收藏  举报

导航