1.MongoDB简介

1.1什么是MongoDB

  MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似JSON  的 BSON 格式,因此可以存储比较复杂的数据类型。

  MongoDB 的官方网站地址是:http://www.mongodb.org/

1.2 MongoDB特点

  MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。

具体特点总结如下:

(1)面向集合存储,易于存储对象类型的数据

(2)模式自由

(3)支持动态查询

(4)支持完全索引,包含内部对象

(5)支持复制和故障恢复

(6)使用高效的二进制数据存储,包括大型对象(如视频等)

(7)自动处理碎片,以支持云计算层次的扩展性

(8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序,社区中也提供了对 Erlang 及.NET 等平台的驱动程序

(9) 文件存储格式为 BSON(一种 JSON 的扩展)

1.3 MongoDB体系结构

MongoDB 的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。

(1)MongoDB 的文档(document),相当于关系数据库中的一行记录。

(2)多个文档组成一个集合(collection),相当于关系数据库的表。

(3)多个集合(collection),逻辑上组织在一起,就是数据库(database)。

(4)一个 MongoDB 实例支持多个数据库(database)。

文档(document)、集合(collection)、数据库(database)的层次结构如下图:

下表是MongoDB与MySQL数据库逻辑结构概念的对比

MongoDb

关系型数据库Mysql

数据库(databases)

数据库(databases)

集合(collections)

表(table)

文档(document)

行(row)

2.安装与启动

2.1安装设置

双击MongoDB的安装包“mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi”

按照提示步骤安装即可。安装完成后,软件会安装在D:\develope_tools\MongoDB 目录中。

我们要启动的服务程序就是D:\develope_tools\MongoDB\bin目录下的mongod.exe,为了方便我们每次启动,我将D:\develope_tools\MongoDB\bin设置到环境变量path中。

2.2启动服务

(1)首先打开命令提示符,创建一个用于存放数据的目录

(2)启动服务

dbpath参数用于指定数据存储目录

启动后效果如下:

我们在启动信息中可以看到,mongoDB的默认端口是27017

如果我们不想按照默认端口启动,可以通过--port 命令来修改端口

2.3登陆系统

我们另外打开命令提示符窗口,如果mongoDB是按默认的端口启动的,并且是部署在本机的。输入命令 mongo 即可登陆系统

从界面输出的信息我们可以得知,它默认连接的是test数据库,由于我这里修改了默认端口,所以连接失败。

如果是要连接远程的mongoDB服务器 ,就输入命令

mongo 远程IP地址

如果远程的mongoDB服务端口不是默认的,需要输入命令

mongo 远程IP地址:端口

我们这里输入的命令是:mongo 127.0.0.1:12306

输入exit命令可退回到命令提示符

3.基本增删改查操作

3.1选择或创建数据库

使用use 数据库名称即可选择数据库,如果该数据库不存在会自动创建

3.2插入文档

文档相当于关系数据库中的记录

首先我们定义一个文档变量,格式为变量名称={}; 例如:

接下来就是将这个变量存入MongoDB ,格式为

db.集合名称.save(变量);

这里的集合就相当于关系数据库中的表。例如:

这样就在student集合中存入文档。如果这个student集合不存在,就会自动创建。

当然,你也可以不用定义变量,直接把变量值放入save方法中也是可以地。

为了方便后期测试,我们再多加点数据

db.student.save({name:"沙和尚",sex:"男",age:,address:"流沙河路11号"});
db.student.save({name:"唐僧",sex:"男",age:,address:"东土大唐"});
db.student.save({name:"白骨精",sex:"女",age:,address:"白骨洞"});
db.student.save({name:"白龙马",sex:"男",age:,address:"西海"});
db.student.save({name:"哪吒",sex:"男",age:,address:"莲花湾小区"});

3.3查询集合

我们要查询某集合的所有文档,使用find()方法。语法格式为:

db.集合名称.find();

例如,我们要查询student集合中的所有文档:

这里你会发现每条文档会有一个叫_id的字段,这个相当于我们原来关系数据库中表的主键,当你在插入文档记录时没有指定该字段,MongDB会自动创建,其类型是ObjectID类型。

如果我们在插入文档记录时指定该字段也可以,其类型可以是ObjectID类型,也可以是MongoDB支持的任意类型. 例如:

我们再次查询

如果我想按一定条件来查询,比如我想查询性别为“女”的记录,怎么办?很简单!

只要在find()中添加参数即可,参数也是json格式,如下:

为了避免游标可能带来的开销,MongoDB还提供了一个叫findOne()的方法,用来返回结果集的第一条记录。

性别为男的有很多条,这里只返回了第一条记录。

当我们需要返回查询结果的前几条记录时,可以使用limit方法,例如:

3.4修改文档

我们要想修改记录,可以使用update方法 .

例如:我想将姓名为孙悟空的学员文档中的age字段值改为31,执行下列语句,看会发生什么?

再次查询:

哦,悲剧了~~ 原来的孙悟空的文档只剩下_id 和age两个字段了。

那如何保留其它字段值呢?

我们需要使用MongoDB提供的修改器$set 来实现,请看下列代码。

再次查询,会发现“沙和尚”文档中原有的其它字段还保留下来,而更新age字段也成功了。

3.5删除文档

删除文档使用remove()方法,格式为:

db.集合名称.remove( 条件 );

请慎用remove({}), 它会一条不剩地把你的集合所有文档删的干干净净。

我们现在演示一下,删除name为“白骨精”的记录:

再次查询,会发现哪吒的文档不见了。

4.高级查询

4.1模糊查询

MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:

/模糊查询字符串/

例如,我要查询student集合中address字段中含有“东”的所有文档,代码如下:

如果要查询name字段中以“白”开头的,代码如下:

4.2 Null值处理

如果我们想找出集合中某字段值为空的文档,如何查询呢?其实和我们之前的条件查询是一样的,条件值写为null就可以了。

我们现在集合中的文档都是没有空值的,为了方便测试,现在我们将数据做些修改:

将“唐僧”的address改为空

db.student.update({name:”唐僧”},{$set:{address:null}});

再次查询:

db.student.find({"address":null});

我们会发现不仅会显示“唐僧”这条文档,之前因为修改导致address字段丢失的那条记录也出现了。也就是说,这种查询会查询出该字段为null的以及不存在该字段的文档记录。

4.3大于小于

<, <=, >, >= 这个操作符也是很常用的,格式如下

db.collection.find({ "field" : { $gt: value } } ); // 大于: field > value
db.collection.find({ "field" : { $lt: value } } ); // 小于: field < value
db.collection.find({ "field" : { $gte: value } } ); // 大于等于: field >= value
db.collection.find({ "field" : { $lte: value } } ); // 小于等于: field <= value

示例:查询年龄大于等于20岁的学员记录

db.student.find({“age”:{$gte:}});

4.4不等于

不等于使用$ne操作符。

示例:查询sex字段不为“男”的文档

db.student.find({“sex”:{$ne:”男”}});

4.5判断字段是否存在

判断字段是否存在使用$exists操作符。

示例:查询所有含有address字符的文档。

db.student.find({address:{$exists:true}});

示例:查询所有不含有address字符的文档。

db.student.find({address:{$exists:false}});

4.6包含与不包含

包含使用$in操作符。

示例:查询student集合中age字段包含15,29,20的文档

db.student.find({age:{$in:[15,,2]}});

示例:查询student集合中age字段不包含15,29,20的文档

db.student.find({age:{$nin:[,,]}});

4.7统计记录条数

统计记录条件使用count()方法。

示例:查询student集合的文档条数。

db.student.count();

示例:查询student集合中age字段小于等于20的文档条数。

db.student.count({age:{$lte:}});

4.8 条件连接--并且

我们如果需要查询同时满足两个以上条件,需要使用$and操作符将条件进行关联。(相当于SQL的and)

格式为:$and:[ {  },{  },{   } ]

示例:查询student集合中age大于等于20 并且age小于30的文档

db.student.find({$and:[{age:{$gte:}},{age:{$lt:}}]});

4.9 条件连接--或者

如果两个以上条件之间是或者的关系,我们使用$or操作符进行关联,与前面$and的使用方式相同

格式为:$or:[ {  },{  },{   } ]

示例:查询student集合中sex为女 ,或者年龄小于20的文档记录

为了方便测试,插入一条性别为女的文档:

db.student.save({name:"唐唐",sex:"女",age:18,address:"北京"});
db.student.find({$or:[{sex:“女”},{age:{$lt:2}}]});

5.java连接MongoDB

5.1查询文档

5.1.1查询全部记录

(1)创建maven工程mongoDBDemo ,引入依赖。

  <dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.4.</version>
</dependency>
</dependencies>

(2)创建测试类,编写代码,遍历student集合所有数据:

public class MongodbTest {

    @Test
public void test01(){
MongoClient client=new MongoClient("localhost" , );//创建连接对象
MongoDatabase database = client.getDatabase("likeme");//获取数据库
MongoCollection<Document> collection = database.getCollection("student");//获取集合 FindIterable<Document> list = collection.find();//获取文档集合
for( Document doc: list){//遍历集合中的文档输出数据
System.out.println("name:"+ doc.getString("name") );
System.out.println("sex:"+ doc.getString("sex") );
System.out.println("age:"+ doc.getDouble("age") );//默认为浮点型
System.out.println("address:"+ doc.getString("address") );
System.out.println("--------------------------");
} }
}

控制台输出:

此时虽然控制台有输出,但是测试会报一个类型转换错误,java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double,这里是因为有一个测试文档数据是空的,所以不用管就行。

MongoDB的数字类型默认使用64位浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使用NumberInt(4字节符号整数),{“x”:NumberInt(“3”)}  或NumberLong(8字节符号整数){“x”:NumberLong(“3”)}

5.1.2匹配查询

MongoDB使用BasicDBObject类型封装查询条件,构造方法的参数为key 和value .

示例:查询student集合中name为唐唐的文档

@Test
public void test02(){
MongoClient client=new MongoClient("localhost" , );//创建连接对象
MongoDatabase database = client.getDatabase("likeme");//获取数据库
MongoCollection<Document> collection = database.getCollection("student");//获取集合 //构建查询条件
BasicDBObject bson=new BasicDBObject("name", "唐唐");
FindIterable<Document> list = collection.find(bson);//获取文档集合
for( Document doc: list){//遍历集合中的文档输出数据
System.out.println("name:"+ doc.getString("name") );
System.out.println("sex:"+ doc.getString("sex") );
System.out.println("age:"+ doc.getDouble("age") );//默认为浮点型
System.out.println("address:"+ doc.getString("address") );
System.out.println("--------------------------");
}
}

5.1.3模糊查询

构建模糊查询条件是通过正则表达式的方式来实现的

(1)完全匹配Pattern pattern = Pattern.compile("^name$");

(2)右匹配Pattern pattern = Pattern.compile("^.*name$");

(3)左匹配Pattern pattern = Pattern.compile("^name.*$");

(4)模糊匹配Pattern pattern = Pattern.compile("^.*name.*$");

示例:模糊查询student集合中address 中含有北的文档记录

@Test
public void test03(){
MongoClient client=new MongoClient("localhost" , );//创建连接对象
MongoDatabase database = client.getDatabase("likeme");//获取数据库
MongoCollection<Document> collection = database.getCollection("student");//获取集合 //模糊查询:like %北%
Pattern queryPattern = Pattern.compile("^.*北.*$");
BasicDBObject bson=new BasicDBObject("address", queryPattern);
FindIterable<Document> list = collection.find(bson);//获取文档集合 for( Document doc: list){//遍历集合中的文档输出数据
System.out.println("name:"+ doc.getString("name") );
System.out.println("sex:"+ doc.getString("sex") );
System.out.println("age:"+ doc.getDouble("age") );//默认为浮点型
System.out.println("address:"+ doc.getString("address") );
System.out.println("--------------------------");
}
}

