Mapper.xml
mapper映射文件***Mapper.xml<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">...
·
mapper映射文件***Mapper.xml
<?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">
<!--使用Mapper接口的动态代理方式开发(主流的Dao开发方式),开发规范是:-->
<!--1. 映射文件中配置的namespace必须是接口的类的全限定名-->
<!--2. 映射文件中配置的id必须和接口的方法名一致-->
<!--3. 映射文件中配置的parameterType必须和接口的方法参数类型一致-->
<!--4. 映射文件中配置的resultType必须和接口的方法返回值类型一致-->
<mapper namespace="com.mybatis.dao.UserDao">
<!-- 一般情况下,一个数据库表有一个对应的Mapper.xml映射 -->
<!-- id在编写的时候和数据库表名有关系 -->
<!-- ////////////////////////////////- -分割线- -////////////////////////////////////////// -->
<!-- 根据id查询用户 -->
<!-- select:用户查询操作,标签内部配置的是sql语句 -->
<!-- id:statement的id,或者叫做sql的id -->
<!-- parameterType:参数的数据类型 -->
<!-- 参数的参数类型应该是全路径类型java.lang.Integer,但是mybatis提供了全路径的简写方式 -->
<!-- resultType:设置返回值的数据类型(类型的全路径) -->
<!-- #{id}:相当于操作数据库的?占位符,传输单个简单类型值,{}里面是任意值,但是不能空着不写 -->
<select id="queryUserById" parameterType="int" resultType="com.crud.pojo.User">
SELECT * FROM USER where id = #{id}
</select>
<!-- 根据用户名模糊查询出多个用户数据,方法一 -->
<!-- 返回的结果是List集合,ResultType里面应该配置集合中的元素 -->
<!-- 日志的输出内容 -->
<!--Preparing: SELECT * FROM `user` WHERE username LIKE ?-->
<!--Parameters: %丽%(String)-->
<select id="queryUserByName" parameterType="string" resultType="com.crud.pojo.User">
SELECT * FROM USER WHERE username LIKE #{username}
</select>
<!-- 根据用户名模糊好擦U型你出多个用户数据,方法二 -->
<!-- #{username} == ${value} -->
<!-- ${value}:就是sql语句的拼接,传输单个简单类型值,只能是value这个字符串 -->
<select id="queryUserByName2" parameterType="string" resultType="com.crud.pojo.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
<!-- 保存用户数据 -->
<!-- parameterType:参数类型,如果是简单数据类型,可以简写,如果是自定义对象,写全限定路径 -->
<!-- 如果参数类型不是简单数据类型,,#{}里面的值不能乱写,应该和pojo的属性名对应 -->
<!-- mybatis根据pojo的属性名把属性值进行注入 -->
<insert id="saveUser" parameterType="com.crud.pojo.User">
-- 需要用户保存成功后,返回自增主键
-- 使用selectKey:里面需要填写查询语句:select last_insert_id(); 也就是查询最后一个插入的id
-- keyProperty:pojo的哪个属性是主键
-- keyColumn:数据库查询结果的哪个属性是主键
-- resultType:返回主键的数据类型
-- order:查询主键应该在插入sql之前执行还是之后执行,AFTER:之后,BEFORE:之前
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
SELECT last_insert_id()
</selectKey>
INSERT INTO USER (
username,
birthday,
sex,
address
)
values(
#{username},
#{birthday},
#{sex},
#{address}
)
</insert>
<!-- 更新用户数据 -->
<!-- parameterType:请求参数类型 -->
<update id="updateUser" parameterType="com.crud.pojo.User">
UPDATE `user` SET username=#{username} WHERE id = #{id}
</update>
<!-- 根据id删除用户 -->
<delete id="deleteUserbyId" parameterType="int">
DELETE FROM user WHERE id = '${value}'
-- DELETE FROM user WHERE id = #{id}
</delete>
<!-- 查询所有数据,desc查询不到 -->
<!-- 如果pojo的属性名,和数据库查询的结果的列名不一致,数据库就不能成功映射到pojo的数据中 -->
<!-- 原来的开发方式,就是使用resultType的开发方式,把查询结果的值通过名字注入进来,pojo的属性名和列名要保持一致 -->
<!-- 如果属性名和列名不一致,只能使用resultMap -->
<select id="queryUserTypeAll" resultType="usertype">
SELECT * FROM usertype
</select>
<!-- 配置resultMap -->
<!-- id:就是resultMap的名字,通过id进行使用 -->
<!-- type:这里虽然是使用的resultMap,但是最终数据还是要映射到pojo中,所以type就是返回的pojo类型 -->
<!-- autoMapping:如果数据库的列名和pojo的属性名一致就实现自动映射 -->
<resultMap id="userTypeResultMap" type="usertype" autoMapping="true">
<!-- id:配置主键,必须设置 -->
<!-- property:配置pojo的哪个属性是主键 -->
<!-- column:配置数据库的哪一列是主键 -->
<!-- result:配置主键外的其他属性 -->
<id property="t_id" column="t_id"/>
<result property="desc" column="t_explain"/>
</resultMap>
<!-- 查询所有数据,解决desc不能查询数据的问题 -->
<!-- 使用resultMap -->
<select id="queryUserTypeAllResultMap" resultMap="userTypeResultMap">
SELECT * FROM usertype
</select>
<!-- 根据用户名和性别查询用户 -->
<!-- 如果sex没有,sql语句会执行sex=null的查询,就造成查询结果不符合业务需求,业务是如果sex=null就不查询sex-->
<!-- 需要使用动态sql解决这个问题 -->
<!-- if标签:动态sql判断,可以在test里面填写判断条件,mybatis会根据判断的结果,决定是否在sql中显示if标签内的sql代码 -->
<!-- where标签:1:自动添加where关键词2:自动去掉where后面的第一个and关键词 -->
<select id="queryUserByUsernameAndSex" parameterType="user" resultType="user">
SELECT <include refid="fields"/> FROM user
<where>
<if test="sex != '' and sex != null">
AND sex = #{sex}
</if>
<if test="username != null and username != ''">
AND username LIKE #{username}
</if>
</where>
</select>
<!-- 如果多个功能的sql语句,有一段sql是相同的,最好把sql片段提取出来,只有一个地方编写管理,降低维护成本 -->
<!-- 使用sql片段,其实就是sql标签,使用sql标签可以提高代码的复用性 -->
<!-- id:sql片段的名字,哪里需要哪里使用,就在哪里引用id -->
<sql id="fields">
id,username,birthday,sex,address
</sql>
<select id="queryUserByQueryVo" parameterType="queryvo" resultType="user">
SELECT <include refid="fields"/> FROM USER
<where>
-- 目标:拼接sql片段,id in (1,3,5,6)
-- collection:就是存放参数的集合,填写pojo的参数名
-- item:就是遍历集合的变量,用来存放当前遍历的是哪个值,相当于for(User user : list)中到的user,item的值是任意的
-- open:sql片段的开始的部分,不包括集合的值
-- close:sql片段结束的部分
-- separator:遍历的多个值中间用什么进行隔离
-- index:步增值
<foreach collection="ids" item="item" open="id in (" close=")" separator="," index="1">
#{item}
</foreach>
</where>
</select>
<!-- 一对一查询,查询账户和对应的用户数据,方法一 -->
<select id="qeuryAccountUserAll" resultType="accountuser">
SELECT a.*, u.username, u.address FROM account a LEFT JOIN user u ON a.uid = u.id
</select>
<!--配置一对一查询方案二的ResultMap-->
<!--type就是最终需要映射的pojo,返回值就是这个pojo-->
<!--第一个层级resultMap下的直接子元素是配置的返回结果account的pojo数据-->
<!--autoMapping:配置自动映射,如果名字一样,就能把值映射成功-->
<resultMap id="accountResultMap" type="account" autoMapping="true">
<!--配置的Account的主键-->
<id property="id" column="id"/>
<result property="uid" column="uid"/>
<result property="money" column="money"/>
<!--association:用于配置一对一关联查询的,property就是返回结果account的pojo对应的哪一个属性-->
<!--javaType:就是这个属性的类型,必须写全限定名,也可以使用别名-->
<association property="user" javaType="user" autoMapping="true">
<!--在这里面配置的是user这个pojo的相关数据-->
<!--配置的User的主键-->
<!--property就是pojo的属性名,column查询数据库结果的列-->
<id property="id" column="uid"/>
<!--配置的User除主键以外的属性-->
<result property="username" column="username"/>
<result property="address" column="address"/>
</association>
</resultMap>
<!--一对一查询,查询账号和对应的用户数据,方案二(使用ResultMap)-->
<select id="queryAccountAll" resultMap="accountResultMap">
SELECT a.*,u.username,u.id,u.address FROM account a LEFT JOIN `user` u ON a.UID=u.id
</select>
<!-- 配置ResultMap -->
<resultMap id="resultMap" type="user" autoMapping="true">
<id property="id" column="id"/>
<!-- 配置一对多的管理查询 -->
<!-- javaType:属性的类型,这里使用的是list集合,可以省略该配置 -->
<!-- ofType:就是集合里面的元素 -->
<collection property="accounts" javaType="list" ofType="Account" autoMapping="true">
<id property="id" column="aid"/>
</collection>
</resultMap>
<!--查询所有的用户数据,使用一对多的方式,查询该用户的所有账号信息-->
<select id="queryUserAll" resultMap="resultMap">
SELECT a.*,u.username,u.address FROM account a LEFT JOIN `user` u ON a.UID=u.id
</select>
<!-- <cache/> 表示在这个映射文件的范围开启二级缓存 -->
<!-- 添加这个标签后,在需要使用二级缓存的地方添加useCache="true"这个配置 -->
<cache/>
<!-- 根据id查询用户数据 -->
<!-- 这里是给账户延时加载用户使用的 -->
<!-- 账户在延时加载的时候,账户会把用户的id也就是uid传过来 -->
<!-- 这里就可以通过uid查询到所对应的用户 -->
<select id="queryUserById" parameterType="int" resultType="user" useCache="true">
SELECT * FROM user where id = #{id}
</select>
<!-- 配置resultMap -->
<resultMap id="map" type="user" autoMapping="true">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="birthday" column="birthday"/>
<result property="sex" column="sex"/>
<result property="address" column="address"/>
<collection property="accounts"
ofType="account"
column="id"
select="com.mybatis_4_2.mapper.AccountMapper.queryAccountById">
</collection>
</resultMap>
<!-- 查询所有用户数据,使用延时加载获取账户数据 -->
<select id="queryUserAll" resultMap="map">
SELECT * FROM user
</select>
</mapper>

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)