MyBatis之XML配置文件(一)

news/2024/9/19 0:49:48/ 标签: mybatis, xml, java

Mbatis是一个ORM框架,可以用XML配置文件或注解映射SQL语句,映射文件是MyBatis框架的核心,本文主要讲述XML 映射文件的结构和使用方法。

一、SQL映射文件

SQL映射文件就是mapperxml配置文件,主要实现SQL语句的配置和映射,同时实现JAVA 的POJO对象与数据库中的表和字段进行映射联系的功能。

1、mapper.xml的结构

以student 数据表为例,具体结构可以参看专栏的相关文章,下面是创建的StudentMapper.xml示例,代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.weiz.example01.mapper.StudentMapper"><resultMap id="BaseResultMap" type="org.weiz.example01.model.Student"><id property="id" column="id"/><result property="name" column="name"/><result property="sex" column="sex"/><result property="age" column="age"/></resultMap><select id="selectAll" resultMap="BaseResultMap">SELECT * FROM student</select><select id="selectOne" parameterType="Long" resultMap="BaseResultMap">SELECT <include refid="Base_Column_List" />FROM   studentWHERE  id= #{id}</select><sql id="Base_Column_List">id,name,sex,age</sql><insert id="insert" parameterType="org.weiz.example01.model.Student">insert into  student (name,sex,age)  values (#{name},#{sex},#{age})</insert><update id="update" parameterType="org.weiz.example01.model.Student">UPDATE  studentSET<if test="name !=null">name=#{name},</if><if test="sex !=null">sex=#{sex},</if>age=#{age}WHERE  id=#{id}</update><delete id="delete" parameterType="Long">DELETE FROM  studentWHERE  id=#{id}</delete><resultMap id="StudentAndClassMap" type="org.weiz.example01.model.Student"><id property="id" column="id"/><result property="name" column="name"/><result property="sex" column="sex"/><result property="age" column="age"/><!--association用户关系映射,查询单个完整对象--><association property="classes"javaType="org.weiz.example01.model.Classes"><id column="id" property="id" /><result column="class_name" property="name"  jdbcType="VARCHAR"/><result column="memo"  property="memo" jdbcType="VARCHAR" /></association></resultMap><select id="selectStudentAndClass" parameterType="Long"resultMap="StudentAndClassMap">SELECTs.id,s.name,s.sex,s.age,s.class_id,c.name as class_name, c.memoFROM  student s  left join classes  c on s.class_id=c.idWHERE  s.id=#{id}</select></mapper>

如上述示例所示,mapper.xml主要分为4 部分:

(1)mapper.xml的语法声明,声明MyBatis语法。

(2)通过namespace指明mapper.xml文件对应的Mapper接口。

(3)通过XML标签定义接口方法对应的SQL语句,id属性对应Mapper接口的方法,resultMap属性为返回值类型。

(4)<resultMap>标签定义返回的结果类型与数据库表结构的对应关系。

2、mapper.xml的标签

映射文件提供了一些非常实用的标签,标签和功能说明如下所示:

二、定义SQL语句

MyBatis提供了insert、delete 、select、 update四个标签定义SQL语句,以下简要介绍每个标签的用法。

1、select

Select是Mybatis的常用元素之一,简单查询如下所示:

<select id="selectOne"  parameterType="Long" resultType="hashMap">SELECT  name,age  FROM  student   WHERE  id=#{id}
</select>

Select标签允许配置参数类型、返回值类型等属性,具体属性如下所示:

标签虽然有很多属性,但常用的是id、parametrerType、 resultType、 resultMap这四个属性。

2、insert

insert标签用于定义插入数据的SQL语句,例如:

