一、注解实现MyBatis配置

  java注解是在jdk1.5版本之后开始加入的,不得不说注解对于我们开发人员来说是个很方便的东西,实现起来也非常的简单,下边我们说一下在MyBatis中使用注解来替换Mapper配置文件。

package com.lhf.dao;

import com.lhf.entity.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update; import java.util.List; public interface UserDao {
@Select("select * from user")
List<User> getAll();
@Delete("delete from user where id=#{id}")
int del(int id);
@Insert("insert into user values(default,#{name},#{pwd})")
int add(User user);
@Update("update user set name=#{name},pwd=#{pwd} where id=#{id}")
int modify(User user);
}

删除UserDaoMaper的xml文件,在dao层使用注解(select、delete、insert、update)来实现数据库的简单操作,这个效果与Xml文件的效果是一致的。上一篇中有介绍xml文件的配置

一定会有人问,这里方法内的参数一般都是一个,那如果是两个以及以上怎么办呢?那就需要我们的@Parm注解了,该注解的作用可以看成是给参数起别名:

MyBatis基本常用的注解大概就说这么多后续再补充

二、动态SQL

何为动态SQL,就是服务器根据用户请求从而选择性的发送SQL语句,最典型的就是修改了,一个表中有多个字段,如果用户只需修改其中一个即可,那我们的SQL语句就没办法确定要修改哪一个,以前的做法是再修改前先获取所有的字段信息,然后按照用户所做的修改一 一进行比对,最后统一进行修改。这样的话我们就需要再dao将所有的字段都修改一次了,这和删除以后再新增一个区别不大,而且浪费资源,所有才有了动态SQL的诞生,动态sql只能是在xml文件中进行配置

if : If标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件,它也经常用于UPDATE语句中判断是否更新某一个字段,还可以在INSERT语句中用来判断是否插入某个字段的值。

<?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.lhf.dao.UserDao">
<update id="modify">
update user set
<if test="pwd!=null">
pwd=#{pwd}
</if>
where
<if test="id>0">
id=#{id}
</if>
</update>
</mapper>

类似于java中的if判断语句,test中为判断条件。

choose:上一部分的if标签提供了基本的条件判断,但是它无法实现if....else、if....else..... 的逻辑,要想实现这样的逻辑,就需要使用到choose when otherwise标签。choose元素中包含when和otherwise两个标签,一个choose中至少包含一个when,有0个或1个otherwise。

 <select id="select" resultType="User">
select * from user where 1=1
<choose>
<when test="name!=null and name!=''">
and name=#{name}
</when>
<when test="id!=-1">
and id=#{id}
</when>
<otherwise>
and name="程序员"
</otherwise>
</choose>
</select>

where:Where标签的作用:如果该标签包含的元素有返回值,就插入一个where;如果where 后面的字符串是以and和or开头,就将它剔除。

<select id="select" resultType="User">
select * from user<!--使用了where标签,无需手动编写where条件-->
<where>
<choose>
<when test="name!=null and name!=''">
and name=#{name}
</when>
<when test="id!=-1">
and id=#{id}
</when>
<otherwise>
and name="程序员"
</otherwise>
</choose>
</where>
</select>

set:Set标签的作用:如果该标签包含的元素中有返回值,就插入一个set;如果set后面的字符串是以逗号结尾的,就把这个逗号剔除

<update id="modify" parameterType="User">
<!--如果参数类型是一个对象,那么sql语句中#{对象的属性名}-->
update user
<!--使用<set>标签替代set语句-->
<set>
<if test="name!=null and name !=''">
name=#{name},
</if>
</set>
where id=#{id}
</update>

trim:Where和set标签的功能都可以使用trim标签来实现。

<trim prefix="WHERE" prefixOverrides="AND|OR">

</trim>
<trim prefix="SET" suffixOverrides=",">

</trim>

trim标签有如下属性:

prefix:当trim元素中包含内容时,会给内容增加prefix指定的前缀

prefixOverrides:当trim元素中包含内容时,会把内容中匹配的前缀去掉

suffix:当trim元素中包含内容时,会给内容增加suffix指定的后缀

suffixOverrides:当trim元素中包含内容时,会把内容中匹配的后缀去掉

foreach:可以生成一系列的值,这个标签主要用于SQL的in语句后面 foreach元素的属性主要有 item,index,collection,open,separator,close。

  • item:示集合中每一个元素进行迭代时的别名,

    index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置,

    open:表示该语句以什么开始,

    separator:表示在每次进行迭代之间以什么符号作为分隔 符,

   close:表示该语句以什么结束 

(1)foreach实现in集合

    使用foreach元素可以in 集合|数组

  1.foreach元素in array数组

      接口方法如下:

      

//根据插入的id数组获取用户
List<User> findUserByIds(int[] ids);

在UserMapper.xml中新增select节点

<select id="findUserByIds" resultType="User">
select * from account
<!--此处必须使用array 不能使用参数名-->
<if test="array.length>0">
where id IN
<foreach collection="array" open="(" close=")" separator="," item="item">
#{item}<!--item此时表示数组中的元素-->
</foreach>
</if>
</select>

新增测试代码

 

@Test
public void test04(){
//检索id为3,5的用户
List<User> userByIds = mapper.findUserByIds(new int[]{3, 5});
System.out.println(userByIds);
}

