一、注解配置

目前MyBatis支持注解配置,用注解方式来替代映射文件,但是注解配置还是有点不完善,在开发中使用比较少,大部分的企业还是在用映射文件来进行配置。不完善的地方体现在于当数据表中的字段名与实体对象的属性名不一致时,需要配置ResultMap,但是注解的配置只能是在方法前,也就是当前方法能使用这个配置,其他的方法是不能应用此注解配置的ResultMap。

注解配置的方式是直接在数据访问接口的方法前加上相应的注解

@select(“select * from  student ”)

public List<Student> find();

在MyBatis的主配置文件的mappers节点中注册所有的数据持久化接口类

案例:

数据持久化接口

public interface SubjectDao {

@Select("select * from subject")

@Results({

@Result(id=true,column="subjectNo",property="id"),

@Result(column="subjectName",property="subjectName"),

@Result(column="classHour",property="hour")

})

public List<Subject> find();

}

MyBatis主配置文件的mappers节点配置

<!-- 如果有映射时,对映射文件进行配置 -->

<mappers>

<!-- 加载单个映射文件,允许映射文件与持久接口类不在同一目录下。 -->

<mapper resource="com/icss/mapping/AdminDao.xml"/>

<mapper resource="com/icss/mapping/GradeDao.xml"/>

<mapper resource="com/icss/mapping/StudentDao.xml"/>

<!-- 注解配置时,需要在主配置文件中注册数据持久化接口类 -->

<mapper class="com.icss.dao.SubjectDao"/>

<!-- 加载这个包中的所有映射文件,要求持久化接口与映射文件必须在同一个目录中 -->

<!-- <package name="com.icss.dao"/>  -->

</mappers>

当表中的数据行有一对多或多对一的映射关系时的处理方式

一对多:

//一对多  : many

@Select("select * from grade")

@Results(

{

@Result(id=true, column="gradeId",property="gradeId"),

@Result(column="gradeName", property="gradeName"),

@Result(column="gradeId",property="subjects",

many=@Many(select = "com.etc.dao.SubjectDao.findSubjectByGradeId"))

}

)

public List<Grade> find();

多对一:

@Select("select * from subject")

@Results({

@Result(id=true,column="subjectNo",property="id"),

@Result(column="subjectName",property="subjectName"),

@Result(column="classHour",property="hour"),

//多对一的情况操作,根据年级编号调用年级的数据持久化接口的方法,返回一个年级对象存储在grade这个属性中。

@Result(column="gradeId",property="grade",one=@One(select="com.icss.dao.GradeDao.getGradeById"))

})

public List<Subject> find();

数据持久化层代码:

package com.icss.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;

import org.apache.ibatis.annotations.Insert;

import org.apache.ibatis.annotations.One;

import org.apache.ibatis.annotations.Result;

import org.apache.ibatis.annotations.Results;

import org.apache.ibatis.annotations.Select;

import org.apache.ibatis.annotations.Update;

import com.icss.entity.Subject;

public interface SubjectDao {

@Select("select * from subject")

@Results({

@Result(id=true,column="subjectNo",property="id"),

@Result(column="subjectName",property="subjectName"),

@Result(column="classHour",property="hour"),

//多对一的情况操作,根据年级编号调用年级的数据持久化接口的方法,返回一个年级对象存储在grade这个属性中。 @Result(column="gradeId",property="grade",one=@One(select="com.icss.dao.GradeDao.getGradeById"))

})

public List<Subject> find();

//根据年级查询课程

@Select("select * from subject where gradeId=#{id}")

@Results({

@Result(id=true,column="subjectNo",property="id"),

@Result(column="subjectName",property="subjectName"),

@Result(column="classHour",property="hour"),

//多对一的情况操作,根据年级编号调用年级的数据持久化接口的方法,返回一个年级对象存储在grade这个属性中。 @Result(column="gradeId",property="grade",one=@One(select="com.icss.dao.GradeDao.getGradeById"))

})

public List<Subject> findByGID(int id);

//新增

@Insert("insert into subject(null,#{subjectName},#{hour},#{grade.gradeId})")

public int add(Subject subject);

//删除

@Delete("delete from subject where subjectNo=#{id}")

public int delete(int id);

//修改

@Update("update subejct set subjectName=#{subjectName},classHour=#{hour},"

+ " gradeId=#{grade.gradeId} where subjectNo=#{id}")

public int update(Subject subject);

}

