MyBatis XML 映射器 select、insert update 和 delete、参数

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。 如果跟JDBC 代码进行对比,省掉了将近 95% 的代码。

1 select
CREATE TABLE person (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(100) DEFAULT NULL,
password varchar(100) DEFAULT NULL,
full_name varchar(100) DEFAULT NULL,
first_name varchar(100) DEFAULT NULL,
last_name varchar(100) DEFAULT NULL,
date_of_birth date DEFAULT NULL,
created_on date DEFAULT NULL,
update_on date DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=211 DEFAULT CHARSET=utf8;
insert into person(id,username,password,full_name,first_name,last_name,date_of_birth,created_on,update_on) values (201,‘emacarron‘,‘123456‘,‘爱德华多·马卡龙‘,‘爱德华多‘,‘马卡龙‘,‘2000-01-01‘,‘2020-01-01‘,‘2020-01-02‘),(202,‘mnesarco‘,‘123456‘,‘弗兰克·马丁内斯‘,‘弗兰克‘,‘马丁内斯‘,‘2000-01-01‘,‘2020-01-01‘,‘2020-01-02‘),(203,‘agustafson‘,‘123456‘,‘安德鲁·古斯塔夫森‘,‘安德鲁‘,‘古斯塔夫森‘,‘2000-01-01‘,‘2020-01-01‘,‘2020-01-02‘);
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
<select
id="selectPerson"
parameterType="int"
parameterMap="deprecated"
resultType="hashmap"
resultMap="personResultMap"
flushCache="false"
useCache="true"
timeout="10"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
2?insert, update 和 delete
CREATE TABLE author (
id INT(11) NOT NULL AUTO_INCREMENT,
username VARCHAR(100) DEFAULT NULL,
password VARCHAR(100) DEFAULT NULL,
email VARCHAR(100) DEFAULT NULL,
bio VARCHAR(100) DEFAULT NULL,
favourite_section VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB AUTO_INCREMENT=311 DEFAULT CHARSET=utf8;
INSERT INTO author(id,username,password,email,bio,favourite_section) VALUES (301,‘克林顿‘,‘123456‘,‘ [email protected]‘,‘MyBatis团队成员‘,‘打球‘),(302,‘布兰登‘,‘123456‘,‘ [email protected]‘,‘MyBatis团队成员‘,‘听歌‘),(303,‘亚当‘,‘123456‘,‘[email protected]‘,‘MyBatis团队贡献者‘,‘游泳‘);
<insert
id="insertAuthor"
parameterType="org.mybatis.example.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
<update
id="updateAuthor"
parameterType="org.mybatis.example.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
<delete
id="deleteAuthor"
parameterType="org.mybatis.example.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
<insert id="insertAuthor">
insert into Author (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})
</insert>
<update id="updateAuthor">
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>
<delete id="deleteAuthor">
delete from Author where id = #{id}
</delete>
<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>
SQL

这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from author t1
cross join author t2
</select>
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from author t1
cross join author t2
</select>
3 参数
CREATE TABLE users (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(100) DEFAULT NULL,
password varchar(100) DEFAULT NULL,
email varchar(100) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=411 DEFAULT CHARSET=utf8;
insert into users(id,username,password,email) values (401,‘admin‘,‘123456‘,‘[email protected]@gmail.com‘),(402,‘user‘,‘123456‘,‘[email protected]‘),(403,‘guest‘,‘123456‘,‘[email protected]‘);
参数是 MyBatis 非常强大的元素。比如:

<select id="selectUsers" resultType="User">
select id, username, password
from users
where id = #{id}
</select>
如果传入一个复杂的对象,就会有点不一样了。比如:

<insert id="insertUser" parameterType="User">
insert into users (id, username, password)
values (#{id}, #{username}, #{password})
</insert>
字符串替换

有时想在 SQL 语句中直接插入一个不转义的字符串。 比如 : ORDER BY ${columnName}

举个例子,如果你想 select 一个表任意一列的数据时,不需要这样写:

@Select("select from users where id = #{id}")
User findById(@Param("id") long id);
@Select("select
from users where username= #{username}")
User findByUsername(@Param("username") String username);
@Select("select * from users where email = #{email}")
User findByEmail(@Param("email") String email);
而是可以只写这样一个方法:

@Select("select * from users where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);
其中 ${column} 会被直接替换,而 #{value} 会使用 ? 预处理。

User userOfId = userMapper.findByColumn("id", 401L);
User userOfUsername = userMapper.findByColumn("username", "guest");
User userOfEmail = userMapper.findByColumn("email", "[email protected]");

原文地址:https://blog.51cto.com/14464197/2485999

时间: 2024-08-08 13:51:47

MyBatis XML 映射器 select、insert update 和 delete、参数的相关文章

[转] MyBatis的XxxMapper.xml 映射器的详解(六)

上一章简单介绍了MyBatis的核心配置文件 SqlMapConfig.xml(五),如果没有看过,请观看上一章. 一 . XxxMapper.xml 映射器的使用在MyBatis 中,将Dao层的接口与对应的Mapper.xml 配置文件进行组合使用,而不是以前的接口实现类处理. 这里着重讲解一下,这个配置文件的使用. 将XxxMapper.xml 放置在与接口XxxMapper.java 同级的目录下. 一.一 Schema约束<!DOCTYPE mapper PUBLIC "-//m

Mybatis映射器select

Mybatis映射器select 简单的select元素的应用 id 配合Mapper的全限定名,联合成为一个唯一的标示 parameterType 表示这条SQL接受的参数类型 resultType表示这条SQL返回的结果类型 #{firstName} 是被传递进去的参数 <select id="countUserByFirstName" parameterType="string" resultType="int"> select

(十一)mybatis之映射器(select)

映射器 映射器的主要元素有八种: 元素名称 描述 select 查询语句,可自定义参数 insert 插入语句,执行后返回插入的条数 update 更新语句,执行后返回更新的条数 delete 删除语句,执行后返回删除的条数 sql 定义一部分的sql,被各处引用 resultMap 描述从数据库中得到的结果,提供映射规则 cache 给定命名空间的缓存配置 cache-ref 其他命名空间缓存配置的引用   select元素 ①   简单地应用查询的select元素: <select id =

MyBatis XML 映射配置文件

MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息.文档的顶层结构如下: configuration 配置 properties 属性 settings 设置 typeAliases 类型命名 typeHandlers 类型处理器 objectFactory 对象工厂 plugins 插件 environments 环境 environment 环境变量 transactionManager 事务管理器 dataSource

Mybatis XML映射文件

mybatis为聚焦于SQL而构建,SQL映射文件常用的顶级元素如 resultMap,是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象. insert,映射插入语句 update, 映射更新语句 delete , 映射删除语句 select , 映射查询语句 1)简单的单表映射文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//my

Mybatis XML映射配置文件

探究 已映射的 SQL  语句 这里你也许想知道通过 SqlSession 和 Mapper 对象到底执行了什么操作.已映射的 SQL语句是一个很大的主题, 而且这个主题会贯穿本文档的大部分内容. 为了给出一个宏观的概念,这里有一些示例.上面提到的任何一个示例,语句是通过 XML 或注解定义的.我们先来看看 XML.使用基于 XML 的映射语言,在过去的几年中使得 MyBatis 非常流行,他为 MyBatis 提供所有的特性设置.如果你以前用过 MyBatis,这个概念应该很熟悉了,但是 XM

(八)mybatis之映射器

映射器 映射器是由Java接口和XML文件(或注解)共同组成的,作用如下: ①   定义参数类型. ②   描述缓存. ③   描述SQL语句. ④   定义查询结果和POJO的映射关系. 以下用两种方式进行Mapper的实现. 1. XML文件配置方式实现Mapper 第一步:给出Java接口. package com.mapper; import com.entity.User; public interface UserMapper(){ public User getUser(int i

ORA-06547: INSERT, UPDATE 或 DELETE 语句必须使用 RETURNING 子句

产生这个错误的原因: returning into子句作用于insert,update,delete,上而select则不行,应该用into. 报错的存储如下: create or replace procedure p_stu_info(s_id number, s_name varchar2) is v_name varchar2(10); v_age number; v_ErrMsg varchar2(200); begin execute immediate 'select name,a

mybatis文件映射之select操作返回Map

1.返回的Map键为列所对应的名称,值就是具体的值 EmployeeMapper.java public Map<String,Object> getEmpByIdReturnMap(Integer id); EmployeeMapper.xml <select id="getEmpByIdReturnMap" resultType="map"> select id,last_name lastName,gender,email from t