SQL映射文件
一、掌握通过SQL映射文件进行增删该查
1.查询操纵
-id:对应的接口的方法名
-parameterType:对应接口的参数类型
-resultType:对应接口的返回值类型
-resultMap:对应接口的自定义映射返回值类型
2.insert update delete 三个标签都没有返回值类型,他们默认返回值类型都是int(表示影响行数)
①增加操作
insert into smbms_user (userCode,userName,userPassword) values(#{userCode},#{userName},#{userPassword})@Test
void testInsertUser() {
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUserCode("charles");
user.setUserName("Charles");
user.setUserPassword("12345667");
int row = userMapper.insertUser(user);
System.out.println(row);
sqlSession.commit(); // 增删改必须进行提交事务
} catch (Exception e) {
sqlSession.rollback(); // 出现异常 回滚事务
e.printStackTrace();
}finally {
MyBatisUtils.closeSqlSession(sqlSession);
}
}
②修改操作
update smbms_user set userPassword = #{newPwd} where id = #{id}③删除操作
二、掌握参数的使用
public interface UserMapper {
// [推荐]如果参数不超过3个,使用@Param来传递!超过3个之后,可以使用对象/Map集合
// 如果是固定业务,那么还是推荐@Param来推荐
/**
* 根据用户名和用户角色模糊查询用户列表【使用Map集合来传递两个参数】
* @param map
* @return
*/
List<User> getUserListByMap(Map<String, Object> map);
/**
* 根据用户名和用户角色模糊查询用户列表【使用对象来传递两个参数】
* @param user
* @return
*/
List<User> getUserListByUser(User user);
/**
* 根据用户名和用户角色模糊查询用户列表【使用注解解决多个参数传值】
* Param注解表示告诉MyBatis 参数是哪些
* @param username
* @param userRole
* @return
*/
List<User> getUserListByUsernameAndUserRole(@Param("name")String username,@Param("roleId")int userRole);
/**
* 获取用户记录数
* @return
*/
int getUserCount();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.smbms.dao.user.UserMapper">
<!-- List<User> getUserListByMap(Map<String, Object> map); -->
<!-- 如果传输的是map集合 那么获取对应集合中的信息时 采用根据键获取值#{map的键名} -->
<select id="getUserListByMap" resultType="User" parameterType="map">
select *
from smbms_user
where userName like CONCAT('%',#{name},'%')
and userRole = #{roleId}
</select>
<!-- List<User> getUserListByUser(User user); -->
<!-- 如果传输的参数是对象 那么在获取对应对象的属性值时 直接以#{属性名} 获取即可 当然必须保证此属性有getter方法 -->
<select id="getUserListByUser" resultType="User" parameterType="User">
select *
from smbms_user
where userName like CONCAT('%',#{userName},'%')
and userRole = #{userRole}
</select>
<!-- List<User> getUserListByUsernameAndUserRole(@Param("name")String username,@Param("roleId")int userRole); -->
<!-- 采用@Param注解 不再需要提供paramterType属性 -->
<!-- 获取对应值 必须通过@Param注解里的名来获取 -->
<select id="getUserListByUsernameAndUserRole" resultType="User">
select *
from smbms_user
where userName like CONCAT('%',#{name},'%')
and userRole = #{roleId}
</select>
<!-- int getUserCount(); -->
<select id="getUserCount" resultType="_int">
select count(1)
from smbms_user
</select>
</mapper>
三、掌握resultMap
1. 一般情况下的自定义映射
```xml
<!-- List<User> getUserListByUsernameAndUserRole(@Param("name")String username,@Param("roleId")int userRole); -->
<!-- 采用@Param注解 不再需要提供paramterType属性 -->
<!-- 获取对应值 必须通过@Param注解里的名来获取 -->
<!-- MyBatis映射是SQL语句和Java对象的映射 如果是查询类SQL 那么映射返回的是将结果集(查询结果) 和 Java对象属性一一对应赋值 -->
<!--
id:标识自定义映射规则的名称
type:最终映射成的类型
-->
<resultMap type="User" id="user_role">
<!-- 专门用于主键映射 设定之后可以提升映射性能 -->
<!--
column:表示数据库单位里的列名
property:表示Java对象单位的属性名
-->
<id column="id" property="id"/>
<!-- 【在一般情况下】自定义映射可以只指定不一样的映射情况 其他的如果列名和属性名还是一致 则依旧自动映射 -->
<!-- <result column="userName" property="userName"/>
<result column="userCode" property="userCode"/> -->
<!-- .... -->
<result column="roleName" property="userRoleName"/>
</resultMap>
<!-- resultMap:自定义映射返回结果(当你的对象和结果集 无法对应的时候<无法自动映射的时候> 可以自行进行映射指定 ) -->
<select id="getUserListByUsernameAndUserRole" resultMap="user_role">
select u.*,r.roleName as roleName
from smbms_user u,smbms_role r
where u.userName like CONCAT('%',#{name},'%')
and u.userRole = #{roleId}
and u.userRole = r.id
</select>
<!-- <select id="getUserListByUsernameAndUserRole" resultType="User">
select u.*,r.roleName as userRoleName
from smbms_user u,smbms_role r
where u.userName like CONCAT('%',#{name},'%')
and u.userRole = #{roleId}
and u.userRole = r.id
</select> -->
-
复杂类型 一对一asccociation
<!-- List<User> getUserListByUsernameAndUserRole(@Param("name")String username,@Param("roleId")int userRole); --> <resultMap type="User" id="user_role"> <id column="id" property="id"/> <result column="userCode" property="userCode"/> <!-- 映射类型中对象属性 --> <!-- property:在此类型中的属性名 --> <!-- javaType:最终此属性和哪个类型进行映射 --> <association property="role" javaType="Role"> <id column="rid" property="id"/> <result column="roleName" property="roleName"/> <result column="roleCode" property="roleCode"/> </association> </resultMap> <!-- resultMap:自定义映射返回结果(当你的对象和结果集 无法对应的时候<无法自动映射的时候> 可以自行进行映射指定 ) --> <select id="getUserListByUsernameAndUserRole" resultMap="user_role"> select u.*,r.id as rid,r.roleCode as roleCode,r.roleName as roleName,r.createdBy as createdBy from smbms_user u,smbms_role r where u.userName like CONCAT('%',#{name},'%') and u.userRole = #{roleId} and u.userRole = r.id </select>
-
复杂类型一堆多 collection
<resultMap type="User" id="user_address"> <id column="id" property="id"/> <!-- ofType:泛型类型 --> <collection property="addressList" ofType="Address"> <result column="contact" property="contact"/> </collection> </resultMap> <!-- List<User> getUserListWithAddressList(@Param("name")String username,@Param("roleId")int userRole); --> <select id="getUserListWithAddressList" resultMap="user_address"> select u.*,a.contact,a.addressDesc,a.postCode,a.tel from smbms_user u,smbms_address a where u.id = a.userId and u.userName like CONCAT('%',#{name},'%') and u.userRole = #{roleId} </select>