1. 接口绑定方案

MyBatis中, 提供了一套接口绑定方案. 程序员可以提供一个接口, 然后提供对应接口的一个mapper.xml文件. MyBatis会自动将接口和xml文件进行绑定. 实际上就是MyBatis会根据接口和对应的xml文件创建接口的实现类. 换言之, 就是可以得到接口类型的对象, 方便方法的调用.

2.1 实现方式

2.1.1 定义接口

package com.bjsxt.mapper;

import java.util.List;

import com.bjsxt.pojo.User;

 

public interface UserMapper {

List<User> selAll();

}

2.1.2 编写对应接口的映射文件

注意:

a) xml文件名要和接口名一致

b) namespace属性必须为接口的全限定路径

c) id属性必须和接口对应的方法名一致

<mapper namespace="com.bjsxt.mapper.UserMapper">

<select id="selAll" resultType="User">

select * from t_user

</select>

</mapper>

2.1.3 在核心配置文件中扫描接口

a) 扫描单个接口, 可以使用mapper标签的class属性

<mappers>

<mapper class="com.bjsxt.mapper.UserMapper" />

</mappers>

b) 当扫描多个接口时, 为简化配置, 可以使用package标签, 表示扫描对应包下的所有接口.

<mappers>

<package name="com.bjsxt.mapper" />

</mappers>

2.1.4 应用

在使用时, 可以通过SqlSession对象的getMapper方法, 得到接口的代理对象, 从而可以调用定义好的方法.

@Test

public void testBind() {

SqlSession session = MyBatisUtil.getSession();

UserMapper mapper = session.getMapper(UserMapper.class);

List<User> list = mapper.selAll();

for (User user : list) {

System.out.println(user);

}

session.close();

}

2.2 通过接口绑定解决多参数的传递

2.2.1 方式一

a) 接口中定义方法

User selByUP(String username, String password);

b) 映射文件中提供对应的标签. 此时, SQL语句中获取方式有两种, 通过#{index}或#{param+数字}的方式.

<select id="selByUP" resultType="user">

select * from t_user where username=#{0} and password=#{1}

</select>

2.2.2 方式二

a) 接口中定义方法, 参数中使用@Param注解设定参数名用于在SQL语句中使用.

User selByUP(@Param("username") String username, @Param("password") String password);

b) 映射文件中提供对应的标签. 此时, SQL语句中获取方式有两种, 通过#{参数名称}或#{param+数字}的方式.

<select id="selByUP" resultType="user">

select * from t_user where username=#{username} and password=#{password}

</select>

2. 动态SQL

根据条件的不同, SQL语句也会随之动态的改变. MyBatis中, 提供了一组标签用于实现动态SQL.

3.1 <if>

用于进行条件判断, test属性用于指定判断条件. 为了拼接条件, 在SQL语句后强行添加1=1的恒成立条件.

<select id="sel" resultType="user">

select * from t_user where 1=1

<if test="username != null and username != ''">

and username=#{username}

</if>

<if test="password != null and password != ''">

and password=#{password}

</if>

</select>

3.2 <where>

用于管理where子句. 有如下功能:

a) 如果没有条件, 不会生成where关键字

b) 如果有条件, 会自动添加where关键字

c) 如果第一个条件中有and, 去除之

<select id="sel" resultType="user">

select * from t_user

<where>

<if test="username != null and username != ''">

and username=#{username}

</if>

<if test="password != null and password != ''">

and password=#{password}

</if>

</where>

</select>

3.3 <choose><when><otherwise>

这是一套标签, 功能类似于switch...case...

<select id="sel" resultType="user">

select * from t_user

<where>

<choose>

<when test="username != null and username != ''">

and username = #{username}

</when>

<when test="password != null and password != ''">

and password = #{password}

</when>

<otherwise>

and 1=1

</otherwise>

</choose>

</where>

</select>

3.4 <set>

用于维护update语句中的set子句. 功能如下:

a) 满足条件时, 会自动添加set关键字