在团队开发中,建议统一用其中的一种处理方式,用注解就全部用注解,用映射文件就统一用映射文件。

二、模糊查询

错误的处理方法:

<!-- 字段与属性名不一致,不能用resultType属性 -->

<select id="getStudents" resultMap="studentMap" parameterType="map">

select * from student

<if test="name != null">

where name like '%'+#{name}+'%'

</if>

</select>

正确的方式是在参数传入之前就加了这些通配符。

sqlSession = SqlSessionFactoryUtil.getsqlSession();

StudentDao dao= sqlSession.getMapper(StudentDao.class);

//参数传入到映射文件前就加了模糊查询的通配符

Map<String, String> map = new HashMap<>();

map.put("name", "%张%");

//调用方法,执行查询

list=dao.getStudents(map);

映入文件如下:

<!-- 字段与属性名不一致,不能用resultType属性 -->

<select id="getStudents" resultMap="studentMap" parameterType="map">

select * from student

<if test="name != null">

where name like #{name}

</if>

</select>

三、动态SQL

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力,也是MyBatis最有特色的地方,就是它的动态SQL,解决了我们多条件时SQL指令的拼接问题。查询学生信息:条件可能(姓名,年龄,年级,性别,地址)

通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语 言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中。 动态SQL非常简单,与JSTL的使用非常类似。

if:当条件成立时,则把内部的SQL拼接到外部的SQL指令中。

<!-- 字段与属性名不一致,不能用resultType属性 -->

<select id="getStudents" resultMap="studentMap" parameterType="map">

select * from student

<if test="name != null">

where name like #{name}

</if>

</select>

choose, when, otherwise:

这是一个多重if-else结构,如果只有一个when和otherwise,则可以认为是if-else结构

<!-- 字段与属性名不一致,不能用resultType属性 -->

<select id="getStudents" resultMap="studentMap" parameterType="map">

select * from student

<choose>

<when test="name != null">

where name like #{name}

</when>

<otherwise>

where age > #{age}

</otherwise>

</choose>

</select>

where:

当条件比较多的时候,要进行条件拼接,where的作用是进行条件拼接,自动加上where 关键字,而且会把多余的and 或 or 这些连接关键字去掉。

<!-- 字段与属性名不一致,不能用resultType属性 -->

<select id="getStudents" resultMap="studentMap" parameterType="map">

select * from student

<where>

<if test="name != null">

and name like #{name}

</if>

<if test="age != null">

and age > #{age}

</if>

</where>

</select>

拼接后的SQL: select * from student where and name like '%张%' and age > 22

标红的 and 会自动去掉.

set: 用于修改的SQL指令

在修改的SQL指令中自动加上set关键字,同时把多余的逗号(,)去掉。非常适合部分值

<update id="update" parameterType="map">

update student

<set>

<if test="name != null">

name=#{name},

</if>

<if test="age != null">

age=#{age},

</if>

<if test="sex != null">

sex=#{sex},

</if>

<if test="phone != null">

phone=#{phone}

</if>

</set>

where studentNo=1002

</update>

拼接后的SQL:

update student set name='肖月月',age=20,sex='女' where studentNo=1002

foreach

这个动态 SQL 通用的必要操作是迭代一个集合, 通常是构建在 IN 条件中.

<select id="getStudents1" resultMap="studentMap" parameterType="list">

select * from student where address in

<foreach item="s" collection="list" open="(" close=")" separator=",">

#{s}

</foreach>

</select>

业务层处理:

sqlSession = SqlSessionFactoryUtil.getsqlSession();