5.1.4大于小于

在MongoDB提示符下条件json字符串为{ age: { $lt :20 } } ,对应的java代码也是BasicDBObject 的嵌套。

示例:查询student集合中age小于20的文档记录

@Test
public void test04(){
MongoClient client=new MongoClient("localhost" , );//创建连接对象
MongoDatabase database = client.getDatabase("likeme");//获取数据库
MongoCollection<Document> collection = database.getCollection("student");//获取集合 //查询年龄小于20的
BasicDBObject bson=new BasicDBObject("age", new BasicDBObject("$lt",));
FindIterable<Document> list = collection.find(bson);//获取文档集合 for( Document doc: list){//遍历集合中的文档输出数据
System.out.println("name:"+ doc.getString("name") );
System.out.println("sex:"+ doc.getString("sex") );
System.out.println("age:"+ doc.getDouble("age") );//默认为浮点型
System.out.println("address:"+ doc.getString("address") );
System.out.println("--------------------------");
}
}

5.1.5条件连接--并且

示例:查询年龄大于等于20并且小于30的文档记录

@Test
public void test05(){
MongoClient client=new MongoClient("localhost" , );//创建连接对象
MongoDatabase database = client.getDatabase("likeme");//获取数据库
MongoCollection<Document> collection = database.getCollection("student");//获取集合 //查询年龄大于等于20的
BasicDBObject bson1=new BasicDBObject("age", new BasicDBObject("$gte",));
//查询年龄小于30的
BasicDBObject bson2=new BasicDBObject("age", new BasicDBObject("$lt",));
//构建查询条件and
BasicDBObject bson=new BasicDBObject("$and", Arrays.asList(bson1,bson2) ); FindIterable<Document> list = collection.find(bson);//获取文档集合 for( Document doc: list){//遍历集合中的文档输出数据
System.out.println("name:"+ doc.getString("name") );
System.out.println("sex:"+ doc.getString("sex") );
System.out.println("age:"+ doc.getDouble("age") );//默认为浮点型
System.out.println("address:"+ doc.getString("address") );
System.out.println("--------------------------");
}
}
//控制台输出结果略

