Mybatis 使用之SQL映射的xml文件(详细叙述)

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>

总结:

1、支持基础数据类型和复杂数据类型

参数入参统一用【@Param(“参数名”)】注解

(1)单参数入参:java的基本数据类型

(2)多参数入参:java实体类或封装成的Map

2、大小写不敏感

原创文章 28 获赞 41 访问量 1034

猜你喜欢

转载自blog.csdn.net/wenquan19960602/article/details/104316476