【MyBatis】动态SQL > 重点:${...}和#{...}与resultMap和resultType的区别
目录
一、MyBatis动态sql
1.1 动态sql的作用
1.2 动态sql作用论证
1.2.1 条件判断:<if>
1.2.2 循环迭代:<foreach>
1.2.3 SQL片段重用
1.2.4 动态条件组合:<choose><when><otherwise>
1.2.5 <where><if> 标签
1.2.6 <set> <if> 标签
1.3 #{...}与${...}的区别⭐
1.3.1 $ 符号(sql拼接符号)
1.3.2 # 符号(占位符)
1.3.3 案例演示
1.3.4 sql预编译
二、resultMap和resultType的区别⭐
一、MyBatis动态sql
1.1 动态sql的作用
什么是动态sql?动态sql就是在不同的条件下拼接出不同的sql语句。
作用无非就是简化sql,根据不同的条件动态生成sql语句,以实现更灵活和可复用的数据库操作。以下是动态SQL的主要作用:
-
条件判断:动态SQL可以根据不同的条件判断生成不同的SQL语句。例如,根据用户输入的搜索条件动态生成查询语句,只包含满足条件的字段和条件。
-
循环迭代:动态SQL可以在SQL语句中进行循环迭代,以处理集合或数组等数据结构。例如,可以通过循环迭代生成批量插入或更新的SQL语句。
-
SQL片段重用:动态SQL可以定义可重用的SQL片段,以便在不同的SQL语句中引用。这样可以减少代码重复,提高代码的可维护性。
-
动态条件组合:动态SQL可以根据不同的条件组合生成不同的SQL语句。例如,根据用户选择的不同条件动态生成查询语句的WHERE子句。
通过使用动态SQL,开发人员可以根据具体的业务需求灵活地生成SQL语句,避免硬编码固定的SQL语句,提高代码的可读性和可维护性。同时,动态SQL还可以减少数据库的负载,提高数据库操作的性能。
1.2 动态sql作用论证
数据库:t_mvc_book
1.2.1 条件判断:<if>
<select id="selectBook" resultMap="BaseResultMap" parameterType="com.ycxw.model.Book">select * from t_mvc_book where 1=1<if test="bid != null">and bid = #{bid}</if><if test="bname !=null">and bname = #{bname}</if></select>
在这个示例动态生成查询语句的条件部分中。id属性指定了映射的唯一标识,也是映射的方法名字。
这里我判断了:
如果bname参数不为空,则添加 AND bname = #{bname}条件;如果bid参数不为空,则添加AND bid = #{bid} 条件。
测试:
1.2.2 循环迭代:<foreach>
作用:一般用于批量删除查询;
- collection:我们要循环的数组或集合的名称,collection属性值分别默认用"list"、"array"代替,Map对象没有默认的属性值。但是,在作为入参时可以使用@Param(“keyName”)注解来设置自定义collection属性值,设置keyName后,list、array会失效,这是keyName就必须与collection属性名字一直,不然就会报错找不到Param;
- item:你是用哪个字段进行循环的,我们这里用的是bid字段,所以写bid,该参数为必选项;
- index:在list、array中,index为元素的序号索引。但是在Map中,index为遍历元素的key值,该参数为可选项;
- open:遍历集合时的开始符号,通常与close=")"搭配使用。使用场景IN(),values()时,该参数为可选项;
- separator:元素之间的分隔符,类比在IN()的时候,separator=",",最终所有遍历的元素将会以设定的(,)逗号符号隔开,该参数为可选项;
- close:遍历集合时的结束符号,通常与open="("搭配使用,该参数为可选项;
<select id="selectByBids" resultMap="BaseResultMap" parameterType="com.ycxw.model.Book">select * from t_mvc_bookwhere bid in<foreach collection="bids" item="bid" open="(" close=")" separator=",">#{bid}</foreach></select>
在这个示例中,通过循环迭代遍历多个书籍信息。传入的参数是一个叫bids(List集合类型),通过<foreach>标签循环遍历列表中的每个书籍对象,并生成对应的查询id语句。
如果传入的是单个属性可以使用@Param(),如果是map集合,或者单个对象就不需要。
测试:
1.2.3 SQL片段重用
该作用于当我们经常需要使用某表的某些字段时,我们可以它分装起来,便于直接引用。
<sql id="bookColumns">bid, bname, price
</sql><select id="selectBooks" resultMap="BaseResultMap">SELECT <include refid="bookColumns" />FROM t_mvc_book
</select><select id="selectBooksWithPrice" resultMap="BaseResultMap">SELECT <include refid="bookColumns" />, infoFROM t_mvc_book
</select>
在这个示例中,通过<sql>标签定义了一个名为bookColumns的SQL片段,包含了书籍表的列名。然后,在不同的查询语句中通过<include>标签引用了该SQL片段,实现了列名的重用。
1.2.4 动态条件组合:<choose><when><otherwise>
<choose><when><otherwise>标签作用:选择判断,该标签相当于java中的 if...else...default语句。
<select id="selectBooks" resultMap="BaseResultMap" parameterType="com.ycxw.model.Book">SELECT * FROM t_mvc_bookWHERE 1=1<choose><when test="bid != null">AND bid= #{bid}</when><when test="bname!= null">AND bname = #{bname}</when><when test="price != null">AND price = #{price}</when><otherwise>AND info= '这是一本好书!'</otherwise></choose>
</select>
在这个示例中,根据不同条件生成不同的SQL语句。如果第一个条件不成立就继续往下执行,直到when条件成立后就不会执行下面的判断了。如果没有传入任何参数,则默认生成 AND info= ' 这是一本好书!' 条件。
1.2.5 <where><if> 标签
其实在上面的<if>条件判断时还是有点弊端的,我只是在where条件后面加了 1=1,如果换成一下呢?
<select id="selectBook" resultMap="BaseResultMap" parameterType="com.ycxw.model.Book">
select * from t_mvc_book where
<if test="bid != null">
bid = #{bid}
</if>
<if test="bname !=null">
and bname = #{bname}
</if>
</select>
如果第一条件成立那么sql语句是这样的:
select * from t_mvc_book where bid = value ;
如果第二个呢:
select * from t_mvc_book where and bname = value ;
这样显然是不对的,所以就用到了 <where><if>。很简单,就是把if 标签的语句放到<where></where>里面而已。
<select id="selectBook" resultMap="BaseResultMap" parameterType="com.ycxw.model.Book">select * from t_mvc_book where<where><if test="bid != null">and bid = #{bid}</if><if test="bname !=null">and bname = #{bname}</if></where></select>
测试:
1.2.6 <set> <if> 标签
作用:选择性赋值,一般常用语update语句
在以往的修改sql语句中,我们需要修改某个对象的所有属性,若有一项没有输入,默认该值为null。这样就有人想到既然我不需要修改那一项,我就直接去掉带字段,这样又写了一个sql语句。显然是不方便的。利用mybatis的<set><if>标签就可以实现选择性赋值,当我们传一个值就修改一个值,其他字段值不变,也不会置空。
<update id="updateByPrimaryKeySelective" parameterType="com.ycxw.model.Book">update t_mvc_book<set><if test="bname != null">bname = #{bname,jdbcType=VARCHAR},</if><if test="price != null">price = #{price,jdbcType=REAL},</if></set>where bid = #{bid,jdbcType=INTEGER}</update>
1.3 #{...}与${...}的区别⭐
在MyBatis中,$符号和#符号是用于参数替换的两种不同的占位符语法。它们在使用方式和替换规则上有所不同。
1.3.1 $ 符号(sql拼接符号)
- $符号占位符是简单的字符串替换,不进行预编译和参数类型处理。
- $符号占位符直接将参数的值替换到SQL语句中,可以用于动态拼接SQL语句的部分内容。
- $符号占位符存在SQL注入的风险,因为参数值直接替换到SQL语句中,可能导致恶意注入攻击。
- 没有 '引号'
1.3.2 # 符号(占位符)
- #符号占位符是预编译的占位符,会对参数进行类型处理和安全处理。
- #符号占位符将参数值作为预编译参数传递给数据库,可以防止SQL注入攻击。
- #符号占位符可以用于动态生成SQL语句的条件部分,例如WHERE子句、ORDER BY子句等。
- 有引号
1.3.3 案例演示
下面是一个案例演示,展示了$符号和#符号的区别:
<select id="getBooksByPrice" parameterType="Map" resultMap="BaseResultMap">SELECT * FROM booksWHERE price > ${minPrice} AND price < #{maxPrice}
</select>
在这个示例中,getBooksByPrice是一个查询操作,根据传入的minPrice和maxPrice参数来查询价格在指定范围内的书籍。
- 如果使用$符号占位符,例如传入minPrice=10和maxPrice=20,生成的SQL语句为:
SELECT * FROM booksWHERE price > 10 AND price < 20
注意,$符号占位符直接将参数的值替换到SQL语句中,不进行预编译和参数类型处理。
- 如果使用#符号占位符,例如传入minPrice=10和maxPrice=20,生成的SQL语句为:
SELECT * FROM booksWHERE price > ? AND price < ?
注意,#符号占位符将参数值作为预编译参数传递给数据库,可以防止SQL注入攻击。
💡💡💡小提示:表名作为变量时,必须使用 ${ }
这是因为,表名是字符串,使用 sql 占位符替换字符串时会带上单引号 '',这会导致 sql 语法错误,例如:select * from #{tableName} where name = #{name};
预编译之后的sql 变为:
select * from ? where name = ?;
假设我们传入的参数为 tableName = "books" , name = "ycxw",那么在占位符进行变量替换后,sql 语句变为:
select * from 'books' where name='ycxw';
上述 sql 语句是存在语法错误的,表名不能加单引号 ''(注意: 反引号 ``是可以的)
1.3.4 sql预编译
- SQL预编译是一种将SQL语句和参数分开处理的技术。它的基本原理是将SQL语句中的参数部分使用占位符代替,然后将参数值与SQL语句分开传递给数据库执行。这样可以提高数据库的性能和安全性。
- 在SQL预编译中,首先将SQL语句发送给数据库进行预编译,数据库会对SQL语句进行语法分析和优化,并生成一个执行计划。然后,应用程序将参数值与占位符一起发送给数据库执行计划,数据库会将参数值填充到执行计划中的占位符位置,最后执行SQL语句。
通过使用SQL预编译,可以实现以下优势:
- 提高性能:由于SQL语句只需要预编译一次,后续执行只需要传递参数值,减少了语法分析和优化的开销,提高了执行效率。
- 防止SQL注入攻击:通过使用占位符,可以将参数值与SQL语句分开处理,避免了恶意用户通过参数注入恶意代码的风险。
- 简化参数处理:应用程序只需要关注参数值的传递,而不需要担心参数的类型和转义处理,减少了开发的复杂性。
通过这个案例演示,可以看到$符号和#符号在占位符语法上的区别。在实际使用中,应根据具体的需求和安全性考虑选择合适的占位符语法。一般来说,推荐使用#符号占位符,以提高安全性和防止SQL注入攻击。
二、resultMap和resultType的区别⭐
1️⃣ resultType 是一种简单的映射方式,它指定了查询结果的类型。通常情况下,resultType可以是Java的基本类型(如int、String等)或者自定义的Java类。当查询结果只有一个列时,可以使用resultType。
例如,考虑以下数据库表格"users":
+----+----------+-----------+
| id | username | password |
+----+----------+-----------+
| 1 | John | 123456 |
| 2 | Jane | abcdef |
+----+----------+-----------+
如果我们想要查询id为1的用户的用户名,可以使用以下MyBatis配置:
<select id="getUserUsername" resultType="java.lang.String">SELECT username FROM users WHERE id = #{id}
</select>
在这个例子中,我们使用了resultType="java.lang.String"来指定查询结果的类型为String。这样,MyBatis会将查询结果直接映射为一个String对象。
2️⃣ resultMap 是一种更为灵活的映射方式,它允许我们定义复杂的映射规则。通过resultMap,我们可以将查询结果映射为一个自定义的Java对象,而不仅仅是基本类型。
例如,我们可以定义一个User类来表示数据库中的用户:
public class User {private Integer id;private String username;private String password;// 省略构造函数、getter和setter方法
}
然后,我们可以使用resultMap来将查询结果映射为User对象:
<resultMap id="userResultMap" type="com.entity.User"><id property="id" column="id" /><result property="username" column="username" /><result property="password" column="password" />
</resultMap><select id="getUser" resultMap="userResultMap">SELECT * FROM users WHERE id = #{id}
</select>
在这个例子中,我们定义了一个名为"userResultMap"的resultMap,指定了User类作为映射的类型。然后,我们使用<id>和<result>标签来指定每个属性的映射规则。
通过使用resultMap,MyBatis会将查询结果映射为一个User对象,其中id、username和password属性会被正确地填充。
总结:
resultType是指定查询结果的数据类型。它可以是Java的基本数据类型、JavaBean或者其他自定义的数据类型。当查询结果只有一个字段时,可以使用resultType来指定结果的数据类型。
resultMap是用于将查询结果映射到Java对象的规则集合。它定义了查询结果与Java对象之间的映射关系。resultMap可以指定多个映射规则,用于处理复杂的查询结果。它可以映射查询结果中的每个字段到Java对象的属性,也可以进行一些特殊的映射操作,如级联映射、关联映射等。
相关文章:
【MyBatis】动态SQL > 重点:${...}和#{...}与resultMap和resultType的区别
目录 一、MyBatis动态sql 1.1 动态sql的作用 1.2 动态sql作用论证 1.2.1 条件判断:<if> 1.2.2 循环迭代:<foreach> 1.2.3 SQL片段重用 1.2.4 动态条件组合:<choose><when><otherwise> 1.2.5 <where…...
什么是BEM命名规范?为什么要使用BEM命名规范?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ BEM命名规范⭐ 为什么使用BEM命名规范?⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为…...
JavaScript:交集和差集的应用场景
在集合A和集合B中,属于集合A,同时也属于集合B的元素组成的集合,就是交集。 在A中所有不属于集合B元素,组合成集合,就是差集。 那么在平时的开发中,如何使用差集和交集来解决问题呢? 现在有这…...
达梦数据库表空间创建和管理
概述 本文将介绍在达梦数据库如何创建和管理表空间。 1.创建表空间 1.1表空间个数限制 理论上最多允许有65535个表空间,但用户允许创建的表空间 ID 取值范围为0~32767, 超过 32767 的只允许系统使用,ID 由系统自动分配,ID不能…...
三、MySQL 数据库安装集
一、CentOS—YUM 1. MySQL—卸载 # 1、查看存在的MySQL。 rpm -qa | grep -i mysql rpm -qa | grep mysql# 2、删除存在的MySQL。 rpm -e –-nodeps 包名# 3、查找存在的MySQL目录。 find / -name mysql# 4、删除存在的MySQL目录。 rm -rf 目录# 5、删除存在的MySQL配置文件。…...
【BASH】回顾与知识点梳理(三十九)
【BASH】回顾与知识点梳理 三十九 三十九. make、tarball、函数库及软件校验39.1 用 make 进行宏编译为什么要用 makemakefile 的基本语法与变量 39.2 Tarball 的管理与建议使用原始码管理软件所需要的基础软件Tarball 安装的基本步骤一般 Tarball 软件安装的建议事项 (如何移除…...
蓝蓝设计-UI设计公司案例-HMI列车监控系统界面设计解决方案
2013年,为加拿大庞巴迪(Bombardier)设计列车监控系统界面设计。 2015-至今,为中车集团旗下若干公司提供HMI列车监控系统界面设计,综合考虑中车特点、城轨车、动车组的不同需求以及HMI硬键屏和触摸 屏的不同操作方式,重构框架设计、交互设计、…...
Blazor前后端框架Known-V1.2.13
V1.2.13 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行。 Gitee: https://gitee.com/known/KnownGithub:https://github.com/known/Known 概述 基于C#和Blazo…...
vue 复制文本
一个常用的库就是 clipboard.js,它可以帮助您实现跨浏览器的复制到剪贴板功能 首先,安装 clipboard.js: cnpm install clipboard 创建一个 Vue 组件并使用 clipboard.js: <template><div><input v-model"…...
西瓜书第三章
广义线性模型 考虑单点可微函数 g ( ⋅ ) g(\cdot) g(⋅),令 y g − 1 ( ω T x b ) yg^{-1}(\omega^{T}xb) yg−1(ωTxb),这样得到的模型称为“广义线性模型”,其中函数 g ( ⋅ ) g(\cdot) g(⋅)称为“联系函数”。显然,对数线…...
关于python如何使用sqlalchemy连接sap_hana数据库
1.先安装sqlalchemy pip install sqlalchemy 2.from sqlalchemy import create_engine 3.创建数据库连接方式: 假设数据连接方式如下: usernameH_TEOPT passwordww122222 jdbcUrljdbc:sap://192.163.1.161:21681/?currentschema 那么使用sqlalchemy 的…...
微信小程序教学系列(5)
微信小程序教学系列 第五章:小程序发布与推广 第一节:小程序发布流程介绍 小伙伴们,欢迎来到第五章的教学啦!在这一章中,我们将一起来探索小程序的发布与推广流程。你准备好了吗?让我们开始吧࿰…...
【计算机网络篇】TCP协议
✅作者简介:大家好,我是小杨 📃个人主页:「小杨」的csdn博客 🐳希望大家多多支持🥰一起进步呀! TCP协议 1,TCP 简介 TCP(Transmission Control Protocol)是…...
Disruptor并发编程框架
Disruptor是一款高性能的并发编程框架,主要具有以下特点和功能: 1. RingBuffer环形数据结构 Disruptor的核心数据结构是RingBuffer环形队列,用于存储客户端的并发数据并在生产者和消费者之间传递。队列以批量方式的顺序存储,可以高效地进行并发读写操作。 2. 无锁设计 Disrup…...
matlab 点云精配准(1)——point to point ICP(点到点的ICP)
目录 一、算法原理参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 参考文献 [1] BESL P J,MCKAY N D.A method for registration of 3-Dshapes[J].IEEE Tran…...
【JVM】运行时数据区域
文章目录 说明程序计数器虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 说明 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直…...
uniapp踩坑合集
1、onPullDownRefresh下拉刷新不生效 pages.json对应的style中enablePullDownRefresh设置为true,开启下拉刷新 {"path" : "pages/list/list","style" :{"navigationBarTitleText": "页面标题名称","enable…...
再JAVA中如何使用qsort对类进行排序?
目录 结论: 解析: 结论: import java.util.Arrays;class Person implements Comparable<Person>{public String name;public int age;public Person(String name, int age) {this.name name;this.age age;}Overridepublic Stri…...
docker安装clickhouse
安装 docker安装 创建clickhouse目录 mkdir -P /data/clickhouse/datamkdir -P /data/clickhouse/confmkdir -P /data/clickhouse/log 拉取镜像 这里直接拉取最新镜像, 如果需要某个特定版本, 则再拉取的时候指定版本号即可. docker pull clickhouse/clickhouse-server 启动临…...
解决`idea`中`database`工具查询起别名乱码问题
文章目录 解决idea中database工具查询起别名乱码问题场景复现如何解决方式一 设置编码方式二:修改字体 原因说明 解决idea中database工具查询起别名乱码问题 场景复现 使用Idea做查询的并且起别名出现了中文乱码 如何解决 方式一 设置编码 settings->输入框输…...
UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3
目录 之前的文章: 1.5 Blend Attributes by Value 发射器更新 粒子生成 粒子更新 2.1 Static Beams 编辑 发射器更新: 粒子生成 粒子更新 2.2 Dynamic Beams 没有开始模拟前的效果是: 开始模拟后的效果是: 发射器更新 …...
Docker 容器数据卷
Docker挂载主机目录访问如果出现cannot open directory .: Permission denied 解决办法:在挂载目录后多加一个--privilegedtrue参数即可 如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行…...
STM32--MPU6050与I2C外设
文章目录 前言MPU6050参数电路MPU6050框图 IIC外设框图 IIC的基本结构软件IIC实现MPU6050硬件IIC实现MPU6050 前言 在51单片机专栏中,用过I2C通信来进行实现AT24C02的数据存储; 里面介绍的是利用程序的编程来实现I2C的时序,进而实现AT24C02与…...
项目管理实战笔记1:项目管理常识
序 看了下极客时间的《项目管理实战》,觉得跟之前学习PMP的标准资料还是有所侧重。重新整理下,相比书上繁杂的知识,这个更通俗易懂。 1 角色转换:三大误区 误区1:事必躬亲 自己做事情是可控的,做项目依赖…...
时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化
时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SVMD分解算法,分解结果可视化,MATLAB程序ÿ…...
阿里云访问端口被限制解决方法记录
阿里云服务器,80端口可以访问,但是加入了安全组端口8080 通过公网访问改端口策略,发现不能被访问 问题出在防火墙,需要重置一下 解决方法: 在运行的服务器上执行如下命令: # iptables -A INPUT -j ACCEP…...
antd5源码调试环境启动(MacOS)
将源码下载至本地 这里antd5 版本是5.8.3 $ git clone gitgithub.com:ant-design/ant-design.git $ cd ant-design $ npm install $ npm start前提:安装python3、node版本18.14.0(这是本人当前下载的版本) python3安装教程可参考:https://…...
单片机使用基于时间片轮询系统的-状态机-[1]
目的:【1】用C实现一个超轻量化任务管理系统 【2】具有任务suspend, resume, runonce ,auto loop ,task_delay功能 【3】易于移植,不涉及硬件底层。 示例例码: 利用switch case结构实现了单一层的 task_delay功能。弊端就是switch..case不…...
前端开发怎么解决性能优化的问题? - 易智编译EaseEditing
前端性能优化是确保网站或应用在加载速度、响应性和用户体验等方面达到最佳状态的关键任务。以下是一些解决前端性能优化问题的方法: 压缩和合并代码: 压缩和合并CSS、JavaScript和HTML文件可以减少文件大小,加快加载速度。使用压缩工具&am…...
共享球拍小程序:打破拥有束缚,尽享运动乐趣
市场前景: 随着健身和运动的流行趋势,越来越多的人加入了各种体育项目。然而,拥有球拍作为体育装备的成本较高,对于想要尝试不同运动的人来说,这可能是个阻碍。共享球拍小程序迎合了这一需求,提供了一个经济…...
绍兴网站建设电话/竞价外包代运营公司
上周有个需求需要把爬取的图片上传到Magento后台服务器,并显式声明文件格式,例如:"type": "image/jpeg","name": "abc.jpg",base64_encoded_data: "b64encoding_string"上传过程中服务器会…...
wordpress升级插件出现意外错误/seo长尾关键词
实验步骤: 1、将SD卡插在SD卡槽中。 2、将跳线冒跳至USB_OTG,将USB_OTG通过Micor USB线与USB主机(电脑)相连。 3、烧写程序,我的电脑中将出现一个磁盘。 实验现象: 核心代码: int main(void) {/…...
做网站需要学会什么/新闻 近期大事件
为什么机器人能看到你? 因为它有自己的眼睛。机器视觉检测作为人工智能技术的一种。 可以通过利用计算机模拟人的视觉功能,从画面中提取关键信息,对其进行处理,最终用于实际的检测,测量和控制。 技能的最大特点是速度快…...
网站建设seo 视频教程/天津百度推广网络科技公司
1.简介 xilinx提供了两个ip用于生成ROM存储空间。一个是 Distributed Memory Generator,另一个是Block Memory Generator,两者最主要的差别是生成的 Core所占用的 FPGA 资源不一样,从 Distributed Memory Generator 生成的 ROM/RAM Core 占用…...
基于asp.net网站开发视频教程/自己做网站难吗
微信回复图文消息 一级POJO只能包含一级子元素,如果是多级子元素,就包含多级对象就可以了; XmlRootElement(name"xml") XmlAccessorType(XmlAccessType.FIELD) public class ScanUrl {private Integer id;XmlElement(name"ToU…...
web免费代码网站/长沙网络营销学校
Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量。通过插件形式,可以支持包括java,C#,C/C,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测。SonarQube能够提供对代码的一整…...