SQL 映射文件

2023-10-27

SQL 映射文件

SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):

  • cache – 对给定命名空间的缓存配置。

  • cache-ref – 对其他命名空间缓存配置的引用。

  • resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。 (映射)

  • parameterMap – 已被废弃!老式风格的参数映射。更好的办法是使用内联参数,此元素可能在将来被移除。文档中不会介绍此元素。

  • sql – 可被其他语句引用的可重用语句块。

  • insert – 映射插入语句

  • update – 映射更新语句

  • delete – 映射删除语句

  • select – 映射查询语句

<select> 查询操作

  • id:对应接口的方法名
  • parameterType:对应接口的参数类型
  • resultType:对应接口的返回值类型
  • resultMap:对应接口的自定义映射返回值类型

insert update delete 三个标签都没有返回值类型的指定 他们默认返回int值(表示影响行数)。

resultType:当使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的pojo中必须有和它相同的字段对应,而resultType中的内容就是pojo在本项目中的位置。

因此对于单表查询的话用resultType是最合适的。但是,如果在写pojo时,不想用数据库表中定义的字段名称,也是可以使用resultMap进行处理对应的

${}和#{}的区别:
在这里插入图片描述

1. 掌握使用MyBatis实现查询功能(select)

在这里插入图片描述
在这里插入图片描述

1.1 Select语句的基本使用方法
<!-- User getById(Long id)throws Exception; -->
	<!-- 
		id:关联方法名
		parameterType:入参类型
		resultType:返回值类型
	 -->
	<select id="getById" parameterType="_long" resultType="User">
		select
			*
		from
			smbms_user
		where 
			id = #{id}
	</select>
1.2 Select语句的复杂使用
<!-- 
  resultType:如果返回值是集合,只需要定义它的泛型类型即可
  -->
<!--通过用户名模糊查询用户
 List<User> getListByUsername(String username)throws Exception; -->
