MyBatis(JavaEE进阶系列4)
目录
前言:
1.MyBatis是什么
2.为什么要学习MyBatis框架
3.MyBatis框架的搭建
3.1添加MyBatis框架
3.2设置MyBatis配置
4.根据MyBatis写法完成数据库的操作
5.MyBatis里面的增删改查操作
5.1插入语句
5.2修改语句
5.3delete语句
5.4查询语句
5.5like查询
5.6MyBatis注解方式实现多表查询
6.动态SQL的使用
6.1<if>标签
6.2<trim>标签
6.3<where>标签
6.4<set>标签
6.5<foreach>标签
结束语:
前言:
在前几节中小编重点与大家分享了有关于Spring Boot和Spring MVC的相关的一些基础知识,那么接下来小编就与大讲解一下有关于MyBatis的一些基础知识,那么经过前期的学习中让我们知道了在Spring中的一些基础操作,那么接下来我们就需要学习有关于如何将前端传递的数据保存起来,或者是查询数据库里面的一些数据。
1.MyBatis是什么
MyBatis是一款优秀的持久层框架,它支持自定义的SQL、存储过程以及高级映射。它的底层是基于JDBC的,通过它可以实现更加简单的数据库的操作。MyBatis去除了几乎所有JDBC代码以及设置参数和获取结果集的工作,MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。简单来说MyBatis是更简单完成程序和数据库交互的工具,也就是更加简单的操作和读取数据库工具。大家也可以参考一下MyBatis的官网的定义☞https://mybatis.org/mybatis-3/zh/index.html
2.为什么要学习MyBatis框架
对于后端开发来说,程序是由以下两个重要的部分组成的:
- 后端程序
- 数据库
而这两个重要的组成部分要通讯就要依靠数据库连接工具,那数据库连接工具有哪些呢?比如我们之前学习的JDBC,还有我们现在介绍的MyBatis,那么既然我们以及有了JDBC了为什么我们还要学习MyBatis呢?我们先来回顾一下我们之前学习JDBC的时候是怎么连接数据库的。
- 创建数据库连接池DataSource。
- 通过DataSource获取数据库连接Connection。
- 编写执行带,占位符的SQL语句。
- 通过Connection及SQL创建操作命令对象Statement。
- 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值。
- 使用Statement执行SQL语句。
- 查询操作:返回结果集ResultSet,更新操作:返回更新的数量。
- 处理结果集。
- 释放资源。
你会发现JDBC的操作步骤太过于繁琐了,所以我们就有了MyBatis,这就会让我们操作数据库的时候更加快捷方便。
3.MyBatis框架的搭建
3.1添加MyBatis框架
创建一个Spring MVC的项目,和我们之前创建的步骤一样,只不过在添加依赖的时候多了下面两个。
注意:新建MyBatis启动时报错时正常的,因为未设置要连接的具体MySQL的详细信息。
3.2设置MyBatis配置
①数据库相关的连接
# 设置数据库的相关连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog2023_10_06?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
注意:如果使用 mysql-connector-java 是 5.x 之前的使用的是“ com.mysql.jdbc.Driver ” ,如果是大于 5.x 使用的是“ com.mysql.cj.jdbc.Driver ” 。
②xml保存路径和命名格式
# 设置 MyBatis XML 存放路径和命名格式
mybatis.mapper-locations=classpath:mybatis/*Mapper.xml
# 配置 MyBatis 执行时打印 SQL(可选配置)
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
logging.level.com.example.demo=debug
注意:里面的配置项的信息有些是需要根据自己的数据库来进行改动的。
上述的常用配置大家可以去我的Gitee中自行获取:配置文件: spring中的一些配置文件
4.根据MyBatis写法完成数据库的操作
在我们对数据库进行操作之前我们先来创建一个数据库。
如下Sql语句所示:
-- 创建数据库
drop database if exists myblog2023_10_06;
create database myblog2023_10_06 DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
use myblog2023_10_06;-- 创建表[⽤户表]
drop table if exists userinfo;
create table userinfo(id int primary key auto_increment,username varchar(100) not null,password varchar(32) not null,photo varchar(500) default '',createtime datetime default now(),updatetime datetime default now(),`state` int default 1
) default charset 'utf8mb4';-- 创建⽂章表
drop table if exists articleinfo;
create table articleinfo(id int primary key auto_increment,title varchar(100) not null,content text not null,createtime datetime default now(),updatetime datetime default now(),uid int not null,rcount int not null default 1,`state` int default 1
)default charset 'utf8mb4';-- 创建视频表
drop table if exists videoinfo;
create table videoinfo(vid int primary key,`title` varchar(250),`url` varchar(1000),
createtime datetime default now(),
updatetime datetime default now(),uid int
)default charset 'utf8mb4';
-- 添加⼀个⽤户信息
INSERT INTO myblog2023_10_06.userinfo (`id`, `username`, `password`, `photo`,
`createtime`, `updatetime`, `state`) VALUES
(1, 'admin', 'admin', '', '2021-12-06 17:10:48', '2021-12-06 17:10:48', 1)
;
-- ⽂章添加测试数据
insert into articleinfo(title,content,uid)values('Java','Java正⽂',1);-- 添加视频
insert into videoinfo(vid,title,url,uid) values(1,'java title','http://ww
w.baidu.com',1);
那么根据MyBatis写法完成数据的操作常规写法包含了两个文件:
- 接口:方法的声明(给其他层调用)。
- XML:实现接口。
那么接下来我们就按照上述的两步来编写一下查询全部用户信息的代码。
①定义接口
②使用XML实现接口
接下来我们就写一个测试,来进行测试。
测试代码展示:
package com.example.demo.dao;import com.example.demo.model.Userinfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;
@SpringBootTest //不可以省略,告诉当前的测试程序,目前项目是运行在Spring Boot容器中的
class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid getAll() {List<Userinfo> list = userMapper.getAll();System.out.println(list);}
}
结果展示:
这里注意一定要在测试代码中加上@SpringBootTest注解,否决就会报以下的错误。
当然在MyBatis中国也可以传递参数来查询。
如下所示:
定义接口:
这里使用注解@Param来表明传入的参数。
编写XML:
这里接收参数的时候使用${参数名}或者是也可以使用#{参数名} 的方式来进行参数的传递。
那么这里使用这两个的区别是什么呢?
使用${参数名}的方式是对其进行了及时执行。
而使用#{参数名}的方式是对其进行了预执行。
它的优点在于可以防止SQL注入,是安全的。
所以 ${参数名} VS #{参数名} 的区别在于:
- ${}是直接替换;#{}是预执行。
- ${}是不安全的存在SQL注入的风险;而#{}是安全的,不存在SQL注的风险。
那么${}可以实现的功能#{}都可以实现,并且${}还有SQL注入的风险,为什么还存在${}的写法呢?
这里就要提到${}的使用场景了,当业务中需要传递SQL命令的时候,就只能使用${}不能使用#{}了。但是他也有使用中的注意事项:如果要使用${},那么传递的参数一定要能被穷举,否则是不可以使用的。
测试代码:
结果展示:
大家也可以和小编一样使用MyBatis的一个插件MyBatisX,这样就可以更加方便的实现XML和对应接口之间的跳转了。
以上就是MyBatis的一个简单的使用案例了。
接下来当我们熟悉了MyBatis的基本使用方法之后我们就来继续探讨一下MyBatis的其他使用方式。
5.MyBatis里面的增删改查操作
接下来我们来实现一下用户信息的增加、删除和修改的操作,对应使用MyBatis的标签如下所示:
- <insert>标签:插入语句。
- <updata>标签:修改语句。
- <delete>标签:删除语句。
- <select>标签:查询操作。
具体的操作我们来看下面。
5.1插入语句
<insert>标签:插入语句。
①定义接口
②编写XML中的SQL语句
③编写测试代码
④测试结果展示
当然我们也可以在数据库中看到插入的数据信息。
当然在编写插入操作的SQL语句的时候还有一些属性可以使用如下所示:
解释:
- useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段)默认值:false。 特殊的添加:返回⾃增 id 。
- keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。
- keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。
5.2修改语句
<updata>标签:修改语句。
①定义接口
②编写XML中的SQL语句
③编写测试代码
④测试结果展示
在数据库中查看数据的修改情况。
5.3delete语句
<delete>标签:删除语句。
①定义接口
②编写XML中的SQL语句
③编写测试代码
④测试结果展示
数据库中的表现:
5.4查询语句
<select>标签:查询操作。
①定义接口
②编写XML中的SQL语句
③编写测试代码
④测试结果展示
和我之前在XML中编写方式不同的点是这里我们使用了<resultMap>标签。
当类中的属性和数据库表中的字段名不一致时,那么查询的结果为null,解决方案:
- 将类中的属性和表中的字段名保持一致(最简单的解决方法)。
- 使用SQL语句中的as进行列名的重命名,让列名等于属性名。
- 定义一个resultMap,将属性名和字段名进行手动映射。
5.5like查询
①定义接口
②编写XML中的SQL语句
③编写测试代码
④测试结果展示
5.6MyBatis注解方式实现多表查询
我们先来重新定义一个实体类。
package com.example.demo.model;import lombok.Data;import java.time.LocalDateTime;@Data
public class Articleinfo {private int id;private String title;private String content;private LocalDateTime createtime;private LocalDateTime updatetime;private int uid;private int rcount;private int state;
}
①定义接口并使用@Select注解进行SQL语句的编写
②编写测试代码
③测试结果展示
使用注解最大的优点就是不需要我们在编写程序的时候跳来跳去了。
6.动态SQL的使用
动态SQL是MyBatis的强大特征之一,它能够完成不同条件下的不同SQL的拼接。
6.1<if>标签
在有些业务场景下会有必填字段和非必填字段,那么如果有些字段是不确定的字段传入,此时程序又该怎么实现呢?接下来就需要使用if标签来进行判断了,在if标签中有一个属性是test属性,它用来判断这个字段是否是需要填写的字段,如果是填写的字段则进行添加操作,如果不是则不进行添加。
①定义接口
②编写XML中的SQL语句
③编写测试代码
④测试结果展示
6.2<trim>标签
在之前的插入用户的功能中,只有一个sex字段可能是选填项,如果所有字段都是非必填项,就考虑使用<trim>标签结合<if>标签,对多个字段都采取动态生成的方式。
在<trim>标签中有以下属性:
- prefix:表示整个语句块,以prefix的值作为前缀 。
- suffix:表示整个语句块,以suffix的值作为后缀 。
- prefixOverrides:表示整个语句块要去除掉的前缀 。
- suffixOverrides:表示整个语句块要去除掉的后缀。
①定义接口
②编写XML中的SQL语句
③编写测试代码
④测试结果展示
6.3<where>标签
当传入的用户对象需要根据属性做where条件查询时,此时我们就需要在SQL语句后面拼接上一句where条件查询语句,那么<where>标签就可以很好的做到,当需要进行条件查询的时候我们就在后面进行拼接,如果不需要的时候就不会拼接。具体我们来看下面的例子。
①定义接口
②编写XML中的SQL语句
③编写测试代码
④测试结果展示
当然这里我们在编写XML里面的SQL语句的时候也可以将其换成<trim>搭配<if>标签,也会达到同样的效果,如下所示:
6.4<set>标签
根据传入的用户对象属性来更新用户数据,可以使用<set>标签来指定动态内容,具体操作如下所示。
①定义接口
②编写XML中的SQL语句
③编写测试代码
④测试结果展示
6.5<foreach>标签
对集合进⾏遍历时可以使⽤该标签。<foreach>标签有如下属性:
- collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象 。
- item:遍历时的每⼀个对象 。
- open:语句块开头的字符串 。
- close:语句块结束的字符串 。
- separator:每次遍历之间间隔的字符串。
①定义接口
②编写XML中的SQL语句
③编写测试代码
④测试结果展示
结束语:
好了这节小编就给大分享到这里啦,希望这节对大家有关于MyBatis的基础知识的了解有一定帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)
相关文章:
MyBatis(JavaEE进阶系列4)
目录 前言: 1.MyBatis是什么 2.为什么要学习MyBatis框架 3.MyBatis框架的搭建 3.1添加MyBatis框架 3.2设置MyBatis配置 4.根据MyBatis写法完成数据库的操作 5.MyBatis里面的增删改查操作 5.1插入语句 5.2修改语句 5.3delete语句 5.4查询语句 5.5like查…...
『力扣每日一题15』:买卖股票的最佳时机
一、题目 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…...
Java中栈实现怎么选?Stack、Deque、ArrayDeque、LinkedList(含常用Api积累)
目录 Java中的Stack类 不用Stack有以下两点原因 1、从性能上来说应该使用Deque代替Stack。 2、Stack从Vector继承是个历史遗留问题,JDK官方已建议优先使用Deque的实现类来代替Stack。 该用ArrayDeque还是LinkedList? ArrayDeque与LinkList区别࿱…...
雷达分辨率单元、单向/双向雷达方程、天气雷达方程简介
一、点状目标 如果两个点状目标在一个分辨率单元中,经典脉冲雷达只能看到一个目标。 点状目标 二、雷达距离分辨率 对于简单的键控开/关脉冲调制: 对于使用脉冲内调制的雷达,距离分辨率取决于压缩脉冲的脉冲持续时间。脉冲压缩比(PCR)取决于传输带宽BWtx,即距离分辨率取…...
RabbitMQ之Fanout(扇形) Exchange解读
目录 基本介绍 适用场景 springboot代码演示 演示架构 工程概述 RabbitConfig配置类:创建队列及交换机并进行绑定 MessageService业务类:发送消息及接收消息 主启动类RabbitMq01Application:实现ApplicationRunner接口 基本介绍 Fa…...
Redisson—分布式集合详述
7.1. 映射(Map) 基于Redis的Redisson的分布式映射结构的RMap Java对象实现了java.util.concurrent.ConcurrentMap接口和java.util.Map接口。与HashMap不同的是,RMap保持了元素的插入顺序。该对象的最大容量受Redis限制,最大元素数…...
开发做前端好还是后端好?这是个问题!
前言 随着互联网的快速发展,越来越多的人选择从事Web开发行业,而Web开发涉及到前端和后端两个方面,相信许多人都曾经对这两个方面进行过探究。而且编程世界就像一座大城市,前端开发和后端开发就像城市的两个不同街区。作为初学者&…...
运行huggingface Kosmos2报错 nameerror: name ‘kosmos2tokenizer‘ is not defined
尝试运行huggingface上的Kosmos,https://huggingface.co/ydshieh/kosmos-2-patch14-224失败,报错: nameerror: name kosmos2tokenizer is not defined查看报错代码: vi /root/.cache/huggingface/modules/transformers_modules/ydshieh/kosmos-2-patch14-224/48e3edebaeb…...
吃鸡玩家必备神器!一站式提升战斗力、分享干货!
大家好,我是吃鸡玩家。在这个视频中,我要分享一个让你瞬间提高战斗力的神器,同时让你享受到顶级游戏作战干货的盛宴!让我们一起来了解吧! 首先,我们推荐绝地求生作图工具。通过这款工具,你可以轻…...
【maven】idea中基于maven-webapp骨架创建的web.xml问题
IDEA中基于maven-webapp骨架创建的web工程,默认的web.xml是这样的。 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name…...
【算法题】2034. 股票价格波动
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你一支股票价格的数据流。数据流…...
APSIM模型】作物模型应用案例
APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生长模拟模型之一。APSIM模型有Classic和Next Generation两个系列模型,能模拟几十种农作物、牧草和树木的土壤-植物-大气过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安…...
io_uring之liburing库安装
手动编译和安装 liburing: 1.首先,从 liburing 的 GitHub 仓库中获取源代码。您可以使用以下命令克隆仓库: git clone https://github.com/axboe/liburing.git2.进入 liburing 目录: cd liburing3.运行configure ./configure …...
Python WebSocket自动化测试:构建高效接口测试框架!
为了更高效地进行WebSocket接口的自动化测试,我们可以搭建一个专门的测试框架。本文将介绍如何使用Python构建一个高效的WebSocket接口测试框架,并重点关注以下四个方面的内容:运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…...
MySQL数据库——SQL优化(1)-介绍、插入数据、主键优化
目录 介绍 插入数据 Insert 大批量插入数据 主键优化 数据组织方式 页分裂 页合并 索引设计原则 介绍 SQL优化将分为下面几个部分进行学习: 插入数据主键优化order by优化group by优化limit优化count优化update优化 首先就先来看第一方面, 插…...
Flink---10、处理函数(基本处理函数、按键分区处理函数、窗口处理函数、应用案例TopN、侧输出流)
星光下的赶路人star的个人主页 我的敌手就是我自己,我要他美好到能使我满意的程度 文章目录 1、处理函数1.1 基本处理函数(ProcessFunction)1.1.1 处理函数的功能和使用1.1.2 ProcessFunction解析1.1.3 处理函数的分类 1.2 按键分区处理函数&…...
多种方案教你彻底解决mac npm install -g后仍然不行怎么办sudo: xxx: command not found
问题概述 某些时候我们成功执行了npm install -g xxx,但是执行完成以后,使用我们全局新安装的包依然不行,如何解决呢? 解决方案1: step1: 查看npm 全局文件安装地址 XXXCN_CXXXMD6M ~ % npm list -g …...
斐波那契数列 JS
问题: 给出一个数字,找出它是斐波那契数列中的第几个数 斐波那契数列 [1, 1, 2, 3, 5, 8, 13, ...],后一个数字是前两个数字之和 输入的数字大于等于 2 如果输入数字不存于斐波那契数列中,返回 -1 function demo(num) {//初始数据…...
IP 地址的分类
IP地址是用于标识计算机或设备在互联网上的位置的一种地址。IP地址通常根据其范围和用途分为不同的分类,主要包括以下几种: IPv4地址(Internet Protocol version 4): IPv4地址是32位二进制数,通常以点分十…...
CDN网络基础入门:CDN原理及架构
背景 互联网业务的繁荣让各类门户网站、短视频、剧集观看、在线教育等内容生态快速发展,互联网流量呈现爆发式增长,自然也面临着海量内容分发效率上的挑战,那么作为终端用户,我们获取资源的体验是否有提升呢? 答案是…...
李沐深度学习记录2:10多层感知机
一.简要知识记录 x.numel():看向量或矩阵里元素个数 A.sum():向量或矩阵求和,axis参数可对某维度求和,keepdims参数设置是否保持维度不变 A.cumsum:axis参数设置沿某一维度计算矩阵累计和x*y:向量的按元素乘法 torch.…...
Python标准库中内置装饰器@staticmethod@classmethod
装饰器是Python中强大而灵活的功能,用于修改或增强函数或方法的行为。装饰器本质上是一个函数,它接受另一个函数作为参数,并返回一个新的函数,通常用于在不修改原始函数代码的情况下添加额外的功能或行为。这种技术称为元编程&…...
MySQL8 间隙锁在11种情况下的锁持有情况分析
测试环境及相关必要知识 测试环境为mysql 8 版本 间隙锁(Gap Lock):用于锁定索引范围之间的间隙,防止其他事务在此间隙中插入新记录。间隙锁主要用于防止幻读问题。 在可重复读的隔离级别下默认打开该锁机制,解决幻…...
C# 图片按比例进行压缩
1、对图片进行压缩,保存在本地 对于一个200k的png文件按0.6的缩放比例进行压缩,压缩后的大小为20k左右 对于一个80k的jpg文件按0.6的缩放比例压缩,压缩后为13k左右 public void imageZoom(string name, Double zoomScale){Bitmap btImage …...
猜猜 JavaScript 输出:(! + [] + [] + ![]).length
一起猜 最近看到一个很有意思的题,直接来看,下面这段代码的打印结果是什么? console.log((! [] [] ![]).length) 猜猜看,你的答案是什么,打在评论区。 我的答案是 undefined,正如我的英文名 为什么呢&a…...
MTK Android12静默安装接口
该文档就是在android12系统上提供一个广播接收器,app端发送一个广播,并且带入apk的地址就可以实现安装 1、广播注册 frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java 首先要导入的依赖 import android.app.P…...
基于电容电流前馈与电网电压全前馈的三相LCL并网逆变器谐波抑制Simulink仿真
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Python数据攻略-Pandas与统计数据分析
统计学在数据分析中到底有多重要?在数据分析的世界里,统计学扮演着一角色。想象一下你是《三国志》游戏的数据分析师,任务是找出哪个武将最受玩家欢迎,哪些战役最具挑战性等。 你怎么做呢?这就需要统计学的力量了。 文章目录 基础统计方法描述性统计方差和标准差相关性和…...
【gcc】RtpTransportControllerSend学习笔记 1
本文是大神 https://www.cnblogs.com/ishen 的文章的学习笔记。主要是大神文章: webrtc源码分析(8)-拥塞控制(上)-码率预估 的学习笔记。大神的webrtc源码分析(8)-拥塞控制(上)-码率预估 详尽而具体,堪称神作。因为直接看大神的文章,自己啥也没记住,所以同时跟着看代码。跟…...
若依分离版-前端使用
1 执行 npm install --registryhttps://registry.npm.taobao.org,报错信息如下 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: ktg-mes-ui3.8.2 npm ERR! Found: vue2.6.12 npm ERR! node_modu…...
公司做网站多/搜索引擎优化方法有哪些
作者:瀚高PG实验室 (Highgo PG Lab)- 波罗 autovacuum 是 postgresql 里非常重要的一个服务端进程,能够自动地执行,在一定条件下自动地对 dead tuples 进行清理并对表进行分析 autovacuum参数控制 autovacuum 进程是…...
网站做专题/夫唯seo教程
1. 当元素失去焦点时发生 blur 事件。 $("input").blur(function(){ alert("This input field has lost its focus."); }); http://www.runoob.com/jquery/event-blur.html 2. 当输入框获取焦点的时候,触发的事件。 $("input").focus…...
权威的手机网站建设/seo中文意思
目前需要说服客户使用webservice 而不是socket. 我觉得要先分别解释下什么是socket 什么是webservice..这个要我该怎么说才比较形象,让人一定就明白. socket 属于7层中的那个层. 网上找了找,越看越迷糊. 有说属于应用层的. 有说属于传输和网络层的. 还有所属于网络和传输之间…...
wordpress主题使用/网络营销课程实训总结
{dede:sql runphpyes sqlSelect content from dede_arctype where id10}[field:content function"cn_substr(me,180)"/] {/dede:sql}使用cn_substr函数即可实现截串。Html2text()函数是去掉html标签代码。参考代码:转载于:https://blog.51cto.com/okowo/1…...
苏州保洁公司排行榜/宁波正规优化seo价格
DB2修改表操作相信大家都不陌生,下文对DB2修改表方面结合了一些例子进行了详细的分析讨论,供您参考学习。 DB2修改表使用ALTER TABLE语句来更改列属性,例如可空性、LOB选项、作用域、约束、压缩属性以及数据类型等等。 例如,在命令…...
宁波网站建设 首选智尚网络/百度风云榜游戏
如果要把一个对象的线框绘制出来,一般的方法是先绘制实体对象,然后通过gl.LINES的模式再绘制一遍模型,此时模型的线框就会被绘制出来。 gl.LINES的问题 此方法需要绘制两遍对象,因此会造成性能的损失。使用此种方式绘制线框的时候…...