参数类型:
- 简单类型:引用时名称随便写
基本数据类型
基本数据类型的包装类型
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