5.1.6条件连接--或者

示例:查询年龄小于等于20或者性别为女的文档记录(查询条件不同,其他都一样哈)

BasicDBObject bson1=new BasicDBObject("age", new BasicDBObject("$lte",));
BasicDBObject bson2=new BasicDBObject("sex", "女");
//构建查询条件or
BasicDBObject bson=new BasicDBObject("$or", Arrays.asList( bson1, bson2 ) );

5.2增加文档

我们使用insertOne方法来插入文档。

示例:添加文档记录--名称:铁扇公主  性别:女 年龄:28   地址:芭蕉洞

    @Test
public void test06(){
MongoClient client=new MongoClient("localhost" , );//创建连接对象
MongoDatabase database = client.getDatabase("likeme");//获取数据库
MongoCollection<Document> collection = database.getCollection("student");//获取集合 Map<String, Object> map=new HashMap();
map.put("name", "铁扇公主");
map.put("sex", "女");
map.put("age", 35.0);
map.put("address", "芭蕉洞");
Document doc=new Document(map);
collection.insertOne(doc);//插入一条记录
//collection.insertMany(documents);//一次性插入多条文档
}

5.3删除文档

示例:将名称为铁扇公主的文档删除

@Test
public void test07(){
MongoClient client=new MongoClient("localhost" , );//创建连接对象
MongoDatabase database = client.getDatabase("likeme");//获取数据库
MongoCollection<Document> collection = database.getCollection("student");//获取集合 BasicDBObject bson=new BasicDBObject("name", "铁扇公主");
collection.deleteOne(bson);//删除记录(符合条件的第一条记录)
//collection.deleteMany(bson);//删除符合条件的全部记录
}

