的子标签
用来指定自动生成主键的属性(identity字段或者sequences序列)。如果指定这个标签,MBG将在生成insert的SQL映射文件中插入一个标签。这个标签非常重要,而且只能配置一个。
(1)column属性:生成列的列名。
(2)sqlStatement属性:根据不同数据库定义,mysql则定义为MySQL。
5.1.4 实践练习
5.2 运行MyBatis Generator和Example
MBG提供了很多种运行方式,常用的有以下几种:
使用Java编写代码运行。
从命令提示符运行。
使用Maven Plugin运行。
使用Eclipse插件运行。
使用Java编码方式运行的好处是,generatorConfig.xml中配置的一些特殊的类(如标签中type属性配置的定制化的实现类)只要在当前项目中,或者在当前项目的classpath中,就可以直接使用。
5.2.1 编写Java代码运行MyBatis Generator
如何编写代码运行MyBatis Generator生成实体类、接口和Mapper映射文件
保证项目中已经添加了mybatis-generator-core.jar依赖
在项目的src/main/java目录下新建jack.mybatis.blog.generator包(包名可自定)
在改包下新建Generator.java类,包含main方法(注:该类代码无需掌握)
public class Generator {
// targetRuntime="MyBatis3Simple", 不生成Example
public void generateMyBatis() {
List warnings = new ArrayList();//该集合记录MBG执行过程中的警告信息
boolean overwrite = true ; //当生成的代码重复时,覆盖原代码
String generatorFile = “/generator/generatorConfig.xml”; //指定配置文件路径
InputStream is = Generator.class.getResourceAsStream(generatorFile);//读取MBG配置文件
ConfigurationParser cp = new ConfigurationParser(warnings);
try {
Configuration config = cp.parseConfiguration(is);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings) myBatisGenerator.generate(null);//执行生成代码
}
catch (Exception e) {
e.printStackTrace();
}
//打印出执行过程中的警告信息,以便于修改
for (String warning : warnings) {
System.out.println(warning);
}
}
//main方法为java普通类运行入口
public static void main(String[] args) {
Generator generator = new Generator();
generator.generateMyBatis();
}
}
5.2.2 生成Example
在MBG的配置文件中,如果将targetRuntime属性值设置为MyBatis3,则在生成MyBatis实体类的同时,还生成与之对应的带Example的辅助查询工具类。
Example类包含了增加、修改、删除,以及查询时动态构建的where子句,表中的每个非BLOB列可以被包括在where子句中,Example类可以用来生成一个几乎无限的where子句,方便测试和后期使用。
比如,与实体类SysUser对应的Example类为SysUserExample,它包含了常见的CRUD等方法的代码示例。
实现一个用户管理高级查询功能,根据输入的条件去检索用户信息。这个功能还需要支持以下四种情况:
当只输入用户名关键字时,需要根据用户名关键字进行模糊查询。
当只一个日期时,需要获取创建时间在该日期(含)之后的用户信息。
当同时输入用户名关键字和日期时,用这两个条件去查询匹配的用户。
如果用户名关键字和日期都没有输入,则查询全部用户信息。
通过MGB已逆向生成了所有表所对应的实体类、Mapper接口,并且还生成Example类,现在只需定义一个测试方法来实现上述需求,代码如下:
SysUserMapper userMapper = sqlSession.getMapper(SysUserMapper.class);
SysUserExample userExample = new SysUserExample(); // 创建Example对象
SysUserExample.Criteria userCriteria = userExample.createCriteria(); // 创建查询条件
if(!keyUserName.isEmpty())
// 设置根据用户名关键字检索的查询条件
userCriteria.andUserNameLike('%'+keyUserName+'%');
if(!createTimeStr.isEmpty()) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date createTime = formatter.parse(createTimeStr);
// 设置根据时间检索的查询条件
userCriteria.andCreateTimeGreaterThanOrEqualTo(createTime);
}
// 执行查询
List users = userMapper.selectByExample(userExample);
System.out.println("用户数量:"+users.size());
updateByExample()方法和updateByExampleSelective()方法都可以实现更新,区别是当对象的属性为空时,第一个方法会将值更新为null,第二个方法不会更新null属性的字段。
更新id在3至7范围的用户的密码为999999,采用UserMapper的updateByExampleSelective()方法实现以上需求:
SysUserMapper userMapper = sqlSession.getMapper(SysUserMapper.class);
SysUserExample userExample = new SysUserExample();
SysUserExample.Criteria userCriteria = userExample.createCriteria();
// 更新条件:用户id在3~7的范围
userCriteria.andIdBetween(3L, 7L);
// 创建一个要设置的对象
SysUser user = new SysUser();
// 将密码设置为999999
user.setUserPassword("999999");
// 执行查询
int result = userMapper.updateByExampleSelective(user, userExample);
sqlSession.commit();
System.out.println("更新了"+result+"个用户");
相信大家对Example应该己经有所了解,使用Example查询能解决大部分复杂的单表操作,从一定程度上能减少工作量。但是建议在条件很多并且判断很多的情况下,避免使用Example查询,因为生成的代码毕竟不是特别人性化,在这种情况下,根据需要自己去完善Mapper XML方式会更有效。
5.2.3 实践练习
5.3 MyBatis缓存
使用缓存可以使应用更快地获取数据,避免频繁的数据库交互,尤其是在查询越多、缓存命中率越高的情况下,使用缓存的作用就越明显。
缓存的应用在企业级开发中随处可见,合理的使用缓存能大大提高项目的性能,因为缓存的数据一般是在内存中,可以降低对数据库的访问次数。
MyBatis作为持久化框架,提供了非常强大的查询缓存特性,可以非常方便地配置和定制使用。MyBatis提供了一级缓存和二级缓存,其中一级缓存默认启用,不能控制,所以一般提到的缓存,是指二级缓存(可配置)。
5.3.1 MyBatis一级缓存
一级缓存是MyBatis默认开启且无法控制的缓存,是属于SqlSession级别,目的是提高查询结果的利用率,在同一个SqlSession实例下进行查询,会使用到一级缓存,而不同的SqlSession实例则不会使用。
SqlSession sqlSession = getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 查询id为1L的用户
SysUser user1 = userMapper.selectUserById(1L);
// 更新之前userName的值为admin
System.out.println("更新之前,user1的userName="+user1.getUserName());
// 更新user1的userName
user1.setUserName("new_admin");
// 再次获取id为1L的用户
SysUser user2 = userMapper.selectUserById(1L);
// 虽然没有更新数据库,但是user2的userName的值和user1重新赋值的名字相同,
// 它们都是new_admin
System.out.println("user2的userName="+user2.getUserName());
// 由于从一级缓存中存在键值selectUserById(1L),因此user1和user2是同一个实例
System.out.println("user1==user2:"+(user1==user2));
示例:
重新开启一个新的SqlSession实例,再次查询该数据:
System.out.println("开启新的SqlSession");
sqlSession = getSqlSession(); // 开启一个新的SqlSession
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 查询id为1L的用户
SysUser user2 = userMapper.selectUserById(1L);
// 第二个SqlSession获取的的userName的值是admin
System.out.println("user2的userName="+user2.getUserName());
// 这里的user2和前一个SqlSession查询的结果是两个不同的实例
System.out.println("user1==user2:"+(user1==user2));
// 执行删除操作(或者新增、更新操作),将清空一级缓存
userMapper.deleteUserById(10L);
sqlSession.commit();
// 再次查询id为1L的用户
SysUser user3 = userMapper.selectUserById(1L);
System.out.println("user3的userName="+user3.getUserName());
// 由于将清空了一级缓存,因此user2和user3不是同一个实例
System.out.println("user2==user3:"+(user2==user3));
User2和刚才的user1虽然数据一样,但是不是同一个对象,打印false
执行删除操作后,一级缓存会被清除,所以查询的user3和user2也不是同一个对象,打印false
1)在同一个SqlSession下进行的查询操作,查询的结果会默认放入一级缓存中,再次查询时会到一级缓存中去寻找是否存在该数据,如果存在则取出,而不查询数据库;如果不存在,则再去查找数据库,并且放入一级缓存中。当然在SqlSession下进行任何的新增、更新和删除操作都会清空一级缓存,以保证数据的准确性。
2)如果希望某个查询操作不使用一级缓存,则可以在配置时进行如下设置:
select * from sys_user where id=#{id}
配置为true后,会在查询数据前清空当前的一级缓存,一般不建议设置
5.3.2 MyBatis二级缓存
MyBatis二级缓存是Mapper级别的缓存,每一个Mapper都有一个二级缓存区域(按namespace区分)
如果两个Mapper的namespace相同,则这两个Mapper执行SQL查询所得到的数据将存在相同的二级缓存区域中,即多个SqlSession可能共用二级缓存。
MyBatis的全局配置settings中有一个参数cacheEnabled,该参数是二级缓存的全局开关,在mybatis核心主配置中可以添加配置,如下:
在保证二级缓存的全局配置开启的情况下,不同Mapper下的二级缓存需要设置开启,有两种不同的方式进行Mapper命名空间缓存启用方式。
使用Mapper.xml开启二级缓存只需要在接口对应的Mapper.xml中添加 元素即可,如下:
import org.apache.ibatis.annotations.CacheNamespace;
@CacheNamespace(
eviction=FifoCache.class,
flushInterval=60000,
size=512,
readWrite=true
)
public interface UserMapper{
// 接口方法
}
二级缓存配置属性参数说明:
属性名
取值
作用
eviction
(回收策略)
LRU(默认值)
移除最长时间不被使用的对象,这是默认值
FIFO
按对象进入缓存的顺序来移除它们
SOFT
移除基于垃圾回收器状态和软引用规则的对象
WEAK
更积极地移除基于垃圾收集器状态和弱引用规则的对象
flushinterval
(刷新间隔)
可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况不设置,即没有刷新间隔,缓存仅仅在调用语句时刷新
size(引用数目)
可以被设置为任意正整数,默认值是1024
readOnly(只读)
可设置为true或false。只读的缓存所有调用者返回缓存对象的相同实例,这些对象不能被修改;可读写缓存会通过序列化返回缓存对象的拷贝,这种方式慢一些,但是安全,因此默认值是false
默认的二级缓存会有如下效果:
映射语句文件中的所有select语句将会被缓存。
映射语句文件中的所有insert、update和delete语句会刷新缓存。
缓存会使用Least Recently Used(LRU,最近最少使用)算法来收回。
如果没有设置刷新时间间隔,缓存不会以任何时间顺序来刷新。
默认情况下不能同时使用Mapper.xml和接口两种方式都开启二级缓存,会出现配置冲突,所以一般使用一种配置方式即可,最好不要混用。
5.3.3 使用MyBatis二级缓存
如对UserMapper配置二级缓存后,当调用UserMapper所有的select查询方法时,二级缓存就己经开始起作用,在使用可读写缓存时,要求缓存的实体类需要实现序列化接口,如SysUser实体类:
public class SysUser implements Serializable{
// 其他属性和getter()方法、setter()方法
}
调用UserMapper中的查询方法测试缓存:
sqlSession = getSqlSession(); // 开启一个新的SqlSession
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 第二个SqlSession获取的的userName的值是从二级缓存取得,因此是new_admin
SysUser user2 = userMapper.selectUserById(1L);
// 由于二级缓存配置为读写缓存,user1和user2是两个不同的实例
System.out.println("user1==user2:"+(user1==user2));
SysUser user3 = userMapper.selectUserById(1L);// 这里仍然从二级缓存中取出
// user2和user3都是2级别缓存读取出来的结果,但是为false
System.out.println("user2==user3:"+(user2==user3));
因为二级读写缓存是反序列化的结果,所以为false
5.3.4 实践练习
5.4 MyBatis脏数据
5.4.1 MyBatis脏数据的产生
二级缓存虽然能提高应用效率,减轻数据库服务器的压力,但是如果使用不当,很容易产生脏数据。
MyBatis的二级缓存和命名空间绑定的,每个Mapper命名空间下的二级缓存互不影响,但是难免遇到一个命名空间所缓存的数据,在数据库中已被其他命名空间修改,缓存的数据则不是数据库最真实的,即脏数据。
通过案例来演示脏数据的产生:
示例: 在UserMapper中创建了selectUserAndRoleById()方法,该方法获取指定用户id的用户信息,用户信息要求包含该用户所对应的角色信息
select u.id, u.user_name, u.user_email, u.user_info, u.head_img, u.create_time,
r.id "role.id", r.role_name "role.roleName", r.enabled "role.enabled",
r.create_by "role.createBy", r.create_time "role.createTime"
from sys_user u join sys_user_role ur on u.id=ur.user_id join sys_role r
on r.id=ur.role_id where u.id=#{userId}
该方法查询的数据会被缓存到UserMapper空间下的二级缓存中
示例: 在RoleMapper.xml添加二级缓存配置,增加 元素,代码如下
让SysUser类实现Serializable接口
public class SysUser implements Serializable {
//相关属性略
}
通过案例来演示脏数据的产生:
示例: 在RoleMapper中创建了selectRoleById()方法,该方法获取指定角色id的角色,另外,再创建updateRole()方法,该方法更新指定角色id的角色信息
select * from sys_role where id=#{id}
update sys_role set
role_name=#{roleName},enabled=#{enabled},create_by=#{createBy},
create_time=#{createTime,jdbcType=TIMESTAMP} where id=#{id}
RoleMapper下更新角色的信息不会影响到UserMapper的二级缓存
1、UserMapper空间下定义开启二级缓存,并且查询方法会把用户及角色数据缓存至二级缓存中。
2、RoleMapper中的修改方法调用后,不会影响到UserMapper空间下的二级缓存,因为二级缓存只在各自空间下有效。
3、所以UserMapper中二级缓存中的数据并非数据库中最新的数据,会造成数据不合理的脏数据。
5.4.2 MyBatis脏数据的解决方案
如何避免脏数据的出现?需要用到参照缓存了。当某几个表可以作为一个业务整体的查询来源时,通常是让几个会关联的数据表同时使用同一个二级缓存,这样就能解决脏数据问题。
将UserMapper.xml中的缓存配置修改如下:
参照缓存可以解决关联较少的情况,如果有几十个表且关联复杂时,使用参照缓存意义不大。因此使用二级缓存需要满足一定的条件:
以查询为主的应用中,只有尽可能少的新增、删除和更新操作。
查询业务绝大多数都是对单表进行操作,由于很少存在互相关联的情况,因此不会出现脏数据。
可以按业务划分对表进行分组时,如果关联的表比较少,可以通过参照缓存进行配置。
5.4.3 实践练习
总结:
利用MyBatisGenerator可以快速生成针对数据库表的实体类、接口、Mapper.xml映射配置文件,以及Example辅助查询工具类。
缓存是一种将数据库查询的数据进行临时存储,一般是存储在内存中,后续查询时减少和数据库的交互次数,提高程序性能的技术。
MyBatis中提供了一级缓存和二级缓存,其中一级缓存默认存在,不可控制,同一SqlSession范围内的操作共享该缓存,增、删、改后将清除缓存。
二级缓存需要配置才能生效,属于各自命名空间范围的缓存,在同一命名空间范围内,即使不同SqlSession也可共用,使用时需要注意脏数据的产生。
你可能感兴趣的:(Java,EE数据持久化框架笔记,数据库,mysql,mybatis)
机器学习与深度学习间关系与区别
ℒℴѵℯ心·动ꦿ໊ོ꫞
人工智能 学习 深度学习 python
一、机器学习概述定义机器学习(MachineLearning,ML)是一种通过数据驱动的方法,利用统计学和计算算法来训练模型,使计算机能够从数据中学习并自动进行预测或决策。机器学习通过分析大量数据样本,识别其中的模式和规律,从而对新的数据进行判断。其核心在于通过训练过程,让模型不断优化和提升其预测准确性。主要类型1.监督学习(SupervisedLearning)监督学习是指在训练数据集中包含输入
【iOS】MVC设计模式
Magnetic_h
ios mvc 设计模式 objective-c 学习 ui
MVC前言如何设计一个程序的结构,这是一门专门的学问,叫做"架构模式"(architecturalpattern),属于编程的方法论。MVC模式就是架构模式的一种。它是Apple官方推荐的App开发架构,也是一般开发者最先遇到、最经典的架构。MVC各层controller层Controller/ViewController/VC(控制器)负责协调Model和View,处理大部分逻辑它将数据从Mod
10月|愿你的青春不负梦想-读书笔记-01
Tracy的小书斋
本书的作者是俞敏洪,大家都很熟悉他了吧。俞敏洪老师是我行业的领头羊吧,也是我事业上的偶像。本日摘录他书中第一章中的金句:『一个人如果什么目标都没有,就会浑浑噩噩,感觉生命中缺少能量。能给我们能量的,是对未来的期待。第一件事,我始终为了进步而努力。与其追寻全世界的骏马,不如种植丰美的草原,到时骏马自然会来。第二件事,我始终有阶段性的目标。什么东西能给我能量?答案是对未来的期待。』读到这里的时候,我便
微服务下功能权限与数据权限的设计与实现
nbsaas-boot
微服务 java 架构
在微服务架构下,系统的功能权限和数据权限控制显得尤为重要。随着系统规模的扩大和微服务数量的增加,如何保证不同用户和服务之间的访问权限准确、细粒度地控制,成为设计安全策略的关键。本文将讨论如何在微服务体系中设计和实现功能权限与数据权限控制。1.功能权限与数据权限的定义功能权限:指用户或系统角色对特定功能的访问权限。通常是某个用户角色能否执行某个操作,比如查看订单、创建订单、修改用户资料等。数据权限:
理解Gunicorn:Python WSGI服务器的基石
范范0825
ipython linux 运维
理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico
c++ 的iostream 和 c++的stdio的区别和联系
黄卷青灯77
c++ 算法 开发语言 iostream stdio
在C++中,iostream和C语言的stdio.h都是用于处理输入输出的库,但它们在设计、用法和功能上有许多不同。以下是两者的区别和联系:区别1.编程风格iostream(C++风格):C++标准库中的输入输出流类库,支持面向对象的输入输出操作。典型用法是cin(输入)和cout(输出),使用>操作符来处理数据。更加类型安全,支持用户自定义类型的输入输出。#includeintmain(){in
《投行人生》读书笔记
小蘑菇的树洞
《投行人生》----作者詹姆斯-A-朗德摩根斯坦利副主席40年的职业洞见-很短小精悍的篇幅,比较适合初入职场的新人。第一部分成功的职业生涯需要规划1.情商归为适应能力分享与协作同理心适应能力,更多的是自我意识,你有能力识别自己的情并分辨这些情绪如何影响你的思想和行为。2.对于初入职场的人的建议,细节,截止日期和数据很重要截止日期,一种有效的方法是请老板为你所有的任务进行优先级排序。和老板喝咖啡的好
Long类型前后端数据不一致
igotyback
前端
响应给前端的数据浏览器控制台中response中看到的Long类型的数据是正常的到前端数据不一致前后端数据类型不匹配是一个常见问题,尤其是当后端使用Java的Long类型(64位)与前端JavaScript的Number类型(最大安全整数为2^53-1,即16位)进行数据交互时,很容易出现精度丢失的问题。这是因为JavaScript中的Number类型无法安全地表示超过16位的整数。为了解决这个问
LocalDateTime 转 String
igotyback
java 开发语言
importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassMain{publicstaticvoidmain(String[]args){//获取当前时间LocalDateTimenow=LocalDateTime.now();//定义日期格式化器DateTimeFormatterformat
mysql禁用远程登录
igotyback
mysql
去mysql库中的user表里,将host都改成localhost之后刷新权限FLUSHPRIVILEGES;
Linux下QT开发的动态库界面弹出操作(SDL2)
13jjyao
QT类 qt 开发语言 sdl2 linux
需求:操作系统为linux,开发框架为qt,做成需带界面的qt动态库,调用方为java等非qt程序难点:调用方为java等非qt程序,也就是说调用方肯定不带QApplication::exec(),缺少了这个,QTimer等事件和QT创建的窗口将不能弹出(包括opencv也是不能弹出);这与qt调用本身qt库是有本质的区别的思路:1.调用方缺QApplication::exec(),那么我们在接口
【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数
广龙宇
一起学Rust # Rust设计模式 rust 设计模式 开发语言
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、使用借用类型作为参数二、格式化拼接字符串三、使用构造函数总结前言Rust不是传统的面向对象编程语言,它的所有特性,使其独一无二。因此,学习特定于Rust的设计模式是必要的。本系列文章为作者学习《Rust设计模式》的学习笔记以及自己的见解。因此,本系列文章的结构也与此书的结构相同(后续可能会调成结构),基本上分为三个部分
回溯 Leetcode 332 重新安排行程
mmaerd
Leetcode刷题学习记录 leetcode 算法 职场和发展
重新安排行程Leetcode332学习记录自代码随想录给你一份航线列表tickets,其中tickets[i]=[fromi,toi]表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从JFK(肯尼迪国际机场)出发的先生,所以该行程必须从JFK开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。例如,行程[“JFK”,“LGA”]与[“JFK”,“LGB
Python数据分析与可视化实战指南
William数据分析
python python 数据
在数据驱动的时代,Python因其简洁的语法、强大的库生态系统以及活跃的社区,成为了数据分析与可视化的首选语言。本文将通过一个详细的案例,带领大家学习如何使用Python进行数据分析,并通过可视化来直观呈现分析结果。一、环境准备1.1安装必要库在开始数据分析和可视化之前,我们需要安装一些常用的库。主要包括pandas、numpy、matplotlib和seaborn等。这些库分别用于数据处理、数学
每日一题——第八十四题
互联网打工人no1
C语言程序设计每日一练 c语言
题目:编写函数1、输入10个职工的姓名和职工号2、按照职工由大到小顺序排列,姓名顺序也随之调整3、要求输入一个职工号,用折半查找法找出该职工的姓名#define_CRT_SECURE_NO_WARNINGS#include#include#defineMAX_EMPLOYEES10typedefstruct{intid;charname[50];}Empolyee;voidinputEmploye
WPF中的ComboBox控件几种数据绑定的方式
互联网打工人no1
wpf c#
一、用字典给ItemsSource赋值(此绑定用的地方很多,建议熟练掌握)在XMAL中:在CS文件中privatevoidBindData(){DictionarydicItem=newDictionary();dicItem.add(1,"北京");dicItem.add(2,"上海");dicItem.add(3,"广州");cmb_list.ItemsSource=dicItem;cmb_l
git常用命令笔记
咩酱-小羊
git 笔记
###用习惯了idea总是不记得git的一些常见命令,需要用到的时候总是担心旁边站了人~~~记个笔记@_@,告诉自己看笔记不丢人初始化初始化一个新的Git仓库gitinit配置配置用户信息gitconfig--globaluser.name"YourName"gitconfig--globaluser.email"
[email protected] "基本操作克隆远程仓库gitclone查看
Pyecharts数据可视化大屏:打造沉浸式数据分析体验
我的运维人生
信息可视化 数据分析 数据挖掘 运维开发 技术共享
Pyecharts数据可视化大屏:打造沉浸式数据分析体验在当今这个数据驱动的时代,如何将海量数据以直观、生动的方式展现出来,成为了数据分析师和企业决策者关注的焦点。Pyecharts,作为一款基于Python的开源数据可视化库,凭借其丰富的图表类型、灵活的配置选项以及高度的定制化能力,成为了构建数据可视化大屏的理想选择。本文将深入探讨如何利用Pyecharts打造数据可视化大屏,并通过实际代码案例
第四天旅游线路预览——从换乘中心到喀纳斯湖
陟彼高冈yu
基于Google earth studio 的旅游规划和预览 旅游
第四天:从贾登峪到喀纳斯风景区入口,晚上住宿贾登峪;换乘中心有4路车,喀纳斯①号车,去喀纳斯湖,路程时长约5分钟;将上面的的行程安排进行动态展示,具体步骤见”Googleearthstudio进行动态轨迹显示制作过程“、“Googleearthstudio入门教程”和“Googleearthstudio进阶教程“相关内容,得到行程如下所示:Day4-2-480p
Python教程:一文了解使用Python处理XPath
旦莫
Python进阶 python 开发语言
目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代
Google earth studio 简介
陟彼高冈yu
旅游
GoogleEarthStudio是一个基于Web的动画工具,专为创作使用GoogleEarth数据的动画和视频而设计。它利用了GoogleEarth强大的三维地图和卫星影像数据库,使用户能够轻松地创建逼真的地球动画、航拍视频和动态地图可视化。网址为https://www.google.com/earth/studio/。GoogleEarthStudio是一个基于Web的动画工具,专为创作使用G
LLM 词汇表
落难Coder
LLMs NLP 大语言模型 大模型 llama 人工智能
Contextwindow“上下文窗口”是指语言模型在生成新文本时能够回溯和参考的文本量。这不同于语言模型训练时所使用的大量数据集,而是代表了模型的“工作记忆”。较大的上下文窗口可以让模型理解和响应更复杂和更长的提示,而较小的上下文窗口可能会限制模型处理较长提示或在长时间对话中保持连贯性的能力。Fine-tuning微调是使用额外的数据进一步训练预训练语言模型的过程。这使得模型开始表示和模仿微调数
509. 斐波那契数(每日一题)
lzyprime
lzyprime博客(github)创建时间:2021.01.04qq及邮箱:2383518170leetcode笔记题目描述斐波那契数,通常用F(n)表示,形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2),其中n>1给你n,请计算F(n)。示例1:输入:2输出:1解释:F(2)=F(1)+
关于提高复杂业务逻辑代码可读性的思考
编程经验分享
开发经验 java 数据库 开发语言
目录前言需求场景常规写法拆分方法领域对象总结前言实际工作中大部分时间都是在写业务逻辑,一般都是三层架构,表示层(Controller)接收客户端请求,并对入参做检验,业务逻辑层(Service)负责处理业务逻辑,一般开发都是在这一层中写具体的业务逻辑。数据访问层(Dao)是直接和数据库交互的,用于查数据给业务逻辑层,或者是将业务逻辑层处理后的数据写入数据库。简单的增删改查接口不用多说,基本上写好一
拥有断舍离的心态,过精简生活--《断舍离》读书笔记
爱吃丸子的小樱桃
不知不觉间房间里的东西越来越多,虽然摆放整齐,但也时常会觉得空间逼仄,令人心生烦闷。抱着断舍离的态度,我开始阅读《断舍离》这本书,希望从书中能找到一些有效的方法,帮助我实现空间、物品上的断舍离。《断舍离》是日本作家山下英子通过自己的经历、思考和实践总结而成的,整体内涵也从刚开始的私人生活哲学的“断舍离”升华成了“人生实践哲学”,接着又成为每个人都能实行的“改变人生的断舍离”,从“哲学”逐渐升华成“
SQL Server_查询某一数据库中的所有表的内容
qq_42772833
SQL Server 数据库 sqlserver
1.查看所有表的表名要列出CrabFarmDB数据库中的所有表(名),可以使用以下SQL语句:USECrabFarmDB;--切换到目标数据库GOSELECTTABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWHERETABLE_TYPE='BASETABLE';对这段SQL脚本的解释:SELECTTABLE_NAME:这个语句的作用是从查询结果中选择TABLE_NAM
四章-32-点要素的聚合
彩云飘过
本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers5.3.xapi。源码见1032.html,对应的官网示例https://openlayers.org/en/latest/examples/cluster.htmlhttps://openlayers.org/en/latest/examples/earthquake-clusters.
DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理
STU学生网页设计
网页设计 期末网页作业 html静态网页 html5期末大作业 网页设计 web大作业
️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程
【华为OD机试真题2023B卷 JAVA&JS】We Are A Team
若博豆
java 算法 华为 javascript
华为OD2023(B卷)机试题库全覆盖,刷题指南点这里WeAreATeam时间限制:1秒|内存限制:32768K|语言限制:不限题目描述:总共有n个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在一个团队中,具体的:1、消息构成为:abc,整数a、b分别代
高端密码学院笔记285
柚子_b4b4
高端幸福密码学院(高级班)幸福使者:李华第(598)期《幸福》之回归内在深层生命原动力基础篇——揭秘“激励”成长的喜悦心理案例分析主讲:刘莉一,知识扩充:成功=艰苦劳动+正确方法+少说空话。贪图省力的船夫,目标永远下游。智者的梦再美,也不如愚人实干的脚印。幸福早课堂2020.10.16星期五一笔记:1,重视和珍惜的前提是知道它的价值非常重要,当你珍惜了,你就真正定下来,真正的学到身上。2,大家需要
异常的核心类Throwable
无量
java 源码 异常处理 exception
java异常的核心是Throwable,其他的如Error和Exception都是继承的这个类 里面有个核心参数是detailMessage,记录异常信息,getMessage核心方法,获取这个参数的值,我们可以自己定义自己的异常类,去继承这个Exception就可以了,方法基本上,用父类的构造方法就OK,所以这么看异常是不是很easy
package com.natsu;
mongoDB 游标(cursor) 实现分页 迭代
开窍的石头
mongodb
上篇中我们讲了mongoDB 中的查询函数,现在我们讲mongo中如何做分页查询
如何声明一个游标
var mycursor = db.user.find({_id:{$lte:5}});
迭代显示游标数
MySQL数据库INNODB 表损坏修复处理过程
0624chenhong
tomcat mysql
最近mysql数据库经常死掉,用命令net stop mysql命令也无法停掉,关闭Tomcat的时候,出现Waiting for N instance(s) to be deallocated 信息。查了下,大概就是程序没有对数据库连接释放,导致Connection泄露了。因为用的是开元集成的平台,内部程序也不可能一下子给改掉的,就验证一下咯。启动Tomcat,用户登录系统,用netstat -
剖析如何与设计人员沟通
不懂事的小屁孩
工作
最近做图烦死了,不停的改图,改图……。烦,倒不是因为改,而是反反复复的改,人都会死。很多需求人员不知该如何与设计人员沟通,不明白如何使设计人员知道他所要的效果,结果只能是沟通变成了扯淡,改图变成了应付。
那应该如何与设计人员沟通呢?
我认为设计人员与需求人员先天就存在语言障碍。对一个合格的设计人员来说,整天玩的都是点、线、面、配色,哪种构图看起来协调;哪种配色看起来合理心里跟明镜似的,
qq空间刷评论工具
换个号韩国红果果
JavaScript
var a=document.getElementsByClassName('textinput');
var b=[];
for(var m=0;m<a.length;m++){
if(a[m].getAttribute('placeholder')!=null)
b.push(a[m])
}
var l
S2SH整合之session
灵静志远
spring AOP struts session
错误信息:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cartService': Scope 'session' is not active for the current thread; consider defining a scoped
xmp标签
a-john
标签
今天在处理数据的显示上遇到一个问题:
var html = '<li><div class="pl-nr"><span class="user-name">' + user
+ '</span>' + text + '</div></li>';
ulComme
Ajax的常用技巧(2)---实现Web页面中的级联菜单
aijuans
Ajax
在网络上显示数据,往往只显示数据中的一部分信息,如文章标题,产品名称等。如果浏览器要查看所有信息,只需点击相关链接即可。在web技术中,可以采用级联菜单完成上述操作。根据用户的选择,动态展开,并显示出对应选项子菜单的内容。 在传统的web实现方式中,一般是在页面初始化时动态获取到服务端数据库中对应的所有子菜单中的信息,放置到页面中对应的位置,然后再结合CSS层叠样式表动态控制对应子菜单的显示或者隐
天-安-门,好高
atongyeye
情感
我是85后,北漂一族,之前房租1100,因为租房合同到期,再续,房租就要涨150。最近网上新闻,地铁也要涨价。算了一下,涨价之后,每次坐地铁由原来2块变成6块。仅坐地铁费用,一个月就要涨200。内心苦痛。
晚上躺在床上一个人想了很久,很久。
我生在农
android 动画
百合不是茶
android 透明度 平移 缩放 旋转
android的动画有两种 tween动画和Frame动画
tween动画;,透明度,缩放,旋转,平移效果
Animation 动画
AlphaAnimation 渐变透明度
RotateAnimation 画面旋转
ScaleAnimation 渐变尺寸缩放
TranslateAnimation 位置移动
Animation
查看本机网络信息的cmd脚本
bijian1013
cmd
@echo 您的用户名是:%USERDOMAIN%\%username%>"%userprofile%\网络参数.txt"
@echo 您的机器名是:%COMPUTERNAME%>>"%userprofile%\网络参数.txt"
@echo ___________________>>"%userprofile%\
plsql 清除登录过的用户
征客丶
plsql
tools---preferences----logon history---history 把你想要删除的删除
--------------------------------------------------------------------
若有其他凝问或文中有错误,请及时向我指出,
我好及时改正,同时也让我们一起进步。
email : binary_spac
【Pig一】Pig入门
bit1129
pig
Pig安装
1.下载pig
wget http://mirror.bit.edu.cn/apache/pig/pig-0.14.0/pig-0.14.0.tar.gz
2. 解压配置环境变量
如果Pig使用Map/Reduce模式,那么需要在环境变量中,配置HADOOP_HOME环境变量
expor
Java 线程同步几种方式
BlueSkator
volatile synchronized ThredLocal ReenTranLock Concurrent
为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 从而保证了该变量的唯一性和准确性。 1.同步方法&
StringUtils判断字符串是否为空的方法(转帖)
BreakingBad
null StringUtils “”
转帖地址:http://www.cnblogs.com/shangxiaofei/p/4313111.html
public static boolean isEmpty(String str)
判断某字符串是否为空,为空的标准是 str==
null
或 str.length()==
0
编程之美-分层遍历二叉树
bylijinnan
java 数据结构 算法 编程之美
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class LevelTraverseBinaryTree {
/**
* 编程之美 分层遍历二叉树
* 之前已经用队列实现过二叉树的层次遍历,但这次要求输出换行,因此要
jquery取值和ajax提交复习记录
chengxuyuancsdn
jquery取值 ajax提交
// 取值
// alert($("input[name='username']").val());
// alert($("input[name='password']").val());
// alert($("input[name='sex']:checked").val());
// alert($("
推荐国产工作流引擎嵌入式公式语法解析器-IK Expression
comsci
java 应用服务器 工作 Excel 嵌入式
这个开源软件包是国内的一位高手自行研制开发的,正如他所说的一样,我觉得它可以使一个工作流引擎上一个台阶。。。。。。欢迎大家使用,并提出意见和建议。。。
----------转帖---------------------------------------------------
IK Expression是一个开源的(OpenSource),可扩展的(Extensible),基于java语言
关于系统中使用多个PropertyPlaceholderConfigurer的配置及PropertyOverrideConfigurer
daizj
spring
1、PropertyPlaceholderConfigurer
Spring中PropertyPlaceholderConfigurer这个类,它是用来解析Java Properties属性文件值,并提供在spring配置期间替换使用属性值。接下来让我们逐渐的深入其配置。
基本的使用方法是:(1)
<bean id="propertyConfigurerForWZ&q
二叉树:二叉搜索树
dieslrae
二叉树
所谓二叉树,就是一个节点最多只能有两个子节点,而二叉搜索树就是一个经典并简单的二叉树.规则是一个节点的左子节点一定比自己小,右子节点一定大于等于自己(当然也可以反过来).在树基本平衡的时候插入,搜索和删除速度都很快,时间复杂度为O(logN).但是,如果插入的是有序的数据,那效率就会变成O(N),在这个时候,树其实变成了一个链表.
tree代码:
C语言字符串函数大全
dcj3sjt126com
c function
C语言字符串函数大全
函数名: stpcpy
功 能: 拷贝一个字符串到另一个
用 法: char *stpcpy(char *destin, char *source);
程序例:
#include <stdio.h>
#include <string.h>
int main
友盟统计页面技巧
dcj3sjt126com
技巧
在基类调用就可以了, 基类ViewController示例代码
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[MobClick beginLogPageView:[NSString stringWithFormat:@"%@",self.class]];
window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
flyvszhb
java jdk
window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7.
安装jdk1.6前,执行java -version得到
C:\Users\liuxiang2>java -version
java version "1.7.0_21&quo
Java在创建子类对象的同时会不会创建父类对象
happyqing
java 创建 子类对象 父类对象
1.在thingking in java 的第四版第六章中明确的说了,子类对象中封装了父类对象,
2."When you create an object of the derived class, it contains within it a subobject of the base class. This subobject is the sam
跟我学spring3 目录贴及电子书下载
jinnianshilongnian
spring
一、《跟我学spring3》电子书下载地址:
《跟我学spring3》 (1-7 和 8-13) http://jinnianshilongnian.iteye.com/blog/pdf
跟我学spring3系列 word原版 下载
二、
源代码下载
最新依
第12章 Ajax(上)
onestopweb
Ajax
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
BI and EIM 4.0 at a glance
blueoxygen
BO
http://www.sap.com/corporate-en/press.epx?PressID=14787
有机会研究下EIM家族的两个新产品~~~~
New features of the 4.0 releases of BI and EIM solutions include:
Real-time in-memory computing –
Java线程中yield与join方法的区别
tomcat_oracle
java
长期以来,多线程问题颇为受到面试官的青睐。虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用。之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。
&nb
android Manifest.xml选项
阿尔萨斯
Manifest
结构
继承关系
public final class Manifest extends Objectjava.lang.Objectandroid.Manifest
内部类
class Manifest.permission权限
class Manifest.permission_group权限组
构造函数
public Manifest () 详细 androi
Oracle实现类split函数的方
zhaoshijie
oracle
关键字:Oracle实现类split函数的方
项目里需要保存结构数据,批量传到后他进行保存,为了减小数据量,子集拼装的格式,使用存储过程进行保存。保存的过程中需要对数据解析。但是oracle没有Java中split类似的函数。从网上找了一个,也补全了一下。
CREATE OR REPLACE TYPE t_split_100 IS TABLE OF VARCHAR2(100);
cr