版权声明:Arno https://blog.csdn.net/yu342107056/article/details/86617184
类型别名,
写在总配置文件中,注意节点元素的顺序或位置
显示mybatis的日志信息
导入jar包 log4j-1.2.16.jar
拷贝log4j.properties到src的根目录中
sql语句块:
用sql标签定义一段sql通过include 引用进来
<sql id="select_user">
select
id,
username name,
userpassword password
from t_user
</sql>
<include refid="select_user"/>
例如:
<!-- 查询一个数据 -->
<select id="findUserById"
parameterType="java.lang.Integer"
resultType="com.tarena.entity.User">
<include refid="select_user"></include>
where id = #{id}
</select>
resultMap节点
<!-- 处理有关结果集列名字跟实体中的getter and setter方法不匹配问题
type="User" java的实体类型(通过<typeAlias type="com.tarena.entity.User" alias="User"/> 定义出来的User)
id="userMap" 唯一一个名称
<id 对应的是主键
<reslut 普通的属性或结果集的列
property:对应java实体类型(字段名称)中的getter and setter
column:结果集的列名字,注意不是数据表的字段名(select 后的字段名字,例如uname as name ,这里应该是name)
-->
<resultMap type="User" id="userMap">
<id property="id" column="id"/>
<result property="name" column="username" />
<result property="password" column="userpassword"/>
</resultMap>
<!-- 查询一个数据 -->
<select id="findUserById"
parameterType="java.lang.Integer"
resultMap="userMap">
<include refid="select_user"></include>
where id = #{id}
</select>
动态sql语句
if标签:
<!-- if标签
<if test=" name != null" 从user对象调用getName ,是否为null
不为null where age=20 and username=?
为null where age=20
-->
<select id="findUsersByIf"
parameterType="User"
resultMap="userMap">
<include refid="select_user"></include>
where userage=20
<if test="name != null">
and username=#{name}
</if>
<if test="address !=null">
and useraddress=#{address}
</if>
</select>
choose when otherwise标签:
<!-- choose when otherwise
有任何一个when条件成立,就拼装对应的sql语句
如果所有的when都不成立,就执行otherwise
-->
<select id="findUsersByChoose"
parameterType="java.util.Map"
resultMap="userMap">
<include refid="select_user"></include>
where userage=20
<choose>
<when test="uname !=null">
and username like #{uname}
</when>
<when test="uaddress !=null">
and useraddress like #{uaddress}
</when>
<otherwise>
and username like '%a%' and useraddress like '%北京%'
</otherwise>
</choose>
</select>
Where标签
<!-- Where标签
所有的if条件都不成立,就没有where关键字
至少有一个if条件成立,就添加where关键字
如果where关键字后有 and关键字,则自动去掉and
-->
<select id="findUsersByWhere"
parameterType="java.util.HashMap"
resultMap="userMap">
<include refid="select_user"></include>
<where>
<if test="uname != null">
username like #{uname}
</if>
<if test="uaddress !=null">
and useraddress like #{uaddress}
</if>
</where>
</select>
set 标签:只能用于更新操作
<!-- set标签
如果所有的if条件都不成立,就不会添加set关键字
如果至少有一个if条件成立,就会添加set关键字
如果第一个if成立,而第二个if不成立,会自动删除掉末尾的逗号
-->
<update id="updateUserBySet"
parameterType="java.util.Map">
update t_user
<set>
<if test="uname!=null">
username=#{uname},
</if>
<if test="uaddress !=null">
useraddress=#{uaddress}
</if>
</set>
where id=#{id}
</update>
trim标签(可以替换where标签和set标签)
<!-- trim 替换 where
prefix 前缀 where
select * from 表名 where
prefixOverrides 前缀覆盖
-->
<select id="findUsersByTrim1"
parameterType="java.util.Map"
resultMap="userMap">
<include refid="select_user"></include>
<trim prefix="WHERE" prefixOverrides="AND|OR ">
<if test="uname != null">
username like #{uname}
</if>
<if test="uaddress !=null">
and useraddress like #{uaddress}
</if>
</trim>
</select>
<!-- trim 替换 set
prefix 前缀 是set
suffixOverrides 后缀覆盖 多余的逗号去掉
-->
<update id="updateUserByTrim2"
parameterType="java.util.Map">
update t_user
<trim prefix="SET" suffixOverrides=",">
<if test="uname!=null">
username=#{uname},
</if>
<if test="uaddress !=null">
useraddress=#{uaddress}
</if>
</trim>
where id=#{id}
</update>
foreach标签:循环
<!-- foreach标签
delete from t_user where id in(1,2,3)
-->
<delete id="deleteUserByForeach"
parameterType="java.util.ArrayList">
delete from t_user
where id in
<foreach collection="list"
item="id"
open="("
close=")"
separator=","
index="index">
#{id}
</foreach>
</delete>
mybatis多表查询:
mybatis中只有
对一关联
对多关联
<!-- 关联映射关系开始 -->
<!-- 对一关联
<association节点 对一关联
-->
<resultMap type="User" id="userMap_orm">
<id property="id" column="id"/>
<result property="name" column="username" />
<result property="password" column="userpassword"/>
<result property="age" column="userage"/>
<result property="address" column="useraddress"/>
<association property="group"
javaType="com.arno.entity.Group">
<id property="id" column="gid"/>
<result property="name" column="groupname"/>
<result property="loc" column="grouploc"/>
</association>
</resultMap>
<select id="findUserById_ORM"
parameterType="java.lang.Integer"
resultMap="userMap_orm">
select
u.id,
u.username,
u.userpassword,
u.userage,
u.useraddress,
g.id gid,
g.groupname,
g.grouploc
from (
select * from t_user where id=#{uid}
) u
left join t_group g on u.group_id=g.id
</select>
<!-- 对多关联 -->
<resultMap type="com.tarena.entity.Group" id="groupMap_orm">
<id property="id" column="gid"/>
<result property="name" column="groupname"/>
<result property="loc" column="grouploc"/>
<collection property="users"
ofType="com.arno.entity.User"
javaType="java.util.List">
<id property="id" column="uid"/>
<result property="name" column="username" />
<result property="password" column="userpassword"/>
<result property="age" column="userage"/>
<result property="address" column="useraddress"/>
</collection>
</resultMap>
<select id="findGroupById_ORM"
parameterType="java.lang.Integer"
resultMap="groupMap_orm">
select
g.id gid,
g.groupname,
g.grouploc,
u.id uid,
u.username,
u.userpassword,
u.userage,
u.useraddress
from (
select * from t_group where id=#{gid}
) g
left join t_user u on u.group_id=g.id
</select>
<!-- 关联映射关系结束 -->