<!--保存用户--> <!--新增用户后,同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相 当于我们要在新增后将自动增长 auto_increment 的值返回--> <insertid="saveUser"parameterType="com.conv.domain.User"> <!-- 配置插入操作后,获取插入数据的id --> <selectKeykeyProperty="id"keyColumn="id"resultType="int"order="AFTER"> select last_insert_id(); </selectKey> insert into user(username, birthday, sex, address) values (#{username},#{birthday},#{sex},#{address}); </insert>
<!--更新用户--> <updateid="updateUser"parameterType="com.conv.domain.User"> update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id = #{id}; </update>
<!--删除用户--> <!--parameterType可以写Integer、INT、java.lang.Integer(不区分大小写)--> <deleteid="deleteUser"parameterType="Integer"> delete from user where id = #{uid} </delete>
<!--根据id查询用户--> <selectid="findById"parameterType="Int"resultType="com.conv.domain.User"> select * from user where id = #{uid} </select>
<!--根据名称模糊查询用户信息--> <selectid="findByName"parameterType="string"resultType="com.conv.domain.User"> <!-- 常用 --> <!--select * from user where username like #{uname}-->
<!-- 不常用,会造成Sql注入 --> select * from user where username like '%${value}%'; </select> <!--查询总用户数--> <selectid="findTotal"resultType="int"> select count(id) from user ; </select>
<!--根据名称模糊查询用户信息--> <selectid="findByName"parameterType="string"resultType="com.conv.domain.User"> <!-- 常用 --> select * from user where username like #{uname};
<!-- 不常用,会造成Sql注入 --> <!--select * from user where username like '%${value}%';--> </select>
结论
这两种方式的实现效果是一样的,但执行的语句是不一样的。
select * from user where username like #{uname};`
对应的查询方法需要加上%:
List<User> users = userDao.findByName("%小%");
在控制台输出的执行 SQL 语句如下:
Preparing: select * from user where username like ? Parameters: %小%(String)
使用的是 Preparedstatement,不会造成 SQL 注入问题
select * from user where username like '%${value}%';
对应的方法无需加%:
List<User> users = userDao.findByName("小");
在控制台输出的执行 SQL 语句如下:
Preparing: select * from user where username like ‘%小%’;
<!--根据 queryVo 中的条件查询用户--> <selectid="findUserByVo"parameterType="com.conv.domain.QueryVo"resultType="com.conv.domain.User"> select * from user where username like #{user.username}; </select>
测试包装类作为参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/** * 测试使用QureyVo作为查询条件 */ @Test publicvoidtestFindByVo(){ //执行方法 QueryVo vo = new QueryVo(); User user = new User(); user.setUsername("%王%"); vo.setUser(user);
<!-- 配置查询所有操作 --> <selectid="findAll"resultType="com.itheima.domain.User"> select id as userId, username as userName, birthday as userBirthday, sex as userSex, address as userAddress from user </select>
2. 使用 resultMap
resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。
在 select 标签中使用 resultMap 属性指定引用即可。
同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
<!-- 建立 User 实体和数据库表的对应关系 type 属性:指定实体类的全限定类名 id 属性:给定一个唯一标识,是给查询 select 标签引用用的。 --> <resultMaptype="com.itheima.domain.User"id="userMap"> <idcolumn="id"property="userId"/> <resultcolumn="username"property="userName"/> <resultcolumn="sex"property="userSex"/> <resultcolumn="address"property="userAddress"/> <resultcolumn="birthday"property="userBirthday"/> </resultMap> <!-- id 标签:用于指定主键字段 result 标签:用于指定非主键字段 column 属性:用于指定数据库列名 property 属性:用于指定实体类属性名称 -->
映射配置
1 2 3 4 5
<!-- 配置查询所有操作 --> <!-- resultyMap 属性是上面的 id 属性的值 --> <selectid="findAll"resultMap="userMap"> select * from user </select>