2.foreach元素in 普通list集合

//根据插入的id集合获取用户
List<User> findUserByIds(List<Integer> lists);

修改select节点如下

<select id="findUserByIds" resultType="User">
select * from account
<!--此处必须使用list 不能使用参数名-->
<if test="list.size>0">
where id IN
<foreach collection="list" open="(" close=")" separator="," item="item">
#{item}<!--item此时表示集合中的元素-->
</foreach>
</if>
</select>

测试代码如下

@Test
public void test04(){
//检索id为3,5的用户
List<Integer> lists=new ArrayList<>();
lists.add(3);
lists.add(5);
List<User> userByIds = mapper.findUserByIds(lists);
System.out.println(userByIds);
}

3.foreach元素in 自定义list集合

修改上述代码,将findUserByIds方法修改如下:

//根据插入的id集合获取用户
List<User> findUserByIds(List<User> lists);

修改select节点如下:

<select id="findUserByIds" resultType="User">
select * from account
<!--此处必须使用list 不能使用参数名-->
<if test="list.size>0">
where id IN
<foreach collection="list" open="(" close=")" separator="," item="item">
#{item.id}<!--item此时表示集合中的元素User对象-->
</foreach>
</if>
</select>

修改测试代码如下:

@Test
public void test04(){
//检索id为3,5的用户
List<User> lists=new ArrayList<>();
User user=new User();
User user1=new User();
user.setId(3);
user1.setId(5);
lists.add(user);
lists.add(user1);
List<User> userByIds = mapper.findUserByIds(lists);
System.out.println(userByIds);
}

MyBatis注解及动态Sql的更多相关文章

  1. MyBatis注解配置动态SQL

    MySQL创建表 DROP TABLE IF EXISTS `tb_employee`; CREATE TABLE `tb_employee` ( `id` int(11) NOT NULL AUTO ...

  2. MyBatis 注解使用动态SQL

    使用MyBatis很长时间了,一直使用的是XML配置的 SQL,刚好在上一个项目中尝试使用注解方式开发,主要是由于XML配置过于繁琐,注解可以直接写在Mapper函数上,更加的方便一些. 在注解上不能 ...

  3. mybatis注解开发-动态SQL

    实体类以及表结构 在mybatis-config.xml中注册mapper接口 -------------------------- 动态查询@SelectProvider EmployeeMappe ...

  4. Mybatis之注解实现动态sql

    通过注解实现动态sql一共需要三部:1.创建表,2.创建entity类,3.创建mapper类, 4.创建动态sql的Provider类.1.和2.可以参见该系列其他文章,这里主要对3和4进行演示,并 ...

  5. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

  6. Mybatis入门之动态sql

    Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...

  7. mybatis 详解------动态SQL

    mybatis 详解------动态SQL   目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...

  8. mybatis中的动态SQL

    在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...

  9. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

随机推荐

  1. 使用Matplotlib

    1.Matplotlib是python的一个绘图库. 2.from matplotlib import pyplot as plt

  2. 基于python的arcgis底图添加(转)

    本文翻译自:Qingkai‘s Blog 当使用python的Basemap库绘制地图时,选择一个漂亮的底图会为图片增色不少,但是使用map.bluemarble().map.etopo()或者map ...

  3. Vue.js——5.生命周期

    Vue的生命周期 创建阶段new Vue1,beforeCreate() 表示在实例没有被创建出来之前会执行它加载data和methods2,caeated() data 和methods被初始化了 ...

  4. Node.js—小试牛刀-创建目录

    今天第一天学习Node.js  感觉特别亲切 //文件结构 //引入模块 const path=require('path') const fs=require('fs') let roots='H: ...

  5. GUI(Graphical User Interface)

    译:用户和图形界面 GUI与程序交互的不同方式,包含3基本要素:输入,处理和输出. 常用GUI框架包括以下几种: wxPython Kivy Flexx PyQt Tkinter Pywin32 Py ...

  6. 1. 现代 javascript 用法 简介 及 babel

    简介 包含 ECMAScript 基本概念,babel 使用 ,eslint 使用 以及新语法的介绍 和使用经验 ECMAScript 概念 ECMASctipt 是一种由 Ecma (前身为欧洲计算 ...

  7. 刷题33. Search in Rotated Sorted Array

    一.题目说明 这个题目是33. Search in Rotated Sorted Array,说的是在一个"扭转"的有序列表中,查找一个元素,时间复杂度O(logn). 二.我的解 ...

  8. redis的过期策略

    1.了解redis 什么是Redis,为啥用缓存? Redis是用内存当缓存的.Redis主要是基于内存来进行高性能.高并发的读写操作的. 内存是有限的,比如Redis就只能用10个G,你一直往里面写 ...

  9. Qt QRect与QRectF的区别

    一直在与QRect和QRectF打交道.甚至在使用过程中因为QRect而出现了致命的Bug.因为QRect在数据存储表示上有一个很大的“历史遗留问题”! QRect Class   也就是说,对于QR ...

  10. vue-router中参数传递

    VUE路由之间携带参数 今天在实现一个功能的时候遇到的问题,一个把组件a中的值传输到组件b中时,但是组件a和组件b之间通信的时候路由跳转了 猜想:路由跳转导致监听事件失败,(暂时理解为:当路由跳转后监 ...