b) 会去除set子句中多余的逗号

c) 不满足条件时, 不会生成set关键字

int updUser(User user);

<update id="updUser" parameterType="user">

update t_user

<set>

id=#{id}, <!-- 防止所有条件不成立时的语法错误 -->

<if test="username != null and username != ''">

username=#{username},

</if>

<if test="password != null and password != ''">

password=#{password},

</if>

</set>

where id=#{id}

</update>

3.5 <trim>

用于在前后添加或删除一些内容

a) prefix, 在前面添加内容

b) prefixOverrides, 从前面去除内容

c) suffix, 向后面添加内容

d) suffixOverrides, 从后面去除内容

<update id="updUser" parameterType="user">

update t_user

<!--

prefix: 前缀, 表示向前面添加内容

prefixOverrides: 从前面删除内容

suffix: 后缀, 表示向后面添加内容

suffixOverrides: 从后面删除内容

-->

<trim prefix="set" prefixOverrides="user" suffix="hahaha" suffixOverrides=",">

username=#{username},

</trim>

where id=#{id}

</update>

3.6 <bind>

用于对数据进行再加工, 用于模糊查询

<select id="sel" resultType="user">

select * from t_user

<where>

<if test="username!=null and username!=''">

<bind name="username" value="'%' + username + '%'"/>

and username like #{username}

</if>

</where>

</select>

1. 接口绑定方案

MyBatis中, 提供了一套接口绑定方案. 程序员可以提供一个接口, 然后提供对应接口的一个mapper.xml文件. MyBatis会自动将接口和xml文件进行绑定. 实际上就是MyBatis会根据接口和对应的xml文件创建接口的实现类. 换言之, 就是可以得到接口类型的对象, 方便方法的调用.

2.1 实现方式

2.1.1 定义接口

package com.bjsxt.mapper;

import java.util.List;

import com.bjsxt.pojo.User;

 

public interface UserMapper {

List<User> selAll();

}

2.1.2 编写对应接口的映射文件

注意:

a) xml文件名要和接口名一致

b) namespace属性必须为接口的全限定路径

c) id属性必须和接口对应的方法名一致

<mapper namespace="com.bjsxt.mapper.UserMapper">

<select id="selAll" resultType="User">

select * from t_user

</select>

</mapper>

2.1.3 在核心配置文件中扫描接口

a) 扫描单个接口, 可以使用mapper标签的class属性

<mappers>

<mapper class="com.bjsxt.mapper.UserMapper" />

</mappers>

b) 当扫描多个接口时, 为简化配置, 可以使用package标签, 表示扫描对应包下的所有接口.

<mappers>

<package name="com.bjsxt.mapper" />

</mappers>

2.1.4 应用

在使用时, 可以通过SqlSession对象的getMapper方法, 得到接口的代理对象, 从而可以调用定义好的方法.

@Test

public void testBind() {

SqlSession session = MyBatisUtil.getSession();

UserMapper mapper = session.getMapper(UserMapper.class);

List<User> list = mapper.selAll();

for (User user : list) {

System.out.println(user);

}

session.close();

}

2.2 通过接口绑定解决多参数的传递

2.2.1 方式一

a) 接口中定义方法

User selByUP(String username, String password);

b) 映射文件中提供对应的标签. 此时, SQL语句中获取方式有两种, 通过#{index}或#{param+数字}的方式.

<select id="selByUP" resultType="user">

select * from t_user where username=#{0} and password=#{1}

</select>

2.2.2 方式二

a) 接口中定义方法, 参数中使用@Param注解设定参数名用于在SQL语句中使用.

User selByUP(@Param("username") String username, @Param("password") String password);

b) 映射文件中提供对应的标签. 此时, SQL语句中获取方式有两种, 通过#{参数名称}或#{param+数字}的方式.

<select id="selByUP" resultType="user">

select * from t_user where username=#{username} and password=#{password}

</select>

2. 动态SQL

根据条件的不同, SQL语句也会随之动态的改变. MyBatis中, 提供了一组标签用于实现动态SQL.