<insert  id="insert"  parameterType="org.weiz.example01.model.Student">INSERT INTOstudent(id,name,sex,age)VALUES(#{id},#{name},#{sex},#{age})
</insert>

如数据表包含自动生成主键的字段,可以修改为如下所示:

<insert  id="insert"  useGenerateKeys="true"  keyProperty="id"parameterType="org.weiz.example01.model.Student">INSERT INTOstudent(name,sex,age)VALUES(#{name},#{sex},#{age})
</insert>

insert标签包含属性如表所示:

常用属性有id、parameterType、useGenerateKeys、keyProperty等

3、update

它主要映射更新语句,示例代码如下:

    <update id="update" parameterType="org.weiz.example01.model.Student">UPDATE  studentSETname=#{name},sex=#{sex},age=#{age}WHERE  id=#{id}</update>

如果需要根据传入参数来动态判断是否进行修改,可以使用if标签动态生成SQL语句,示例代码如下:

    <update id="update" parameterType="org.weiz.example01.model.Student">UPDATE  studentSET<if test="name !=null">name=#{name},</if><if test="sex !=null">sex=#{sex},</if>age=#{age}WHERE  id=#{id}</update>

update标签包含的属性和insert标签基本一致。

4、delete

它用来映射删除语句,示例代码如下:

 <delete id="delete" parameterType="Long">DELETE FROM  studentWHERE  id=#{id}</delete>

delete标签包含的属性如表所示:

delete标签除了少了useGenerateKeys  keyProperty  keyColumn三个属性之外,其余的和insert\ update标签一致。

三、结果映射

结果映射是MyBatis重要功能之一,简单的SQL查询,使用resultType属性自动将结果转换成Java数据类型,如果是复杂语句,可使用resultMap映射将查询结果转换成数据实体关系。

1、resultType

示例一:

    <select id="selectOne" parameterType="Long" resultType="org.weiz.exampleo01.model.Student">SELECT  *FROM   studentWHERE  id= #{id}</select>

通过设置resultType属性,MyBatis会自动把查询结果集转换为Student实体对象。如果只查询部分字段,则可以返回HashMap,示例如下:

示例二:

<select id="selectOne"  parameterType="Long" resultType="hashMap">SELECT  name,age  FROM  student   WHERE  id=#{id}
</select>

2、resultMap

resultMap标签定义SQL查询结果字段与实体属性的映射关系。示例如下:

 <resultMap id="BaseResultMap" type="org.weiz.example01.model.Student"><id property="id" column="id"/><result property="name" column="name"/><result property="sex" column="sex"/><result property="age" column="age"/></resultMap>

   设置selecct标签的resultMap=“BaseResultMap”,示例代码如下:

  <select id="selectOne" parameterType="Long" resultMap="BaseResultMap">SELECT  *FROM   studentWHERE  id= #{id}</select>

3、 resultMap的结构

它结构复杂,其主要属性如下:

        id : 定义resultMap的唯一标识

        type: 为返回值的类名

        子标签:

          (1)id标签设置主键字段与领域模型属性的映射关系

          (2)result标签用于设置普通字段与领域模型的属性映射关系。

          (3) associaation标签用于配置一对结果映射,可以关联resultMap中的定义,或者对其它结果映射 。

           (4)collection标签用于配置一对多结果映射,可以关联resultMap结果映射中的定义或其它映射。

示例代码如下:

 <resultMap id="StudentAndClassMap" type="org.weiz.example01.model.Student"><id property="id" column="id"/><result property="name" column="name"/><result property="sex" column="sex"/><result property="age" column="age"/><!--association用户关系映射,查询单个完整对象--><association property="classes"javaType="org.weiz.example01.model.Classes"><id column="id" property="id" /><result column="class_name" property="name"  jdbcType="VARCHAR"/><result column="memo"  property="memo" jdbcType="VARCHAR" /></association></resultMap>

四、关联关系

多表关联的复杂结果需要通过collection标签和association标签配置关联关系。

        1、association(一对一)

          它通常用于映射一对一的关系,比如一个(Student)对应一个班级(Classes),一个学生只能属于一个班级,下面以学生和班级为例演示association 配置一对一关系。

步骤如下:

       (1)创建班级表classes,主要有id(主键、bigint、自增)、name(班级名称、varchar、长度255)、memo(班级简介、 varchar、长度为255)三个字段。

          (2)新建classes的POJO类和mapper映射文件

          (3)修改Student类,增加学生对应班级classes属性

java">private Classes classes;

         (4)修改StudentMapper接口,增加查询班级信息的方法,示例如下:

java">Student  selectStudentAndClass(Long id);

          (5)  修改StudentMapper映射文件,配置实体映射关系,示例代码如下:

<resultMap id="StudentAndClassMap" type="org.weiz.example01.model.Student"><id property="id" column="id"/><result property="name" column="name"/><result property="sex" column="sex"/><result property="age" column="age"/><!--association用户关系映射,查询单个完整对象--><association property="classes"javaType="org.weiz.example01.model.Classes"><id column="id" property="id" /><result column="class_name" property="name"  jdbcType="VARCHAR"/><result column="memo"  property="memo" jdbcType="VARCHAR" /></association>
</resultMap>

                (6)定义查询语句,示例代码如下:

 <select id="selectStudentAndClass" parameterType="Long"resultMap="StudentAndClassMap">SELECTs.id,s.name,s.sex,s.age,s.class_id,c.name as class_name, c.memoFROM  student s  left join classes  c on s.class_id=c.idWHERE  s.id=#{id}</select>

2、collection(一对多)

collection用于映射一对多的关系,将关联查询信息映射到一个列表集合中。比如一个班级(Classes)对应多名学生Student,下面以此演示collection标签配置一对多关系。

步骤如下:

     (1)修改Student表,增加class_id,表示班级ID。

     (2)修改ClassMapper接口,查询班级和班级下的所有学生信息,代码如下:

     

java">Classes selectClassAndStudent(Long id);

         (3) 在classMapper.xml映射文件中,定义返回数据resultMap,代码如下:

  <resultMap id="ClassAndStudentMap" type="org.weiz.example01.model.Classes" ><id column="id" property="id" jdbcType="INTEGER" /><result column="name" property="name" jdbcType="VARCHAR" /><result column="createtime" property="createtime" jdbcType="DATE" /><result column="memo" property="memo" jdbcType="VARCHAR" /><collection property="students"ofType="org.weiz.example01.model.Student"><id property="id"   column="student_id"/><result property="name" column="student_name" /><result property="age" column="age" /><result property="sex" column="sex" /></collection></resultMap>

  (4)创建SQL语句,示例代码如下:

  <select id="selectClassAndStudent" parameterType="Long"resultMap="ClassAndStudentMap">SELECT c.id,c.name,c.memo,s.id as student_id ,s.name as student_name,s.age,s.sexFROM classes c  left join student s on s.class_id=c.idWHERE c.id=#{id}</select>

       五、SQL代码片段

       当多个SQL语句存在相同的部分,可以将其定义为公共的SQL代码片段,MyBatis提供了sql和include标签定义和引用sql代码片段。

例如:

 <select id="selectOne" parameterType="Long" resultMap="BaseResultMap">SELECT <include refid="Base_Column_List" />FROM   studentWHERE  id= #{id}</select><sql id="Base_Column_List">id,name,sex,age</sql>

在上面的示例中,使用include标签引用定义的base_Column_List代码片段。

 sql标签也支持传入参数,可以对上面的示例进行如下修改:

<sql id="Base_Column_List">${alias_s}.id,${alias_s}.name,${alias_s}.age,${alias_s}.sex, 
</sql>
<select id="selectOne"  resultMap="BaseResultMap">SELECT<include  refid="BaseResultMap"><property name="alias_s" value="stu"  /></include>FROM student stuWHERE stu.id=#{id}
</select>

上面示例中,通过property定义传入的参数。


http://www.ppmy.cn/news/1519875.html

相关文章

pdf.js如何支持base64的查看

1.pdf.js 作为一个查看在线阅读pdf的软件&#xff0c;常常被运用到前端开发中&#xff0c;但是如何让pdf支持base64的查看&#xff0c;这边就需要去进行修改一些代码了 这边我们就进行开发修改 首先去下载 https://mozilla.github.io/pdf.js/ 当然了&#xff0c;低版本的可以…

Kubernetes 上安装 Jenkins

安装 Helm curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash添加 Jenkins Helm 仓库 首先添加 Jenkins Helm 仓库 helm repo add jenkins https://charts.jenkins.io helm repo update安装 Jenkins 使用 Helm 安装 Jenkins 的最新版本&…

基于分布式计算的电商系统设计与实现【系统设计、模型预测、大屏设计、海量数据、Hadoop集群】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目展示项目介绍 目录摘要Abstract1 引言1.1 研究背景1.2 国内外研究现状1.3 研究目的1.4 研究意义 2 关键技术理论介绍2.1 Hadoop相关组件介绍2.2 分布式集群介绍2.3 Pyecharts介绍2.4 Fl…

Android音视频开发,需要学些什么?

如果你想学习 Android 音视频开发&#xff0c;以下是一些需要学习的内容&#xff1a; 一、基础知识 Java 或 Kotlin 编程语言&#xff1a;Android 开发主要使用这两种语言&#xff0c;确保你对其中一种有扎实的掌握&#xff0c;包括语法、面向对象编程概念、数据结构和算法等…

docker-compose 启动的harbor页面能登录,但是不能推送镜像

问题现象&#xff1a; docker-compose 安装的harbor&#xff0c;页面可以正常打开&#xff0c;但是不能推送镜像。 报错信息提示&#xff1a;connect: connection refused 故障原因&#xff1a; harbor.yml 中的external_url参数写错。这个是提供外部访问。页面请求地址和…

Java 面向对象编程的四个基本原则(封装、继承、多态和抽象),并给出一个简单的例子说明如何在 Java 中应用这些原则?

面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计软件。在 Java 中&#xff0c;面向对象编程的四个基本原则是封装、继承、多态和抽象。每个原则都有其特定的目标&#xff0c;帮助开发者构建更加模块化、可维护和可扩展的代码。 封装 …

ImmersiveTranslate:一键中英对照,Google Chrome上不可或缺的翻译利器

ImmersiveTranslate&#xff1a;一键中英对照&#xff0c;Google Chrome上不可或缺的翻译利器 基本介绍 ImmersiveTranslate 是一款为Google Chrome用户设计的翻译插件&#xff0c;旨在帮助用户轻松实现中英对照翻译。这款插件不仅适合普通用户&#xff0c;同时也为开发者提供…

CSS3动画——飞行的小精灵

CSS3动画——飞行的小精灵 今天的这段代码通过多层结构、渐变色、圆角、多种动画效果以及细节处理&#xff0c;成功地创造了一个充满活力和趣味性的飞行小精灵动画效果。 效果如下&#xff1a; 飞行的小精灵 源代码如下&#xff1a; <!DOCTYPE html> <html lang&quo…

呵,老板不过如此,SQL还是得看我

2018年7月&#xff0c;大三暑假进行时&#xff0c;时间过得飞快&#xff0c;我到这边实习都已经一个月了。 我在没工作之前&#xff0c;我老是觉得生产项目的代码跟我平时自学练的会有很大的区别。 以为生产项目代码啥的都会规范很多&#xff0c;比如在接口上会做很多安全性的…

@Tanstack/vue-query 的使用介绍

Tanstack/vue-query 的使用介绍 前言 在今年的vue conf 会议上&#xff0c;提到了vue-query这个库&#xff0c;这里对它的基本使用做一个介绍。 会议资料地址&#xff1a; https://vueconf.cn/ Tanstack-query的前身是react-query&#xff0c;是一个本地的服务端状态管理的库…

【bug】可图文生图模型 KolorsPipeline IndexError: list index out of range

【bug】可图文生图模型 KolorsPipeline IndexError: list index out of range 环境 linux diffusers 0.30.0问题详情 报错详情 from diffusers import KolorsPipelineTraceback (most recent call last):File "Kolors/demo.py", line 6, in <module>pi…

Python编写BC260Y TCP数据收发压力测试脚本

Python编写BC260Y TCP数据收发压力测试脚本 使用BC260Y的TCP AT命令发送数据时&#xff0c;能够在数据中带有’\r\n’&#xff08;回车换行&#xff09;&#xff0c;而其他模组会将’\r\n’当做AT命令处理的结束符&#xff0c;例如EC800E&#xff0c;为了验证TCP数据中带有’\r…

【小呆的热力学笔记】典型热机-燃气轮机的理想热力循环

文章目录 6.1 燃气轮机的理想热力循环6.2 燃气轮机理想热力循环热效率分析6.3 燃气轮机的理想热力循环讨论 6.1 燃气轮机的理想热力循环 燃气轮机装置主要包含三个部件&#xff1a;压气机、燃烧室和涡轮&#xff0c;详见下图示意。其中压气机主要有离心式和轴流式两种&#xf…

使用 树莓派3B+ 对日本葡萄园进行经济实惠的环境监测

对于 菊岛邦夫—Vineyard Kikushima 而言&#xff0c;Raspberry Pi 生态系统提供了支持和信息&#xff0c;通过基于温度和湿度监测的有针对性的最低限度杀虫剂方案&#xff0c;来提高葡萄的健康产量。 Vineyard Kikushima&#xff1a;http://vykikushima.greater.jp/vineyards…

docker4

​1、根据镜像创建容器 docker -it --name c0 centos:latest /bin/bash 安装应用 ctrlpq docker export -o centos.tar c0 docker import -m "山不像我走来&#xff0c;我便向山走去" centos.tar centos:httpd docker commit c0 centos:v2 一、docker file应用 …

ambari-hdp启动yarn报错Corruption: checksum mismatch

ambari-hdp启动yarn报错Corruption: checksum mismatch 页面报错 Traceback (most recent call last):File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/YARN/package/scripts/nodemanager.py", line 102, in <module>Nodemanager().execute()Fil…

Windows Edge兼容性问题修复

兼容性问题 旧版网站不兼容&#xff1a;随着Web技术的快速发展&#xff0c;一些老旧网站可能使用了不再受支持的HTML/CSS标签或JavaScript API&#xff0c;导致在Edge浏览器中无法正确显示或运行。插件与扩展兼容&#xff1a;虽然Edge支持大量Chrome扩展&#xff0c;但并非所有…

网络各层的安全实例:从物理层到应用层的保护

在前面的各节中&#xff0c;我们学习了利用密码学技术实现机密性、完整性、数字签名和实体鉴别等安全服务的基本方法。在本节中&#xff0c;我们将讨论这些方法在网络各层的具体应用实例。这些安全应用实例涉及从物理层到应用层的所有层次。 1. 为什么需要在网络各层提供安全服…

给自己复盘用的tjxt笔记day12第一部分

优惠券使用 优惠券规则定义 对优惠券的下列需求: 判断一个优惠券是否可用,也就是检查订单金额是否达到优惠券使用门槛 按照优惠规则计算优惠金额,能够计算才能比较并找出最优方案 生成优惠券规则描述,目的是在页面直观的展示各种方案,供用户选择 因此,任何一张优惠券都…

CTFHub-SSRF过关攻略(持续更新中...)

第一题&#xff0c;内网访问 一&#xff0c;打开web/ssrf/内网访问 二&#xff0c;进入页面什么都没有查看一下上一步给的参数 三&#xff0c;输入http://127.0.0.1/flag.php回车显示flag 四&#xff0c;然后复制提交&#xff08;恭喜通关&#xff09; 第二题&#xff0c;伪协…