5.4修改文档

示例:将唐唐的地址修改为“武汉”

    @Test
public void test08(){
MongoClient client=new MongoClient("localhost" , );//创建连接对象
MongoDatabase database = client.getDatabase("likeme");//获取数据库
MongoCollection<Document> collection = database.getCollection("student");//获取集合 //修改的条件
BasicDBObject bson= new BasicDBObject("name", "唐唐");
//修改后的值
BasicDBObject bson2 = new BasicDBObject("$set",new BasicDBObject("address", "武汉"));
//参数1:修改条件 参数2:修改后的值
collection.updateOne(bson, bson2);
//collection.updateMany(filter, update);//修改符合条件的所有记录
}

updateMany方法用于修改符合条件的所有记录

updateOne方法用于修改符合条件的第一条记录

6.MongoDB连接池

6.1代码实现

  MongoClient 被设计为线程安全的类,也就是我们在使用该类时不需要考虑并发的情况,这样我们可以考虑把MongoClient 做成一个静态变量,为所有线程公用,不必每次都销毁。这样可以极大提高执行效率。实际上,这是MongoDB提供的内置的连接池来实现的。

首先我们先创建一个“管理类”,相当于我们原来的BaseDao

package com.mongodb.demo;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientOptions.Builder;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoDatabase; public class MongoManager { private static MongoClient mongoClient=null; //对mongoClient初始化
private static void init(){
mongoClient=new MongoClient("localhost" , );
} public static MongoDatabase getDatabase(){
if(mongoClient==null){
init();
}
return mongoClient.getDatabase("likeme");
}
}