3.1 <if>

用于进行条件判断, test属性用于指定判断条件. 为了拼接条件, 在SQL语句后强行添加1=1的恒成立条件.

<select id="sel" resultType="user">

select * from t_user where 1=1

<if test="username != null and username != ''">

and username=#{username}

</if>

<if test="password != null and password != ''">

and password=#{password}

</if>

</select>

3.2 <where>

用于管理where子句. 有如下功能:

a) 如果没有条件, 不会生成where关键字

b) 如果有条件, 会自动添加where关键字

c) 如果第一个条件中有and, 去除之

<select id="sel" resultType="user">

select * from t_user

<where>

<if test="username != null and username != ''">

and username=#{username}

</if>

<if test="password != null and password != ''">

and password=#{password}

</if>

</where>

</select>

3.3 <choose><when><otherwise>

这是一套标签, 功能类似于switch...case...

<select id="sel" resultType="user">

select * from t_user

<where>

<choose>

<when test="username != null and username != ''">

and username = #{username}

</when>

<when test="password != null and password != ''">

and password = #{password}

</when>

<otherwise>

and 1=1

</otherwise>

</choose>

</where>

</select>

3.4 <set>

用于维护update语句中的set子句. 功能如下:

a) 满足条件时, 会自动添加set关键字

b) 会去除set子句中多余的逗号

c) 不满足条件时, 不会生成set关键字

int updUser(User user);

<update id="updUser" parameterType="user">

update t_user

<set>

id=#{id}, <!-- 防止所有条件不成立时的语法错误 -->

<if test="username != null and username != ''">

username=#{username},

</if>

<if test="password != null and password != ''">

password=#{password},

</if>

</set>

where id=#{id}

</update>

3.5 <trim>

用于在前后添加或删除一些内容

a) prefix, 在前面添加内容

b) prefixOverrides, 从前面去除内容

c) suffix, 向后面添加内容

d) suffixOverrides, 从后面去除内容

<update id="updUser" parameterType="user">

update t_user

<!--

prefix: 前缀, 表示向前面添加内容

prefixOverrides: 从前面删除内容

suffix: 后缀, 表示向后面添加内容

suffixOverrides: 从后面删除内容

-->

<trim prefix="set" prefixOverrides="user" suffix="hahaha" suffixOverrides=",">

username=#{username},

</trim>

where id=#{id}

</update>

3.6 <bind>

用于对数据进行再加工, 用于模糊查询

<select id="sel" resultType="user">

select * from t_user

<where>

<if test="username!=null and username!=''">

<bind name="username" value="'%' + username + '%'"/>

and username like #{username}

</if>

</where>

</select>

