mybatis基础知识
SQL映射的XML文件
1.MyBatis 真正的力量是在映射语句中,专注于SQL,功能强大,SQL映射的配置却是相当简单
2.SQL映射文件的几个顶级元素(按照定义的顺序)
1.cache-配置给定命名空间的缓存
2.cache-ref-从其他命名空间引用缓存配置
3.resultMap-用来描述数据库结果集和对象的对应关系
4.sql-可以重用的SQL块,也可以被其他语句引用
5.insert-映射插入语句
6.update-映射更新语句
7.delete-映射删除语句
8.select-映射查询语句
<?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">
<!--namespace 包名+接口名 -->
<mapper namespace="cn.bdqn.dao.UserMapper">
<!-- 查询总记录数 通过namespace与id找到对应的sql语句 resultType:返回类型 parameterType:参数类型 -->
<select id="count" resultType="int">
select count(1) from user
</select>
<!--增加 -->
<insert id="add" parameterType="User">
insert into user(userCode,userName,userPassword)
values(#{userCode},#{userName},#{userPassword})
</insert>
<!-- 修改 -->
<update id="update" parameterType="User">
update user set userCode=#{userCode},userName=#{userName},userPassword=#{userPassword}
where id=#{id}
</update>
<!--删除 parameterType="User" 参数类型-->
<delete id="delete" parameterType="User">
delete from user where id=#{id}
</delete>
<!--查询 -->
<select id="getUserList" resultType="User">
select * from user
</select>
<!--type="User"后台的Javabean id唯一标识 被resultMap引用 -->
<resultMap type="User" id="userMap" property="userCode"实体类 column="userCode"对应的表的字段>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<result property="roleId" column="roleId"/>
<result property="roleName" column="roleName"/>
</resultMap>
<!--查询具体id下的角色 resultType="Role" 返回类型-->
<select id="getRoleById" resultType="Role" resultMap="userMap">
select u.*,r.roleName as roleName from user u,role r
where u.roleId=r.id and u.roleId=#{id}
</select>
<!--两表连查的时候 Javabean属性名 必须与数据库的字段名保持 一致 -->
<select id="getRoleById" parameterType="Role" resultType="User">
select u.*,r.roleName as roleName from user u,role r
where u.roleId=r.id and u.roleId=#{id}
</select>
resultType:直接表示返回类型
resultMap:对外部resultMap的引用
两者不能同时同在
id 在命名空间中唯一的标识符,可以被用来引用这条语句
parameterType 将会传入这条语句的参数类型的完全限定名或别名
resultType 从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形
那应该是集合可以包含的类型,而不能是集合本身。使用resultType或
resultMap,但不能同时使用。
resultMap 命名引用外部的resultMap
flushCache 将其设置为true,不论语句什么时候被调用,都会导致缓存被清空。默认值为false。
useCache 将其设置为true ,将会导致本条语句的结果被缓存,默认值为true.
timeout 这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。(默认不设置 )
fetchSize 这是暗示驱动程序每次批量返回的结果行数。
statementType STATEMENT,PREPARED或CALLABLE的一种。让MyBatis选择使用Statement,PreparedStatement或CallableStatement.默认值:PREPARED.
resultSetType FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设置(驱动自行处理)
1.resultMap-描述如何将结果集映射到Java对象
2.resultMap属性
id
type
3.resultMap子元素
id
result
association(当Javabean中有对象的时候用)
collection(当Javabean中有集合的时候用)
<!--根据roleId获取用户列表association start -->
<resultMap type="User" id="userMap">
<result property="id" column="id"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<!-- property="role" 是type="User" 对象的属性 javaType="Role"是对象属性的类型-->
<!-- <association property="role" javaType="Role">
<result property="id" column="r_id"/>
<result property="roleCode" column="roleCode"/>
<result property="roleName" column="roleName"/>
</association> -->
<association property="role" javaType="Role" resultMap="roleMap"></association>
</resultMap>
<!--第二种方式 外面引用resultMap -->
<resultMap type="Role" id="roleMap">
<result property="id" column="r_id"/>
<result property="roleCode" column="roleCode"/>
<result property="roleName" column="roleName"/>
</resultMap>
1.MyBatis 最强大的特性之一就是它的动态语句功能,使用动态SQL完成多条件查询
2.用于实现动态SQL的元素主要有
if
choose、when、otherwise
trim、where、set
foreach
<!-- 修改 -->
<update id="update" parameterType="Role">
update role
<trim prefix="set" prefixOverrides=",">
<if test="roleCode!=null and roleCode!=''">
roleCode=#{roleCode},
</if>
<if test="roleName!=null and roleName!=''">
roleName=#{roleName}
</if>
</trim>
where id=#{id}
</update>
<resultMap type="User" id="userMap2">
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<result property="roleId" column="roleId"/>
<result property="roleName" column="roleName"/>
</resultMap>
<!--concat防sql注入 -->
<select id="serachUserList" parameterType="User" resultMap="userMap2">
select u.*,r.roleName from user u,role r
where u.roleId=r.id
<if test="roleId!=null">
and u.roleId=#{roleId}
</if>
<if test="userCode!=null">
and u.userCode like CONCAT('%',#{userCode},'%')
</if>
<if test="userName!=null">
and u.userName like CONCAT('%',#{userName},'%')
</if>
</select>
<!--查询 -->
<select id="getRoleList" resultType="Role" parameterType="Role">
select * from role
<where>
<if test="roleName!=null">
and roleName like CONCAT('%',#{roleName},'%')
</if>
<if test="roleCode!=null">
and roleCode like CONCAT('%',#{roleCode},'%')
</if>
</where>
</select>
</mapper>