然后我们创建一个StudentDao

package com.mongodb.demo;

import org.bson.Document;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
/**
* 学员数据访问层
* @author zhoujie
*
*/
public class StudentDao { public void save(String name,String sex,double age,String address){
MongoDatabase database = MongoManager.getDatabase();
MongoCollection<Document> collection = database.getCollection("student2");
Document docment=new Document();
docment.put("name", name);
docment.put("sex", sex);
docment.put("age", age);
docment.put("address", address);
collection.insertOne(docment);
}
}

我们现在做个测试,循环插入2万条数据,看看执行时间是多长时间

经过测试:所用毫秒数为10545

6.2参数设置

我们在刚才的代码基础上进行连接池参数的设置

修改MongoManager的init方法

    //对mongoClient初始化
private static void init(){
//连接池选项
Builder builder = new MongoClientOptions.Builder();//选项构建者
builder.connectTimeout();//设置连接超时时间
builder.socketTimeout();//读取数据的超时时间
builder.connectionsPerHost();//每个地址最大请求数
builder.writeConcern(WriteConcern.NORMAL);//写入策略,仅抛出网络异常
MongoClientOptions options = builder.build();
mongoClient=new MongoClient("127.0.0.1",options);
}

再次进行测试查看结果。

下面是写入策略。

WriteConcern.NONE:没有异常抛出

WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常

WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。

WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。

WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。

WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。

WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。