接口的绑定方案和动态SQL的更多相关文章

  1. 黑马MyBatisday2 MyBatis Dao层实现 接口代理实现&传统实现 动态SQL和SQL抽取 自定义类型处理 分页插件PageHelper

    package com.itheima.mapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelp ...

  2. Oracle基础 动态SQL语句

    一.静态SQL和动态SQL的概念. 1.静态SQL 静态SQL是我们常用的使用SQL语句的方式,就是编写PL/SQL时,SQL语句已经编写好了.因为静态SQL是在编写程序时就确定了,我们只能使用SQL ...

  3. .Net程序员学用Oracle系列(28):PLSQL 之SQL分类和动态SQL

    1.SQL 语句分类 1.1.分类方法及类型 1.2.数据定义语言 1.3.数据操纵语言 1.4.其它语句 2.动态 SQL 理论 2.1.动态 SQL 的用途 2.2.动态 SQL 的语法 2.3. ...

  4. 动态SQL详解

    动态SQL 在之前用户所编写的PL/SQL程序时有一个最大的特点:就是所操作的数据库对象(例如:表)必须存在,否则创建的子程序就会出问题,而这样的操作在开发之中被称为静态SQL操作,而动态SQL操作可 ...

  5. 本地动态SQL

    (转自:http://blog.itpub.net/26622598/viewspace-718134) 一.什么是动态SQL 大多数PL/SQL都做着一件特殊的结果可预知的工作.例如,一个存储过程可 ...

  6. Spring mybatis源码篇章-动态SQL基础语法以及原理

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-Mybatis的XML文件加载 前话 前文通过Spring中配置mapperLocations属性来进行对m ...

  7. mybatis 接口绑定 和 动态SQL

    一.MyBatis 接口绑定方案及多参数传递 1.作用:实现创建一个接口后把mapper.xml由mybatis生成接口的实现类,通过调用接口对象就可以获取mapper.xml中编写的sql 2.后面 ...

  8. 利用MyBatis的动态SQL特性抽象统一SQL查询接口

    1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射 ...

  9. MyBatis学习(一)---配置文件,Mapper接口和动态SQL

    MyBatis MyBatis官方学习网站 http://www.mybatis.org/mybatis-3/zh/index.html 为什么需要MyBatis? Jdbc操作数据库的不足之处 1. ...

随机推荐

  1. 全网最详细的Windows里Anaconda-Navigator启动后闪退的解决方案(图文详解)

    不多说,直接上干货!  问题详情 点击 出现Anaconda-Navigator启动后闪退的现象. 或者 装过一次anaconda,貌似按了一个更新的键就打不开了.navigator这个打不开,会停留 ...

  2. 转载:浏览器开发系列第一篇:如何获取最新chromium源码

    背景:     最近摊上一个事儿,领导非要让写一篇技术文章,思来想去,自己接触chrome浏览器时间也不短了,干脆就总结一下吧.于是乎,本文顺理成章.由于有些细节必需描述清楚,所以这次先讲如何拿到ch ...

  3. 【原创+整理】简述何为调用约定,函数导出名以及extern C

    何为调用约定 调用约定指的是函数在调用时会按照不同规则,翻译成不同的汇编代码.这和参数的压栈顺序和栈的清理方式相关,也就是说不同的调用约定,这些方式会做相应改变.一般编译器是以默认的调用约定编译一份代 ...

  4. 如何用Python编写一个聊天室

    一.课程介绍 1.简介 本次项目课是实现简单聊天室程序的服务器端和客户端. 2.知识点 服务器端涉及到asyncore.asynchat和socket这几个模块,客户端用到了telnetlib.wx. ...

  5. 【ASP.NET MVC系列】浅谈ASP.NET MVC资源过滤和授权

    最近比较忙,博客很久没更新了,很多博友问何时更新博文,因此,今天就花了点时间,写了本篇文章,但愿大家喜欢. 本篇文章不适合初学者,需要对ASP.NET MVC具有一定基础. 本篇文章主要从ASP.NE ...

  6. centos安装Nginx1.9.9

    今天在安装centos的时候,又出现了yum报错的情况,弄了半个小时就弄好,就直接放弃了,使用了VMware快照功能.(快照功能要经常使用,我使用的频率不高,所以这次又造成了以前安装好的很多模块又得重 ...

  7. 【Go】go get 自动代理

    原文链接:https://blog.thinkeridea.com/201903/go/go_get_proxy.html 最近发现技术交流群里很多人在询问 go get 墙外包失败的问题,大家给了很 ...

  8. 基于SpringMVC+Spring+MyBatis实现秒杀系统【数据库接口】

    前言 该篇教程主要关注MyBatis实现底层的接口,把MyBatis交给Spring来托管.数据库连接池用的c3p0.数据库用的MySQL.主要有2个大类:秒杀商品的查询.秒杀明细的插入. 准备工作 ...

  9. OJ:访问 const 成员函数问题

    Description 补足程序使得其输出结果是: 40 #include <iostream> #include <string> using namespace std; ...

  10. UVC 驱动调用过程与驱动框架的简单分析

    内核:Linux-3.4.2 驱动:drivers\media\video\uvc\uvc_driver.c UVC 驱动整体调用流程: /* 打开设备描述符 */ 1. open: uvc_v4l2 ...