StudentDao dao= sqlSession.getMapper(StudentDao.class);

List<String> arr = new ArrayList<String>();

arr.add("广州市");

arr.add("深圳市");

//调用方法,执行查询

list=dao.getStudents1(arr);

MyBatis 注解配置及动态SQL的更多相关文章

  1. mybatis注解开发,动态sql

    在利用mybatis注解开始时,如果没有用到动态sql时,可以直接写 @Select("select * from order") List<XlSubOrder> g ...

  2. 08—mybatis注解配置二

    动态sql mybatis的注解也支持动态sql.mybatis提供了各种注解,如@InsertProvider.@UpdateProvider.@DeleteProvider和@SelectProv ...

  3. Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!

    封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 ... 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨 ...

  4. MyBatis学习总结_11_MyBatis动态Sql语句

    MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...

  5. SSM框架之Mybatis(6)动态SQL

    Mybatis(6)动态SQL 1.动态SQL 出现原因:有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了 1.1.if标签 我们根据实体类的不 ...

  6. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL

  7. Spring mybatis源码篇章-动态SQL节点源码深入

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-动态SQL基础语法以及原理 前话 前文描述到通过mybatis默认的解析驱动类org.apache.ibat ...

  8. MyBatis注解配置动态SQL

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

  9. 学习MyBatis必知必会(7)~注解开发、动态SQL

    一.MyBatis的注解开发 开发中推荐是使用xml文件配置 1.配置映射关系[使用注解的方式]: <!-- 全局的配置文件 --> <configuration> <! ...

随机推荐

  1. careercup-扩展性和存储限制10.3

    题目 给你一个文件,里面包含40亿个整数,写一个算法找出该文件中不包含的一个整数, 假设你有1GB内存可用. 如果你只有10MB的内存呢? 解答 我们先来做个算术题,40亿个整数大概有多大? * ^ ...

  2. hibernateDAO层基本的增删改查

    完整的学习项目放在了我的github上,是一个半成品的在线音乐网站. hibernate版本1.4 下面是userDAO 即对user表进行增删改查 package DAO; import java. ...

  3. HTML如何禁止input输入

    第一种方法: 在input元素上加readonly="readonly"属性 <input type="text" readonly="read ...

  4. 使用 jTessBoxEditor 生成 tesseract-orc 的字典

    本文使用图片方式记录使用 jTessBoxEditor 一站式生成自动文件的方式 首先感谢 Tesseract OCR 讨论群 389402579 的管理员[创世倾城 QQ:457606663] 的帮 ...

  5. Sass使用

    1. 什么是Sass ???   Sass是一个将脚本解析成CSS的脚本语言,也可以称为CSS扩展语言. 2. 安装: 第一步:先安装Ruby (sass基于Ruby语言开发而成,因此安装sass前需 ...

  6. Google+百度,自动识别知名人物的性别

    最近有一个任务,需要采集一批知名学者的性别信息.该任务的难点在于提供学者信息的网站并不会主动标注学者的性别性别,因此只能靠别的方法了. 对一个普通人来说,在网上判断一个人的性别的最快的方式就是看他的照 ...

  7. hadoop生态搭建(3节点)-16.elk配置

    # ==================================================================ELK环境准备 # 修改文件限制 # * 代表Linux所有用户 ...

  8. Python3练习:对员工信息文件,实现增删改查操作

    1.练习要求: 2.数据文件(data_staff.txt) 1,Alex Li,22,13651054684,运维,2013-02-04 2,Jack Wang,20,13312331232,HR, ...

  9. notpad++ 搭配 gcc

    notpad++ 搭配 gcc GCC 是 GNU 编译器套装的简称(GNU Compiler Collection),一套编程语言编译器,以 GPL 及 LGPL 许可证所发行的自由软件,也是 GN ...

  10. HDOJ:1533-Going Home(最小费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1533 解题心得: 第一次写最小费用流的题,去hdoj上找了一个入门级题目,建图比较简单,用了spfa和 ...