mybatis 核心:动态sql(自己写sql语句来实现复杂的逻辑)
所有的框架都是一个半成品,所以有些特殊的需求需要自己封装jdbc,一般企业百分之八九十的需求都可以满足;
联合查询:在实体类里面直接注入;提供get和set方法;
如果数据库的名字和实体类的名字不一样,查询如下(可以注意名字,直接查询,这样查询显得很复杂):
<!--resultMap 相当于返回结果集;id必须是resultMap值;type代表返回值类型(可给别名)
<id property=""><id>只代表id 标签的实体类的属性名,column数据列名
其他的不是id的属性就是用这个名称result
mybatis 的封装是数据库的列名,必须和实体bean的属性名相同;用resultMap的情况:
第一种:数据库列名和属性名不匹配时;第二种是复杂查询时(一对一,一对多)
property:是类里面的属性名字;column:是数据库的名字;这里是通过映射给值的;
-->
<resultMap id="selectByMapResult" type="User">
<id property="id" column="id"></id>
<result property="userName" column="userName"></result>
<result property="userRole" column="userRole"></result>
</resultMap>
<select id="selectByMap" resultMap="selectByMapResult" parameterType="Map">
select u.*,r.roleName from smbms_user u,smbms_role r
where userName like concat('%',#{userName},'%') and
userRole=#{userRole} and userRole=r.id;
</select>
一对一或者一对多的时候:
<resultMap id="selectByRoleResult" type="User">
<id property="id" column="id"></id>
<result property="userName" column="userName"></result>
<result property="userRole" column="userRole"></result>
<!--在mybatis配置一对一的关系,拿到的是属性名;javaType代表返回的类型,可以给别名 如果是一对多的时候这里的--ofType-->
<association property="role" javaType="Role">
<id property="id" column="r_id"></id>
<result property="roleName" column="roleName"></result>
<result property="roleCode" column="roleCode"></result>
</association>
</resultMap>
<select id="selectByRole" parameterType="User" resultMap="selectByRoleResult">
select u.*,r.id as r_id,r.roleName,r.roleCode from smbms_user u,smbms_role r
where userName like concat('%',#{userName},'%') and
userRole=#{userRole} and userRole=r.id
</select>
resultMap 和 association 里面的数据库id映射的名字不能相同;
动态sql:
if 标签;
where标签 会默认的去除你的or 或者 and符号
trim标签(里面的属性:prefix加前缀;prefixOverrides去除第一个不需要的and符号;suffix是加后缀
suffixOverrides去除最后个不需要的符号或关键字)
<select id="selectAllLike" resultType="User">
select u.*,r.roleName from smbms_user u,smbms_role r
<trim prefix="where" prefixOverrides="and" suffix="and userRole=r.id">
<if test="userRole !=null">
and userRole=#{userRole}
</if>
<if test="userName != null and userName !=''">
and userName like concat('%',#{userName},'%')
</if>
</trim>