幽沉谢世事,俯默窥唐虞。这篇文章主要讲述MyBatis学习存档——mapper.xml映射文件相关的知识,希望能为你提供帮助。
MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单
所以我们来看看映射文件的具体结构
一、xml节点结构
文章图片
mapper为根节点 - namespace命名空间
cache - 配置给定命名空间的缓存
cache-ref – 从其他命名空间引用缓存配置
resultMap –用来描述数据库结果集和对象的对应关系
sql – 可以重用的SQL块,也可以被其他语句引用
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
二、各节点作用此处以MyBatis学习存档(1)——入门中反向生成的UsersMapper.xml和UsersMapper.java为例
文章图片
文章图片
< ?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 namespace="com.mapper.UsersMapper" > < resultMap id="BaseResultMap" type="com.pojo.Users" > < id column="id" property="id" jdbcType="INTEGER" /> < result column="name" property="name" jdbcType="VARCHAR" /> < result column="password" property="password" jdbcType="VARCHAR" /> < /resultMap> < sql id="Base_Column_List" > id, name, password < /sql> < select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" > select < include refid="Base_Column_List" /> from users where id = #{id,jdbcType=INTEGER} < /select> < delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" > delete from users where id = #{id,jdbcType=INTEGER} < /delete> < insert id="insert" parameterType="com.pojo.Users" > insert into users (id, name, password ) values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR} ) < /insert> < insert id="insertSelective" parameterType="com.pojo.Users" > insert into users < trim prefix="(" suffix=")" suffixOverrides="," > < if test="id != null" > id, < /if> < if test="name != null" > name, < /if> < if test="password != null" > password, < /if> < /trim> < trim prefix="values (" suffix=")" suffixOverrides="," > < if test="id != null" > #{id,jdbcType=INTEGER}, < /if> < if test="name != null" > #{name,jdbcType=VARCHAR}, < /if> < if test="password != null" > #{password,jdbcType=VARCHAR}, < /if> < /trim> < /insert> < update id="updateByPrimaryKeySelective" parameterType="com.pojo.Users" > update users < set > < if test="name != null" > name = #{name,jdbcType=VARCHAR}, < /if> < if test="password != null" > password = #{password,jdbcType=VARCHAR}, < /if> < /set> where id = #{id,jdbcType=INTEGER} < /update> < update id="updateByPrimaryKey" parameterType="com.pojo.Users" > update users set name = #{name,jdbcType=VARCHAR}, password = #{password,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} < /update> < /mapper>
UsersMapper.xml
文章图片
文章图片
package com.mapper; import com.pojo.Users; public interface UsersMapper { int deleteByPrimaryKey(Integer id); int insert(Users record); int insertSelective(Users record); Users selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(Users record); int updateByPrimaryKey(Users record); }
UsersMapper.java
文章图片
文章图片
2.1 mapper节点
作为xml的根节点,它具有一个很重要的属性——namespace(命名空间)
namespace的值应与其所绑定的映射接口向一致,为保证其唯一性,通常为“包名+类名”,如com.mapper.UsersMapper,即绑定了com.mapper包下的名为UsersMapper的接口
而与其绑定的接口UsersMapper中的方法应与映射文件中SQL语句id一一对应(顺序无需一致)
2.2 cache、cache-ref节点
不推荐使用MyBatis自带的缓存,因此此处不细讲
2.3 resultMap节点
文章图片
可在sql映射语句中被引用,通常用于表示数据库表和实体类之间的映射关系
resultMap节点有2个属性:
id:标识作用,应具有唯一性
type:类型,即对应的实体类,若在mybatis-config.xml中设置过别名,也可使用设置的别名
id节点:对应数据库中的主键
result节点:非主键的其他字段
column:数据库表中对应的字段名
property:实体类中对应的属性
jdbcType:数据库中改字段的类型
2.4 sql节点
文章图片
很简单的一个节点,用于sql语句的重用,其id属性起到标识作用,应具有唯一性
2.5 select节点
文章图片
select是MyBatis中最常用的元素之一,对应select语句
id:命名空间中唯一的标识符,接口中的方法与映射文件中的SQL语句id一一对应
parameterType:传入SQL语句的参数类型,分为2种情况:
1.基础数据类型
int、String、Date等
只能传入一个,通过#{参数名}即可获取传入的值
2.复杂数据类型
Java实体类、Map等
通过#{属性名}或者#{map的keyName}即可获取传入值
resultType:SQL语句返回值类型的完整类名或别名
resultMap:引用配置的resultMap
2.6 insert、delete、update节点
分别对应添加、删除、更改语句,属性与select基本相同,唯一不同之处在于无需配置resultType或resultMap,本身默认返回受影响的行数
因此,对于增删改这类更新操作,接口方法的返回值建议为int类型,执行sql影响的行数,最好不要写boolean类型
三、多参数传入如2.5中所说,MyBatis仅支持单个参数的传入,那么如何进行多参数的传入呢?
方法有2种:
1.将多个参数封装成1个Map,传入Map即可,但该方法不透明,无法直接看出所需的参数是什么
或直接传入一个实体类对象
2.使用注解@Param来传入多个参数
在接口中对传入参数进行注解@Param("value"),在映射文件中使用${value}即可获得该参数
【MyBatis学习存档——mapper.xml映射文件】建议:通常传入参数大于3个时最好封装成一个对象,而不是一个个传入
推荐阅读
- APP测试时常用adb命令
- Eclipse中将web项目自动发布到Tomcat webapps下
- Appium——元素定位
- Log4Net的控制台,WinForm,WebApplication使用
- 站在 Android 开发的角度,聊聊 Airbnb 的 Lottie!!!
- 玩转Android monkey之多参数实战
- 带你从零学ReactNative开发跨平台App开发--揭开实战内幕
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.me.dao.UserMapp
- There is no Action mapped for namespace / and action name login. - [unknown location]