<select id="getListByUsername" parameterType="string" resultType="User">
    select 
    *
    from
    smbms_user
    where
    userName like CONCAT('%',#{username},'%')
</select>

**多参数:**采用Map集合或者对象形式来传入多个值。

//根据角色编号,用户名模糊查询
	List<User> getListByUsernameAndUserRole(String username,Long userRole)throws Exception;
	但是在.xml中参数不能写两个 于是我们可以把他组成对象
<sql id="all_user">
    select 
    *
    from
    smbms_user
</sql>


<!-- List<User> getListByMap(Map<String,Object> paramsMap)throws Exception; -->
<!--多参数传值,参数为map集合。#里面的名为 map.put里面的键名  -->
<select id="getListByMap" parameterType="map" resultType="User">
    <include refid="all_user"></include>
    where 
    userName like CONCAT('%',#{userName},'%')
    and 
    userRole = #{userRole}
</select>

<!-- 
  #{对象的属性名}
  -->
<!-- List<User> getListByUser(User user)throws Exception; -->
<!-- 如果传输的参数是对象,#里面为对象的属性名,必须保证有getset方法 -->
<select id="getListByUser" parameterType="User" resultType="User">
    <include refid="all_user"></include>
    where 
    userName like CONCAT('%',#{userName},'%')
    and 
    userRole = #{userRole}
</select>

**多参数:**还可以使用注解来传递。



	<sql id="all_user">
		select * from smbms_user
	</sql>
	
<!-- List<User> getListByUsernameAndUserRole(@Param("userName")String username,@Param("roleId")Long userRole)throws Exception; -->
	<!--如果采用注解@param 不再需要提供parameterType  -->
	<!--多参数 使用注解  #里面的和@param里面的一致  @Param("userName")是实体类的的属性 String username是自己起的 -->
	<select id="getListByUsernameAndUserRole" resultType="User">
		<include refid="all_user"></include>
		where
			userName like CONCAT('%',#{userName},'%')
			and 
			userRole = #{roleId}
	</select>

上述的多参数值传递,注意使用规范:

  • 一般来讲我们如果参数超过3个值,那么推荐你采用对象形式来传递!(Map)
  • 但是如果我们做的功能是一个固定业务,基本不会变更的,那么可以用注解多为多参数值传递,因为业务描述比较清晰。

2. 掌握使用MyBatis实现增、删、改

【useGeneratedKeys:】(仅适用于 insert 和 update)表示要获取自动生成的主键
这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键
(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
【keyProperty】:(仅适用于 insert 和 update)表示获取到自动生成主键之后应该映射到对象的哪个属性中
MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。
如果生成列不止一个,可以用逗号分隔多个属性名称。

2.1 增加(insert)
<!-- int addUser(User user)throws Exception; -->
<!-- 
  useGeneratedKeys: 表示我们传入的对象信息在数据库存储时使用的是主键自增
  keyProperty:将主键自增的结果 在执行完添加之后 自动映射到我们的用户对象中去 id就是自增列的属性
  增删改系列都没有返回值类型 默认返回影响行数
  -->
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
    insert into smbms_user
    (userCode,userName)
    values(#{userCode},#{userName})
</insert>

在这里插入图片描述useGeneratedKeys="true" keyProperty="id不加这句的时候 数据库也可以正常添加数据, 即使你的数据库主键id有值,但是还是获取不到数据的主键 加上以后 可以获取到他的主键值 这里的主键就是id
但是在项目中实际是可以取到他的id的 不写的时候 暂时也不清楚
?????

2.2 修改(update)
<!-- int updatePassword(@Param("id")Long id,@Param("newPwd")String newPwd)throws Exception; -->
<update id="updatePassword">
    update
    smbms_user
    set
    userPassword = #{newPwd}
    where
    id = #{id}
</update>
<!-- int updateUser(User user)throws Exception; Bug -->
	<update id="updateUser" parameterType="User">
		update
			smbms_user
		set
			userCode = #{userCode},
			userName = #{userName},
			userPassword = #{userPassword}
		where
			id = #{id}
	</update>
2.3 删除(delete)
<!-- int delUser(@Param("id")Long id)throws Exception; -->
	<delete id="delUser">
		delete from smbms_user where id = #{id}
	</delete>

3. 掌握MyBatis的自定义映射

resultMap

MyBatis是如何进行工作的?

例如查询:

<!-- 
  #{对象的属性名}
  -->
<!-- List<User> getListByUser(User user)throws Exception; -->
<select id="getListByUser" parameterType="User" resultType="User">
    select
    	*
   	from
    	smbms_user
    where 
    	userName like CONCAT('%',#{userName},'%')
    and 
    	userRole = #{userRole}
</select>

​ 我们要给MyBatis指定好要返回的结果类型,传入的参数类型。

​ 我们要给MyBatis编写好要执行的SQL语句。

MyBatis它会将入参中的类型(对象)的属性值按照属性名去注入到对应的SQL语句的占位符中。

MyBatis它会将SQL语句执行的结果按照查询结果字段名和返回结果类型(对象)的属性名进行映射。

**需求1 一般情况下的自定义映射:**根据用户名和角色模糊查询用户,要求查询出来的结果包含角色名。

	<!-- 自定义映射 
	type 自定义映射的结果类型
	-->
	<resultMap type="User" id="user-role">
		<!-- 
			用于自定义映射主键信息【设置后会提高一定的效率】
			column:查询的结果列名
			property:映射到结果类型中的属性名
		 -->
		<id column="id" property="id"/>
		<!-- 
			用于自定义映射普通字段信息  
			因为默认的映射级别为PARTIAL,所以它会自动映射 
			哪怕你是采用了自定义映射,这个自动映射也会生效(列名和属性名是一致的)
			
			所以你只需要映射你不一样的这种 列 -> 属性
user这个类中添加userRoleName这个属性
		 -->
		<!-- <result column="userCode" property="userCode"/>
		<result column="userName" property="userName"/>
		<result column="userPassword" property="userPassword"/> -->
		<result column="roleName" property="userRoleName"/>
		<!-- ...... -->
	</resultMap>

	<!-- List<User> getListWithRnameByUnameAndRid(@Param("userName")String userName,
											 @Param("roleId")Long roleId)throws Exception; -->
	<!-- 
		resultMap:自定义映射的id值
	-->
	<select id="getListWithRnameByUnameAndRid" resultMap="user-role">
		select
			u.*,r.roleName
		from
			smbms_user u,smbms_role r
		where
			u.userRole = r.id
			and
			u.userName like CONCAT('%',#{userName},'%')
			and 
			u.userRole = #{roleId}
	</select>

**需求2 复杂类型 一对一:**根据用户名和角色模糊查询用户,要求查询出来的结果包含角色所有信息(现在嵌套的是一个对象)在user这个类中写一个对象的属性 private Role role;PARTIAL 如果是她 查出来的就没有user这个信息 只有role这个信息
因为自定义了id对应id,usercode对应usercode user里面只有这两信息 如果写出来的话 获取的user就是空的

<resultMap type="User" id="user-role">
		<id column="id" property="id"/>
		<result column="userCode" property="userCode"/>
		<!-- 关联对象映射 -->
		<!-- (用户表里面放了一个角色对象,这个对象在user表中的属性名)
			property:对象在结果类型中的属性名
			javaType:对象的类型
			column=rid是下面的sql语句查出来的名
		 -->
		<association property="role" javaType="Role">
		
			<id column="rid" property="id"/>
			<result column="roleName" property="roleName"/>
			<result column="roleCode" property="roleCode"/>
			<result column="rcreatedBy" property="createdBy"/>
			<result column="rcreationDate" property="creationDate"/>
		</association>
	</resultMap>
	
	<!-- 
		List<User> getListWithRoleByUnameAndRid(@Param("userName")String userName,
			 								   @Param("roleId")Long roleId)throws Exception;
	 -->
	<!-- 
		resultMap:自定义映射的id值
	-->

	<!-- 
		u和r里面有重复字段 不能写r.*  自定义映射中用不了
	-->
	<select id="getListWithRoleByUnameAndRid" resultMap="user-role">
		select
			u.*,r.roleName,
			r.id rid,r.roleCode,
			r.createdBy rcreatedBy,
			r.creationDate rcreationDate
		from
			smbms_user u,smbms_role r
		where
			u.userRole = r.id
			and
			u.userName like CONCAT('%',#{userName},'%')
			and 
			u.userRole = #{roleId}
	</select>

<settings>	
    <!-- 指定 MyBatis 应如何自动映射列到字段或属性。 
   NONE 表示取消自动映射;
   PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 (默认的)
   FULL 会自动映射任意复杂的结果集(无论是否嵌套)。  -->
    <setting name="autoMappingBehavior" value="FULL"/>
</settings> 
	<result column="userCode" property="userCode"/>
	setting为full 这个可以不写

**需求3 复杂类型 一对多:**根据用户名和角色模糊查询用户,要求查询出来的结果包含所有地址信息
要修改核心配置文件autoMappingBehavior的值为full
user表中private List<Address> address

	<resultMap type="User" id="user-role">
		<id column="id" property="id"/>
		<result column="userCode" property="userCode"/>
		<!-- 关联集合映射
			ofType:泛型类型
		 -->
		<collection property="addresses" ofType="Address">
			<result column="contact" property="contact"/>
			<result column="addressDesc" property="addressDesc"/>
		</collection>
	</resultMap>
	
	<!-- 
		List<User> getListWithAddrListByUnameAndRid(@Param("userName")String userName,
			   								@Param("roleId")Long roleId)throws Exception;
	 -->
	<!-- 
		resultMap:自定义映射的id值
	-->
	<select id="getListWithAddrListByUnameAndRid" resultMap="user-role">
		select
			u.*,a.contact,a.addressDesc
		from
			smbms_user u,smbms_address a
		where
			u.id = a.userId
			and
			u.userName like CONCAT('%',#{userName},'%')
			and 
			u.userRole = #{roleId}
	</select>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 映射文件 的相关文章

  • 将数据表传递给存储过程

    我有一个用 C 创建的数据表 using DataTable dt new DataTable dt Columns Add MetricId typeof int dt Columns Add Descr typeof string dt
  • 将文件存储在文件系统上或在 SQL Server 中存储为 varbinary(MAX)

    我知道 对于将文件作为 blob 存储在数据库中是否是不好的做法存在很多争议 但我只是想了解这对于我的情况是否有意义 我正在创建一个 ASP NET 应用程序 在一家大公司内部使用 用户需要能够将文件附加到系统中的 作业 这些文件通常是 P
  • Codeigniter 如何清理输入?

    我正在构建一个 Codeigniter 应用程序 并且正在尽最大努力防止 SQL 注入 我正在使用 Active Record 方法来构建我的所有查询 我知道 Active Record 会自动清理输入 但我想知道到底清理到什么程度 它只是
  • 在 Microsoft Access 中编写查询,字段描述错误 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题是由拼写错误或无法再重现的问题引起的 虽然类似的问题可能是on topic help on topic在这里 这个问题的解决方式不
  • 如何实现复杂的sql命令

    我在 MySQL 中有一个 sql 表 其中包含以下记录 user dob john 1 10 96 jane 3 4 97 jill 1 8 96 jack 2 9 00 jane 12 14 07 john 1 11 98 这是我要执行
  • 什么是“标量”查询?

    我正在使用 LLBLGEN 其中有一种方法可以将查询作为scalar query 谷歌搜索给了我一个定义scalar sub query 它们一样吗 标量查询是返回由一列组成的一行的查询
  • 将计算列设置为非空时遇到问题

    我在将计算列设置为时遇到问题not null 我想要实现的是C001 C002 等 同时将其设置为not null 我在论坛上读到 这可以通过使用 NULL 值的默认值 0 来实现 E g ISNULL Price Taxes 0 我尝试应
  • 修改SQL Server中的默认值

    我正在尝试使用 SQL Server 2008 中的 SQL 语句更改列的默认值 我在很多地方找到了如何在创建表 添加列时设置默认值 但没有找到如何设置它 一旦列已经存在就修改它 这就是我可以用来在添加时设置它的内容 ALTER TABLE
  • MySQL:主键的所有部分都必须为 NOT NULL;如果您需要在键中使用 NULL,请使用 UNIQUE 代替

    我的 MySQL 有问题 我创建了名为 BucketList 的数据库 然后尝试创建名为 tbl user 的表 它看起来像这样 CREATE TABLE BucketList tbl user user id BIGINT NULL AU
  • 使用 insert into ... select 会导致 select 附近的语法不正确,为什么?

    如何在 INSERT 操作中进行 SELECT insert into tableX a id b id VALUES SELECT service id FROM tableY WHERE id 10 2 但服务器返回语法错误 为什么 S
  • 更新表并返回旧值和新值

    我正在编写一个 VB 应用程序 用于清理 DB2 数据库中的一些数据 在一些表中我想更新整个列 例如帐号列 我正在将所有帐号更改为从 1 开始 并在列表中向下递增 我希望能够返回旧帐号和新帐号 这样我就可以生成某种可以引用的报告 这样我就不
  • 为列名创建动态选择获取值 - 在 SQL Server 中

    请帮助我创建一个选择 SQL 语句 其中的结果列名称是从原始表中的列值获取的 表名是Device Part 用户可以输入很多DeviceCode其中有许多动态PartTypeName PartTypeName 值为PartInfo 这可能有
  • 在 Android 中使用 SQL (JDBC) 数据库

    在旧的 Java 应用程序中 我使用以下代码连接到 SQL 数据库并将其用于某些查询 private Connection dbConnection null System setProperty derby system home C C
  • 通过一个表中的列更新另一表中的列

    我有两张桌子 A 和 B 两者都有一个共同的列 name 并通过列 id 相互链接 表A中的 name 列是空的 而表B中有数据 我的任务是用相应的id填充从表B到表A的该列中的所有数据 我正在使用以下查询 UPDATE A SET A n
  • 删除所有值比第二高值低 5 倍的记录

    我有一个表 价格 有两个字段 代码 字符 和价格 小数 我需要查找具有相同代码 价格比两个最高价格低 5 倍或更少的所有记录 例如 在这种情况下 我希望删除 id 1 id code price 1 1001 10 2 1001 101 3
  • 在不使用 PHP 的情况下将 MYSQL 中的表字段更新为其值加上常量

    我想表演一个UPDATE in MYSQL其中我获取一个字段值 添加一个常量并将新值保存在同一字段中 假设我们有一个名为OldValue在一个名为aTable 伪代码可能是 UPDATE aTable SET OldValue OldVal
  • java.sql.SQLException: ORA-01005: 给定的密码为空;登录被拒绝

    我在尝试连接到数据库时遇到以下异常 java sql SQLException ORA 01005 null password given logon denied at oracle jdbc driver T4CTTIoer proce
  • RedGate ReadyRoll 的替代品了吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种经济实惠的 RedGate ReadyRoll 替代方案 以实现 SQL 的持续部署 我
  • 在 SQL 查询中使用 fn_Split

    我一直在努力争取fn Split在我的查询中正常工作 我到处搜索 并在这里找到了似乎接近我需要的答案 但我仍然无法使其发挥作用 基本上我试图返回与数组中的条目匹配的记录 我已经有了一个与我的数据库一起使用的表值函数 如下所示 Select
  • 查找一列中具有相同值而另一列中具有其他值的行?

    我有一个 PostgreSQL 数据库 将用户存储在users他们参与的表格和对话conversation桌子 由于每个用户可以参与多个对话 并且每个对话可以涉及多个用户 因此我有一个conversation user链接表来跟踪哪些用户正

随机推荐

  • Jmeter 集合点

    概念 对于性能测试可以理解为多用户并发 但是真正的并发是不存在的 为了更真实的实现并发的概念 我们可以在需要的地方设置集合点 所有虚拟用户都互相之间等一等 然后一起访问 Jmeter集合点是通过添加定时器 Synchronizing tim
  • 针对Failed to execute goal org.apache.maven.pluginsmaven-compiler-plugin3.1的解决方案

    背景 本项目使用JDK1 8 编译maven工程的时候出现如下错误 Failed to execute goal org apache maven plugins maven compiler plugin 3 1 pom中如下配置mave
  • 不同项目中,S7-300 DP 和 S7-1200 PROFINET 的profibus通信(300做主站,1200做从站)

    使用 S7 1200 与 S7 300 的集成 DP 接口进行主从通信 这里是将 S7 300 做为主站 将 S7 1200 做为从站 即 S7 300 集成的 DP 接口做主站 S7 1200 通过 CM1242 5 做从站 两个PLC在
  • Mysql-Galera Cluster

    使用Galera Cluster需要下载包含wsrep补丁的mysql版本 官网下载地址 http galeracluster com downloads 安装前要卸载之前安装的mariadb或者mysql 或者迁移也可以 不过就是另一套操
  • elementui的el-table的插槽功能,添加判断值,在单元格添加输入框,点击事件等等

    elementui的el table的插槽功能 添加判断值 在单元格添加输入框 点击事件等等
  • 三、 HBuilderX运行到手机上看效果

    以下均已录制 点击查看B站视频 1 运行 gt 运行到手机或模拟器 出现如下问题 未检测到手机或模拟器 请稍后重试 2 这时需要手机上做一些设置 设置 gt 关于手机 gt 连续多次点击版本号 就能打开开发者模式 设置 gt 系统和更新 g
  • 优化pxe网启动时tftp的传输速度 --- 针对pxelinux和bootmgr

    作为一名IT人士 一般的计算机维护当然不好意思找别人 于是自己用pxelinux搭了个网络启动环境 可以启动各种WinPE 以供折腾电脑系统 刷新固件的需要 只是一般的网络启动都是基于tftp协议的 传输文件那叫一个慢 启动时光是加载映像文
  • 交易中间件消息中间件_什么是中间件

    交易中间件消息中间件 什么是中间件 What Is Middleware In network architecture a middleware is a layer of software that creates a network
  • 答题小程序常用脚本整理

    答题小程序常用脚本整理 本文主要描述答题活动小程序运营过程中 高频使用的 几个脚本操作 1 如何清理当前题库 在开发控制台的高级操作右侧有个加号按钮 点击下 选择空白模板即可 将下面的脚本复制进去 db collection questio
  • 聚簇索引和二级索引

    原文链接 https blog csdn net jijianshuai article details 79084874
  • SpringCloud项目如何成功打包以及其中的一些坑

    我的项目结构 其中edu online和edu admin是前端项目 其他是后端模块 首先需要在父工程中添加需要打包的模块和打包依赖 如果在父工程中配置过打包依赖则子模块中不需要配置打包依赖 但是如果有子模块需要被其他模块依赖 则需要在被依
  • ROS:解决Error:cannot launch node of type [map_server/map_server]: can't locate node [map_server] in......

    写在前面 本文为原创 如需转载请注明出处 https www jianshu com p e9981bc35cff 欢迎大家留言共同探讨 有误的地方也希望指出 另如果有好的SLAM ROS等相关交流群也希望可以留言给我 在此先谢过了 1 E
  • Gof23设计模式之建造者模式

    1 概述 建造者模式 Builder Pattern 又叫生成器模式 是一种对象构建模式 它可以将复杂对象的建造过程抽象出来 抽象类别 使这个抽象过程的不同实现方法可以构造出不同表现 属性 的对象 建造者模式是一步一步创建一个复杂的对象 它
  • 要求用成员函数实现以下功能由键盘输入,计算长方体的体积,输出3个长方体的体积。

    题目 需要求三个长方体的体积 请编写一个基于对象的程序 数据成员包括length 长 width 宽 height 高 要求用成员函数实现以下功能 1 由键盘输入3个长方体的长 宽 高 2 计算长方体的体积 3 输出3个长方体的体积 请编程
  • linux 关于修改命令提示符

    1 首先 进入root 用户获得权限 输入 su root 2 进入修改提示符的文件 输入 vim etc profile 3 进入文件 不要修改任何地方 在最后加入命令 1 输入 export PS1 e 1 32 40m 孔子曰 e 1
  • Flink将本地数据写入Redis

    第一步 配置文件redis conf cd usr apps redis vim redis conf 先输入 set nu 打开行号标识 69行 bind 127 0 0 1加上注释 取消IP绑定 否则其他主机不能连接 88行 prote
  • sqli-labs第十八十九关

    这两关为头注入 Less 18 POST Header Injection Uagent field Error based 手工注入 这关和下一关必须要抓包才能完成 因为在这里怎么是都没有反应 全是报错的状态 那么我估计就要抓包了 根本判
  • pythonqt对比_用 Python 和 C++ 创建 Qt 程序的简单对比

    假设要做一个简单的小窗口 如下图所示 PyQt 和 C 要用多少代码可以完成呢 效果图 注 本文内容较多 主要是 C 的部分 若有必要请直接跳到最后看结论 一 C 版本 除了最基础的 pro 文件之外 我一共创建了 5 个文件 custom
  • 电脑固定ip地址之后重启却失效了的解决办法

    开始 运行 cmd 回车 英文状态下输入 netsh winsock reset 回车后会提示重启 先不重启 继续输入 netsh int ip reset reset log 回车后会提示重启 此时先重启电脑 重启之后再次设置好固定ip地
  • SQL 映射文件

    SQL 映射文件 SQL 映射文件只有很少的几个顶级元素 按照应被定义的顺序列出 cache 对给定命名空间的缓存配置 cache ref 对其他命名空间缓存配置的引用 resultMap 是最复杂也是最强大的元素 用来描述如何从数据库结果