SQL映射文件的几个顶级元素(按照定义的顺序)
mapper - namespace(唯一的属性)
cache - 配置给定命名空间的缓存
cache-ref - 从其他命名空间引用缓存配置
resultMap - 用来描述数据库结果集和对象的对应关系
sql - 可以重用的sql块,也可以被其他语句引用
insert - 映射插入语句
update - 映射更新语句
delete - 映射删除语句
select - 映射查询语句
1、mapper
namespace : 命名空间
namespace和子元素的id联合保证唯一,区别不同的mapper
绑定dao接口:
namespace命名必须跟某个接口同名
接口中的方法与映射文件中SQL语句id 一一对应
mapper示例写法:
<mapper namespace = "cn.kgc.tangcco.dao.user.UserMapper">
<select id = "getUserList" ...>
...
</select>
</mapper>
2、select元素
id:
命名空间中唯一的标识符
接口中的方法与映射文件中的SQL语句id 一一对应
parameterType:
传入SQL语句的参数类型的完全限定名或别名
resultType:
SQL语句返回值类型的完整类名或别名
(1)支持基础数据类型和复杂数据类型
(2)大小写不敏感
参数传递:#{参数名}
例:
String sql = "select * from smbms_user where userName like CONCAT('%',?,'%'); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1,userName);
//两种写法:根据具体的情况去决定使用的位置
//1、
String sql = "select * from smbms_user where userName like CONCAT('%',?,'%');
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,userName);
//2、
String sql = "select * from smbms_user
where userName like CONCAT('%',#{userName},'%')"
select元素:
<!--根据用户名称查询用户列表(模糊查询)-->
<select id="getUserListByUserName" parameterType="string" resultType="user">
select * from smbms_user
where userName like CONCAT('%',#{userName},'%')
</select>
select—>parameterType
基本数据类型:
int ,String,Date等
只能传入一个,通过#{参数名}即可获取传入的值
复杂数据类型
java实体类、Map等
通过#{属性名}或者#{Map的key}即可获取传入值
例:
Map<String,String> userMap = new hasMap<String,String>();
userMap.put("uName","赵");
userMap.put("uRoel","2");
//对应卸载mapper.xml中的查询语句
<!-- 查询用户通过Map-->
<select id="getUserListByMap" resultType="user" parameterType="Map">
select * from smbms_user
where userName like CONCAT('%',#{uName},'%')
and userRole = #{uRole}
</select>
3、resultMap——自定义映射结果(描述如何将结果映射到java对象)
自动映射匹配前提(字段名与属性名一致)
自动映射匹配级别(autoMappingBehavior):
PARTIAL(默认):自动匹配所有属性
<settings>
<setting name="logImpl" value="LOG4J"/>
<!--自动映射级别,如果不设置的话,就是默认为PARTIAL,(自动匹配所有属性),NONE(禁止自动匹配所有属性) -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
</settings>
(1)resultType:直接表示返回类型
基础数据类型
复杂数据类型
(2)resultMap:对外部resultMap的引用
应用场景:
数据库字段信息与对象属性不一致
复杂的联合查询,自由控制映射结果
注意:二者不能同时存在,本质上都是map数据结果
<!-- resultMap的实用是为了避免,数据库和实体类中的名称有不符合的导致查询无法实现 -->
<resultMap type="user" id="userList">
<result property="id" column="id"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<result property="phone" column="phone"/>
<result property="birthday" column="birthday"/>
<result property="userRole" column="userRole"/>
<result property="userRoleName" column="roleName"/>
</resultMap>
<!-- 查询用户列表(连表查询) -->
<select id="getUserList" resultMap="userList" parameterType="user">
select u.*,r.roleName from smbms_user u,smbms_role r
where userName like CONCAT('%',#{userName},'%')
and userRole = #{userRole} and u.userRole = r.id
</select>
4、实现增删改操作(insert update delete )【@Param注解实现参数入参】
增删改一般情况下,我们将返回类型设置为 int 类型,即返回数据库修改的行数。
注意:insert、update、delete元素均没有resultType属性
(1)insert(有两个元素 id , parameterType)
示例代码:
<!--增加操作 -->
<insert id="add" parameterType="User">
insert into smbms_user(userCode,userName,userPassword)
values(#{userCode},#{userName},#{userPassword})
</insert>
(2)update(两个属性 id、parameterType)
示例代码:
<!--修改操作 -->
<update id="modify" parameterType="User">
update smbms_user set userCode = #{userCode},userName = #{userName} ,userPassword = #{userPassword},
gender=#{gender}, birthday = #{birthday} ,phone=#{phone} ,address=#{address},userRole =#{userRole},
modifyBy =#{modifyBy},modifyDate = #{modifyDate}
where id = #{id}
</update>
(3)delete(两个属性 id、parameterType)
示例代码:
<!--删除用户表数据 -->
<delete id="deleteUserById" parameterType="int">
delete from smbms_user where id = #{id}
</delete>