NoSQL 数据库之MongoDB的更多相关文章

  1. NoSql数据库初探-mongoDB环境搭建

    NoSQL数据库一改关系型数据库的缺点,更容易的集成.分布式.无模式.故障恢复等特点,正在一步步餐食关系型数据库的市场,作为一个与时俱进的码农了解一下新技术是必须的,尤其是在读了<NoSql精粹 ...

  2. 第12章—使用NoSQL数据库—使用MongoDB+Jpa操作数据库

    使用MongoDB+Jpa操作数据库 SpringData还提供了对多种NoSQL数据库的支持,包括MongoDB;neo4j和redis.他不仅支持自动化的repository,还支持基于模板的数据 ...

  3. NOSQL数据库之MongoDB

    一.NoSQL概述 如今,大多数的计算机系统(包括服务器.PC.移动设备等)都会产生庞大的数据量.其实,早在2012年的时候,全世界每天产生的数据量就达到了2.5EB(艾字节,​).这些数据有很大一部 ...

  4. NoSQL数据库一MongoDB基本使用

    如今的网站对数据存储要求越来越灵活,在这种需求下 NoSQL 也就是非关系数据库越来越流行.所谓非关系数据库,是指不使用 SQL 语言进行数据操作的数据库的统称.这类数据库存储数据时没有固定的模式,不 ...

  5. NoSql数据库初探-mongoDB读操作

    MongoDB以文档的形式来存储数据,此结果类似于JSON键值对.文档类似于编程语言中将键和值关联起来的结构(比如:字典.Map.哈希表.关联数组).MongoDB文档是以BOSN文档的形式存在的.B ...

  6. nosql数据库:mongodb,redis,memcached,其优缺点和使用应用场景

    1.mongodb (1)是文档型的非关系型数据库,使用bson结构.其优势在于查询功能比较强大,能存储海量数据,缺点是比较消耗内存. (2)一般可以用来存放评论等半结构化数据,支持二级索引. 适合存 ...

  7. HBase、Redis、MongoDB、Couchbase、LevelDB主流 NoSQL 数据库的对比

    最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...

  8. SequoiaDB创始人:比MongoDB领先一到两年 打造企业级NoSQL数据库

    CSDN.NET   这几年来, NoSQL数据库凭借其易扩展.高性能.高可用.数据模型灵活等特色吸引到了大量新兴互联网公司的青睐,包括国内的淘宝.新浪.京东商城.360.搜狗等都已经在局部尝试NoS ...

  9. 28个MongoDB NoSQL数据库的面试问答

    MongoDB是目前最好的面向文档的免费开源NoSQL数据库.如果你正准备参加MongoDB NoSQL数据库的技术面试,你最好看看下面的MongoDB NoSQL面试问答.这些MongoDB NoS ...

随机推荐

  1. ES6新特性使用小结(二)

    六.Array 扩展 /* * Array Api Array.of 数组的构建 * */ { let arr = Array.of(, , , , , ); console.log(arr); // ...

  2. [Android基础]Android四大组件之BroadCast

    BroadCast的定义: 广播是一种订阅--通知 事件,广播接收者向Android系统 register (订阅广播),广播发送者向Adnroid系统 sendBroadCast(发送广播),然后A ...

  3. BZOJ 1059(二分图匹配)

    要点 发现每行每列都得有1 发现无论怎么换,在同一行的永远在同一行,同一列的永远在同一列 于是换行貌似没什么用啊,换列就够了.换列无法做到则无答案 于是变成了行与列进行二分匹配 #include &l ...

  4. CodeForces - 508B-Anton and currency you all know

    Berland, 2016. The exchange rate of currency you all know against the burle has increased so much th ...

  5. 找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)

    https://blog.csdn.net/liu1340308350/article/details/80746671

  6. ci框架数据库相关函数

    返回查询影响的记录数 $res = $this->db->get_where('wx_life',array('id'=>$id)); $num = $res->num_row ...

  7. NOPI Excel 读取公式生成后的数据

    using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using S ...

  8. IO(转换流、缓冲流)

    第1章 转换流 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者Output ...

  9. mui实现图片更换(暂未上传)

    页面中有默认的图片,触发type为file的input时,更换图片,这个是mui移动端的项目,算了,不多说,开码 首先,先在html页面中设置样式,样式我就不给了,贴个布局 <div class ...

  10. 百度地图web 笔记

    1.marker点击事件获取marker的title和lebal等信息 marker.setTitle(title); marker.setLabel(label); marker.addEventL ...