一、分页插件介绍
MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能。需要注意的是,如果没有完全理解MyBatis 的运行原理和插件的工作方式,最好不要使用插件,因为它会改变系底层的工作逻辑,给系统带来很大的影响。
MyBatis 的插件可以在不修改原来的代码的情况下,通过拦截的方式,改变四大核心对象的行为,比如处理参数,处理SQL,处理结果。
适用场景
(1)分页功能
mybatis的分页默认是基于内存分页的(查出所有,再截取),数据量大的情况下效率较低,不过使用mybatis插件可以改变该行为,只需要拦截StatementHandler类的prepare方法,改变要执行的SQL语句为分页语句即可;
(2)公共字段统一赋值
一般业务系统都会有创建者,创建时间,修改者,修改时间四个字段,对于这四个字段的赋值,实际上可以在DAO层统一拦截处理,可以用mybatis插件拦截Executor类的update方法,对相关参数进行统一赋值即可;
(3)性能监控
对于SQL语句执行的性能监控,可以通过拦截Executor类的update, query等方法,用日志记录每个方法执行的时间;
(4)其它
其实mybatis扩展性还是很强的,基于插件机制,基本上可以控制SQL执行的各个阶段,如执行阶段,参数处理阶段,语法构建阶段,结果集处理阶段,具体可以根据项目业务来实现对应业务逻辑。
1))我们可以定义很多的插件,那么这种所有的插件会形成一个链路,比如我们提交一个休假申请,先是项目经理审批,然后是部门经理审批,再是HR 审批,再到总经理审批,怎么实现层层的拦截?
这里我们需要用到一种设计模式——责任链模式,MyBatis 官网也有提到 https://mybatis.org/mybatis-3/zh/configuration.html#plugins
Executor 会拦截到CachingExcecutor 或者BaseExecutor。因为创建Executor 时是先创建CachingExcecutor,再包装拦截。从代码顺序上能看到。我们可以通过mybatis的分页插件来看看整个插件从包装拦截器链到执行拦截器链的过程。
在查看插件原理的前提上,我们需要来看看官网对于自定义插件是怎么来做的,官网上有介绍:通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。这里本人踩了一个坑,在Springboot中集成,同时引入了pagehelper-spring-boot-starter 导致RowBounds参数的值被刷掉了,也就是走到了我的拦截其中没有被设置值,这里需要注意,拦截器出了问题,可以Debug看一下Configuration配置类中拦截器链的包装情况。
2)代理和拦截是怎么实现的?
Executor 是openSession() 的时候创建的; StatementHandler 是SimpleExecutor.doQuery()创建的;里面包含了处理参数的ParameterHandler 和处理结果集的ResultSetHandler 的创建,创建之后即调用InterceptorChain.pluginAll(),返回层层代理后的对象。代理是由Plugin 类创建。在我们重写的 plugin() 方法里面可以直接调用returnPlugin.wrap(target, this);返回代理对象。
二、分页插件使用
1、PageHelper插件
(1)添加pom依赖
com.github.pagehelper
pagehelper
1.2.15
(2)插件注册,在mybatis-config.xml 中注册插件
(3)调用
// 获取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis/mybatis-config.xml");
// 通过加载配置文件获取SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
// Mybatis在getMapper就会给我们创建jdk动态代理
PageHelper.startPage(1, 5);
List list=mapper.selectAll();
PageInfo info = new PageInfo(list, 3);
System.out.println("当前页码:"+info.getPageNum());
System.out.println("每页的记录数:"+info.getPageSize());
System.out.println("总记录数:"+info.getTotal());
System.out.println("总页码:"+info.getPages());
System.out.println("是否第一页:"+info.isIsFirstPage());
int[] nums = info.getNavigatepageNums();
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
}
PageHelper 原理
对于插件机制我们上面已经介绍过了,在这里我们自然的会想到其所涉及的核心类 :PageInterceptor。拦截的是Executor 的两个query()方法,要实现分页插件的功能,肯定是要对我们写的sql进行改写,那么一定是在 intercept 方法中进行操作的,我们会发现这么一行代码:
String pageSql = this.dialect.getPageSql(ms, boundSql, parameter, rowBounds, cacheKey);
调用到 AbstractHelperDialect 中的 getPageSql 方法:
public String getPageSql(MappedStatement ms, BoundSql boundSql, Object parameterObject, RowBounds rowBounds, CacheKey pageKey) {
// 获取sql
String sql = boundSql.getSql();
//获取分页参数对象
Page page = this.getLocalPage();
return this.getPageSql(sql, page, pageKey);
}
这里可以看到会去调用 this.getLocalPage(),我们来看看这个方法:
public Page getLocalPage() {
return PageHelper.getLocalPage();
}
//线程独享
protected static final ThreadLocal LOCAL_PAGE = new ThreadLocal();
public static Page getLocalPage() {
return (Page)LOCAL_PAGE.get();
}
可以发现这里是调用的是PageHelper的一个本地线程变量中的一个 Page对象,从其中获取我们所设置的 PageSize 与 PageNum,那么他是怎么设置值的呢?请看:
PageHelper.startPage(1, 3);
public static Page startPage(int pageNum, int pageSize) {
return startPage(pageNum, pageSize, true);
}
public static Page startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
Page page = new Page(pageNum, pageSize, count);
page.setReasonable(reasonable);
page.setPageSizeZero(pageSizeZero);
Page oldPage = getLocalPage();
if (oldPage != null && oldPage.isOrderByOnly()) {
page.setOrderBy(oldPage.getOrderBy());
}
//设置页数,行数信息
setLocalPage(page);
return page;
}
protected static void setLocalPage(Page page) {
//设置值
LOCAL_PAGE.set(page);
}
在我们调用 PageHelper.startPage(1, 3); 的时候,系统会调用 LOCAL_PAGE.set(page) 进行设置,从而在分页插件中可以获取到这个本地变量对象中的参数进行 SQL 的改写,由于改写有很多实现,我们这里用的Mysql的实现:
在这里我们会发现分页插件改写SQL的核心代码,这个代码就很清晰了,不必过多赘述:
public String getPageSql(String sql, Page page, CacheKey pageKey) {
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
sqlBuilder.append(sql);
if (page.getStartRow() == 0) {
sqlBuilder.append(" LIMIT ");
sqlBuilder.append(page.getPageSize());
} else {
sqlBuilder.append(" LIMIT ");
sqlBuilder.append(page.getStartRow());
sqlBuilder.append(",");
sqlBuilder.append(page.getPageSize());
pageKey.update(page.getStartRow());
}
pageKey.update(page.getPageSize());
return sqlBuilder.toString();
}
pageHelper 就是这么一步一步的改写了我们的SQL 从而达到一个分页的效果
2、自定义分页插件
@Intercepts({
@Signature(type = Executor.class,method = "query" ,args ={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class} ), // 需要代理的对象和方法
@Signature(type = Executor.class,method = "query" ,args ={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class} ) // 需要代理的对象和方法
})
public class MyPageInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("简易版的分页插件:逻辑分页改成物理分页");
// 修改sql 拼接Limit 0,10
Object[] args = invocation.getArgs();
// MappedStatement 对mapper映射文件里面元素的封装
MappedStatement ms= (MappedStatement) args[0];
// BoundSql 对sql和参数的封装
Object parameterObject=args[1];
BoundSql boundSql = ms.getBoundSql(parameterObject);
// RowBounds 封装了逻辑分页的参数 :当前页offset,一页数limit
RowBounds rowBounds= (RowBounds) args[2];
// 拿到原来的sql语句
String sql = boundSql.getSql();
String limitSql=sql+ " limit "+rowBounds.getOffset()+","+ rowBounds.getLimit();
//将分页sql重新封装一个BoundSql 进行后续执行
BoundSql pageBoundSql = new BoundSql(ms.getConfiguration(), limitSql, boundSql.getParameterMappings(), parameterObject);
// 被代理的对象
Executor executor= (Executor) invocation.getTarget();
CacheKey cacheKey = executor.createCacheKey(ms, parameterObject, rowBounds, pageBoundSql);
// 调用修改过后的sql继续执行查询
return executor.query(ms,parameterObject,rowBounds, (ResultHandler) args[3],cacheKey,pageBoundSql);
}
}
拦截签名跟参数的顺序有严格要求,如果按照顺序找不到对应方法会抛出异常:org.apache.ibatis.exceptions.PersistenceException
3、伪分页
所谓伪分页就是查询数据库全部数据,然后再在内存中获取
List emps = mapper.queryEmp(new RowBounds(0,10));
三、逆向工程
1、引入pom依赖
org.mybatis.generator
mybatis-generator-core
1.4.0
2、编写配置文件
3、生成方法
(1) 通过程序
@Test
public void test01() throws Exception {
List warnings = new ArrayList();
boolean overwrite = true;
File configFile = new File("generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
(2) 通过命令
java -jar mybatis-generator-core-1.4.0.jar -configfile ../src/main/resource/generatorConfig.xml -overwrite
4、targetRuntime改为MyBatis3
MyBatis3会多生成一份Example文件,我们在根据where条件查询时,不必再写sql,直接用Example来拼接条件
例:
@Test
public void test02() {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
// Mybatis在getMapper就会给我们创建jdk动态代理
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 使用Example实现动态条件语句
EmpExample empExample=new EmpExample();
EmpExample.Criteria criteria = empExample.createCriteria();
criteria.andUserNameLike("%帅%")
.andIdEqualTo(4);
List emps = mapper.selectByExample(empExample);
System.out.println(emps);
}
}
你可能感兴趣的:(SSM,java,mybatis)
03 手把手教你理解Vue Router核心原理(附实战代码)
泯泷
Vue2 快速入门 ui html5 css3 前端 前端框架 Vue vue.js
一、前端路由的魔法原理想象你在一本魔法书中翻页,页面内容会变化但书本本身不会重新印刷。前端路由就是这样的魔法,当我们在单页应用(SPA)中切换页面时:不会触发真正的页面刷新页面内容通过JavaScript动态更新URL会同步变化反映当前状态二、三种路由模式大比拼1.Hash模式(默认模式)工作原理:利用URL中的#符号(锚点)实现路由切换//创建路由实例import{createRouter,cr
最新计算机专业开题报告案例84:基于Springboot框架的校园点餐系统的设计与实现
平姐设计
微信小程序项目实战 java项目实战 计算机毕业设计开题报告100套 spring boot java 校园点餐管理系统 餐厅管理 在线支付 开题报告 国内外研究现状
计算机毕业设计100套微信小程序项目实战java项目实战需要源码可以滴滴我请文末卡片dd我获取更详细的演示视频撰写不易,感谢支持!目录一、研究背景和意义1.1研究背景1.2研究意义二、国内外研究状况2.1后端技术2.1.1基于SpringBoot的校园点餐系统设计与实现2.1.2基于SpringMVC的校园点餐系统设计与实现2.1.3基于Mybatis的校园点餐系统设计与实现2.2前端技术2.2.
JavaScript 中处理 object 对象类型的常见方法
像素检测仪
前端 js javascript 前端 typescript
目录一、对象的基本操作1.创建对象2.访问和修改属性3.添加新属性4.删除属性5.检查属性是否存在二、对象的组合操作1.合并对象2.扩展运算符3.对象解构三、对象的深拷贝1.使用JSON.parse和JSON.stringify2.使用递归函数四、对象的遍历1.for...in循环2.Object.keys()3.Object.entries()五、常用对象方法1.Object.assign()2
性能调优JVM参数优化方案有哪些
Feng.Lee
漫谈测试 jvm 性能优化
目录一、JVM内存模型内存相关参数JVM内存模型如下图二、栈空间入栈出栈示意如下图所示。与栈空间有关的两种异常如下。Java线程的6种状态如下:那么,继续思考如下两个问题。三、堆空间那么,内存如何设置呢?对象进入老年代一般有以下4种可能:四、垃圾回收相关参数五、JIT编译器相关参数六、性能诊断相关参数七、其它常用参数JVM(Java虚拟机)参数优化对于提高Java应用程序的性能至关重要。通过调整J
Java面试题之:sql优化方式
m0_74825565
面试 学习路线 阿里巴巴 java sql 开发语言
Java面试题之:sql优化方式一、索引查询、避免全表扫描二、查询数据尽量避免使用or三、连续查询,能用between就用四、where查询条件,对字段进行表达式操作五、where查询条件,对字段进行函数操作六、多张数据表查询数据,使用innerjoin七、in()和exists()八、使用like进行数据表查询时,能用%就不建议使用双%九、最左优先十、精确类型匹配十一、表越小,查询越快十二、数据
请解释 JavaScript 中的函数式编程,优缺点是什么?
程序员黄同学
前端开发 JavaScript javascript 开发语言 ecmascript
一、对JavaScript函数式编程的理解函数式编程(FunctionalProgramming,FP)是一种编程范式,它将计算视为数学函数的求值,并避免改变状态和可变数据。在JavaScript中,函数式编程具有以下几个关键特性:(一)纯函数纯函数是指对于相同的输入,总是返回相同的输出,并且不会产生任何可观察的副作用。例如://纯函数示例:计算两个数的和functionadd(a,b){retu
探索Node.js的串口通信新世界:Node Serialport
侯深业Dorian
探索Node.js的串口通信新世界:NodeSerialport项目地址:https://gitcode.com/gh_mirrors/no/node-serialport在构建硬件交互或物联网应用时,我们常常需要与设备进行低级别通信,例如通过串行端口(如COM端口)。这就是NodeSerialport发挥作用的地方。这是一个强大的开源库,它为JavaScript开发者提供了跨平台的串行端口访问功
Java语言的软件开发工具
沈韡蕙
包罗万象 golang 开发语言 后端
Java语言的软件开发工具探讨Java是一种广泛使用的编程语言,因其跨平台特性、丰富的库和框架以及活跃的开发社区而备受欢迎。在Java开发过程中,开发工具的选择对开发效率、代码质量、团队协作等方面都起着至关重要的作用。本文将深入探讨一些主流的Java开发工具,包括集成开发环境(IDE)、构建工具、版本控制工具等。一、集成开发环境(IDE)IDE是软件开发的重要工具之一,提供代码编辑、调试、版本控制
Perl语言的区块链
沈韡蕙
包罗万象 golang 开发语言 后端
Perl语言在区块链技术中的应用引言随着区块链技术的迅猛发展,越来越多的编程语言开始在这个领域中发挥重要作用。虽然常见的区块链开发语言例如Solidity和JavaScript广受欢迎,但Perl作为一门成熟且灵活的语言,也在一些特定的应用场景中展现出其独特的优势。本文将探讨Perl语言在区块链技术中的应用,包括其特点、在区块链中的实现、案例分析以及未来展望。Perl语言的特点Perl是一种强大的
最全面的 Node.js 资源汇总推荐
程序员小英
node.js
原文来源于:程序员成长指北;作者:前哨君原文:https://github.com/jobbole/awesome-nodejs-cn如有侵权,联系删除【导读】:Node.js是一个开源、跨平台的,用于编写服务器和命令行的JavaScript运行时工具。awesome-nodejs是sindresorhus发起维护的Node.js资源列表,内容包括:命令行工具、日志、调试、HTTP、构建工具、文件
Linux 系统中 Java 程序被强制杀掉?这些日志帮你快速定位原因!
夜里慢慢行456
java linux java
文章目录一、为什么Java程序会被强制杀掉?二、如何通过日志定位问题?(一)检查系统日志(二)检查Java应用程序日志(三)使用journalctl查看日志(四)监控系统资源(五)检查操作系统限制(六)检查JVM参数和配置(七)排查OOMKiller三、实战案例案例1:Java程序因内存不足被杀案例2:Java程序因超时被杀在Linux系统中,Java程序可能会因为各种原因被系统强制杀掉。这种情况
如何利用Spring的@Value注解实现配置信息的动态注入与管理?
码农技术栈
spring spring cloud spring boot java 微服务
@Value注解在Spring中的作用,就像是一个“传话员”,它负责把配置文件中的值或者其他来源的值传递给Java对象中的属性。想象一下,你有一个装满各种设置的小盒子(配置文件),里面记录了各种信息,比如数据库的连接信息、应用的端口号等。现在,你有一个Java对象,它需要一个属性值,比如数据库的连接字符串。这时候,@Value注解就像是一个“传话员”,它跑到小盒子(配置文件)那里,找到对应的值,然
Mybatis源码05 - Mapper映射文件的配置
是小崔啊
# mybatis源码 mybatis 数据库 java 源码
Mapper映射文件的配置文章目录Mapper映射文件的配置一:更新的配置和使用1:模板mapper2:实例说明二:select、resultMap的配置及使用1:select的配置2:实例说明3:resultMap4:字符串代入法和SQL注入三:子元素解析1:子元素cache解析2:子元素cache-ref解析3:子元素resultMap解析4:子元素sql解析5:子元素statement解析5
Filter概述、执行流程、拦截路径配置及过滤器链
夏志121
Java基础+进阶+核心技术 java 开发语言 前端 intellij idea 服务器
目录一、Filter概述二、Filter入门案例三、Filter执行流程四、Filter拦截路径配置五、过滤器链一、Filter概述概念:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能过滤器一般完成一些通用的操作,比如:权限控制,统一编码处理,敏感字符处理等等....二、Filter入
Mybatis-SQL-Viewer技术文档
彭锟晋Rita
Mybatis-SQL-Viewer技术文档mybatis-sql-viewerconvertmybatisxmltosqlstatement;mybatisparammock;sqlspecificationcheck;sqlindexcheck;sqlexecution;sqlstress;mybatissqlscan项目地址:https://gitcode.com/gh_mirrors/my
MybatisPlusCRUD接口使用
cwtlw
java 开发语言 spring boot mysql
1.MybatisPlus的CRUD接口MybatisPlus提供了很多CRUD接口,可以直接使用这些接口来操作数据库。而不用像Mybatis那样写大量的XML文件及SQL语句。MapperCRUD接口主要关键是继承BaseMapper,其中T是实体类。使用案例Mapper层继承BaseMapper接口@MapperpublicinterfaceStudentMapperextendsBaseMa
Executors 的详细用法及与 ThreadPoolExecutor 的关系
java
一、Executors工具类概述Executors是Java并发包(java.util.concurrent)中的一个工具类,提供了一系列静态工厂方法,用于快速创建不同类型的线程池。这些方法内部封装了ThreadPoolExecutor或ScheduledThreadPoolExecutor的配置,简化了线程池的创建过程。二、Executors提供的线程池类型及用法工厂方法线程池类型核心参数配置适
Java进阶篇之线程的创建和运行
code2cat
Java Java进阶 java 开发语言 intellij-idea eclipse ide
引言在前面的文章中,我们介绍了多线程(Java进阶篇之多线程)。在开发高效的并发应用时,线程的创建与运行是我们需要掌握的基本技能。线程能够让我们同时处理多个任务,充分利用多核CPU提高程序的执行效率。Java提供了多种方式来创建和启动线程,从简单的继承Thread类到实现Runnable接口,再到使用现代的ExecutorService,每种方式都有其适用的场景。今天,我们就来聊一聊Java中线程
能不能解释一下本地方法栈?思维导图 代码示例(java 架构)
用心去追梦
java 架构 开发语言
本地方法栈(NativeMethodStack)本地方法栈是JVM运行时数据区的一部分,类似于Java虚拟机栈,但用于支持本地方法(通常是用C/C++编写的)的调用。本地方法栈主要用于存储本地方法的信息,如局部变量、操作数栈等。特点线程私有:每个线程都有自己的本地方法栈,互不影响。生命周期:本地方法栈的生命周期与线程相同,线程启动时创建,线程结束时销毁。栈帧:每个本地方法调用时都会创建一个栈帧,方
Java NIO基础与实战:如何提升IO操作性能
薛伟同学
Netty:高性能网络编程技巧 java nio
JavaNIO概述JavaNIO(新I/O)是Java提供的一个更为高效的I/O处理框架。JavaNIO(NewI/O)是对传统I/O(java.io)模型的改进,它引入了非阻塞I/O操作和面向缓冲区的数据读写方式,解决了传统I/O模型中的性能瓶颈。NIO的设计目标是使I/O操作更加高效,特别是在大数据量、高并发情况下,能够充分利用操作系统的底层I/O多路复用机制。JavaNIO的核心概念包括:B
Java 循环结构进阶
m0_74824483
面试 学习路线 阿里巴巴 java
二重循环1.一个循环体内又包含另一个完整的循环结构2.外城循环变量变化一次,内层循环变量要变化一遍。二重循环-冒泡排序
Java--IO流详解 (上)--字符流
不修×蝙蝠
IO流 JavaSE 输入流 输出流 字节流 字符流
目录IO流的概念字符流输入流Reader核心方法1.close()2.mark(intreadAheadLimit)3.markSupported()4.read()5.read(char[]cbuf)6.read(char[]cbuf,intoff,intlen)7.read(CharBuffertarget)8.ready()9.reset()10.skip(longn)Reader的常用子类
JavaScript 中内存泄漏的几种情况是什么,如何避免?
程序员黄同学
前端开发 JavaScript Java面试题 javascript 前端 开发语言
一、全局变量泄漏(高频考点)问题场景:未使用var/let/const声明变量,或意外挂载到window对象//错误示例(创建全局变量)functioninitData(){cache=newArray(1000000)//隐式全局变量}//正确方案(严格模式+局部变量)'usestrict'functionsafeInit(){constlocalCache=[]//局部变量自动回收}防御建议:
自定义公式校验规则、常用的JavaScript正则公式合法校验、自定义公式合集、前端校验规则、字符串校验
a_dream(前端)
前端 javascript 正则表达式
vue开发中,会使用到自定义公式校验合法性,判断公式是否符合逻辑,整理个人使用过的自定义公式页面保存时对输入的字符串进行校验的一套规则(文章最后有完整代码)目录1.正则判断2.校验数字(输入数字不超过十位数,不超过两位小数)3.校验括号(嵌套括号是否符合要求)4.(完整代码文件)1.正则判断constre=/[^0-9\(\)\+\-\×\÷\.\#\{\}]{1,}///判断输入字符合法性的正则
IDEA配置JSTL
阿俊仔(摸鱼版)
intellij-idea java tomcat
IDEA配置JSTL下载JSTL官网下载地址:https://tomcat.apache.org翻到下面找到:点击,download下载下面内容:(就Impl和Spec)配置JSTL将两个下好的jar包放在lib文件夹下ctrl+shift+alt+s打开ProjectStructure左侧找到Modules->右侧选择Dependences->点击➕号Library->点击java->选中WEB
javax.imageio.IIOException: Can‘t read input file
阿俊仔(摸鱼版)
眼盲心不瞎的憨憨bug日记 intellij-idea
问题描述根据路径地址读取图片存入数据库时,提示我没法读取图片。原因分析:大致就是各种情况导致路径不对或者文件不对路径格式写错了(windows路径分隔符是\,Linux是/)文件格式写错(文件名写错或者文件后缀写错)该路径下此文件不存在(复制路径去本地找找核对一下)解决方案:先看报错信息检查出错的语句(那边没什么问题),然后我又检查了所有写了文件路径的语句,发现我写入数据库的那个文件的路径没把文件
MVC和react
吃蛋糕的居居
javascript css node.js html
MVC1.MVC是一种使用MVC(ModelViewController模型-视图-控制器)设计创建Web应用程序的模式.(1)Model(模型)表示应用程序核心(比如数据库记录列表).(2)View(视图)显示数据(数据库记录).(3)Controller(控制器)处理输入(写入数据库记录).2.MVC模式同时提供了对HTML、CSS和JavaScript的完全控制.(1)Model(模式)是应
海南大学--学习资料--网络应用开发java web(胡祝华)-第3次作业解析(学长整理)
创创大帝(水印很浅-下载的文档)
海南大学--学习资料--PHP HTML java web 前端 java html
海南大学–学习资料–网络应用开发javaweb(胡祝华)-第3次作业解析(学长整理)海南大学–学习资料–网络应用开发javaweb(胡祝华)-第3次作业解析(学长整理)海南大学–学习资料–网络应用开发javaweb(胡祝华)-第3次作业解析(学长整理)表单验证:1.在表单的源码中head部分用script导入了script/regcheckdata.js文件2.当点击提交按钮时,onSubmit=
手把手教你给 windows装个vmware虚拟机
python算法小白
附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全:书单导航页(点击右侧极客侠栈即可打开个人博客):极客侠栈①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版)②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版)③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版)④【Web前端】从HTML到JS到AJ
github提示 Filename too long
JavaGameServer
# git rocketmq
gitconfig--globalcore.longpathstrueerror:open("chapter13/rocketmq-externals-master/rocketmq-externals-master/rocketmq-connect/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime
PHP,安卓,UI,java,linux视频教程合集
cocos2d-x小菜
java UI linux PHP android
╔-----------------------------------╗┆
zookeeper admin 笔记
braveCS
zookeeper
Required Software
1) JDK>=1.6
2)推荐使用ensemble的ZooKeeper(至少3台),并run on separate machines
3)在Yahoo!,zk配置在特定的RHEL boxes里,2个cpu,2G内存,80G硬盘
数据和日志目录
1)数据目录里的文件是zk节点的持久化备份,包括快照和事务日
Spring配置多个连接池
easterfly
spring
项目中需要同时连接多个数据库的时候,如何才能在需要用到哪个数据库就连接哪个数据库呢?
Spring中有关于dataSource的配置:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
&nb
Mysql
171815164
mysql
例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%'IDENTIFIED BY 'mypassword' WI
TH GRANT OPTION;
如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作
CommonDAO(公共/基础DAO)
g21121
DAO
好久没有更新博客了,最近一段时间工作比较忙,所以请见谅,无论你是爱看呢还是爱看呢还是爱看呢,总之或许对你有些帮助。
DAO(Data Access Object)是一个数据访问(顾名思义就是与数据库打交道)接口,DAO一般在业
直言有讳
永夜-极光
感悟 随笔
1.转载地址:http://blog.csdn.net/jasonblog/article/details/10813313
精华:
“直言有讳”是阿里巴巴提倡的一种观念,而我在此之前并没有很深刻的认识。为什么呢?就好比是读书时候做阅读理解,我喜欢我自己的解读,并不喜欢老师给的意思。在这里也是。我自己坚持的原则是互相尊重,我觉得阿里巴巴很多价值观其实是基本的做人
安装CentOS 7 和Win 7后,Win7 引导丢失
随便小屋
centos
一般安装双系统的顺序是先装Win7,然后在安装CentOS,这样CentOS可以引导WIN 7启动。但安装CentOS7后,却找不到Win7 的引导,稍微修改一点东西即可。
一、首先具有root 的权限。
即进入Terminal后输入命令su,然后输入密码即可
二、利用vim编辑器打开/boot/grub2/grub.cfg文件进行修改
v
Oracle备份与恢复案例
aijuans
oracle
Oracle备份与恢复案例
一. 理解什么是数据库恢复当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失。因此当发生上述故障后,希望能重构这个完整的数据库,该处理称为数据库恢复。恢复过程大致可以分为复原(Restore)与
JavaEE开源快速开发平台G4Studio v5.0发布
無為子
我非常高兴地宣布,今天我们最新的JavaEE开源快速开发平台G4Studio_V5.0版本已经正式发布。
访问G4Studio网站
http://www.g4it.org
2013-04-06 发布G4Studio_V5.0版本
功能新增
(1). 新增了调用Oracle存储过程返回游标,并将游标映射为Java List集合对象的标
Oracle显示根据高考分数模拟录取
百合不是茶
PL/SQL编程 oracle例子 模拟高考录取 学习交流
题目要求:
1,创建student表和result表
2,pl/sql对学生的成绩数据进行处理
3,处理的逻辑是根据每门专业课的最低分线和总分的最低分数线自动的将录取和落选
1,创建student表,和result表
学生信息表;
create table student(
student_id number primary key,--学生id
优秀的领导与差劲的领导
bijian1013
领导 管理 团队
责任
优秀的领导:优秀的领导总是对他所负责的项目担负起责任。如果项目不幸失败了,那么他知道该受责备的人是他自己,并且敢于承认错误。
差劲的领导:差劲的领导觉得这不是他的问题,因此他会想方设法证明是他的团队不行,或是将责任归咎于团队中他不喜欢的那几个成员身上。
努力工作
优秀的领导:团队领导应该是团队成员的榜样。至少,他应该与团队中的其他成员一样努力工作。这仅仅因为他
js函数在浏览器下的兼容
Bill_chen
jquery 浏览器 IE DWR ext
做前端开发的工程师,少不了要用FF进行测试,纯js函数在不同浏览器下,名称也可能不同。对于IE6和FF,取得下一结点的函数就不尽相同:
IE6:node.nextSibling,对于FF是不能识别的;
FF:node.nextElementSibling,对于IE是不能识别的;
兼容解决方式:var Div = node.nextSibl
【JVM四】老年代垃圾回收:吞吐量垃圾收集器(Throughput GC)
bit1129
垃圾回收
吞吐量与用户线程暂停时间
衡量垃圾回收算法优劣的指标有两个:
吞吐量越高,则算法越好
暂停时间越短,则算法越好
首先说明吞吐量和暂停时间的含义。
垃圾回收时,JVM会启动几个特定的GC线程来完成垃圾回收的任务,这些GC线程与应用的用户线程产生竞争关系,共同竞争处理器资源以及CPU的执行时间。GC线程不会对用户带来的任何价值,因此,好的GC应该占
J2EE监听器和过滤器基础
白糖_
J2EE
Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文。
监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会话的HttpSession监听和基于请求的ServletRequest监听。
ServletContex监听器
ServletContex又叫application
博弈AngularJS讲义(16) - 提供者
boyitech
js AngularJS api Angular Provider
Angular框架提供了强大的依赖注入机制,这一切都是有注入器(injector)完成. 注入器会自动实例化服务组件和符合Angular API规则的特殊对象,例如控制器,指令,过滤器动画等。
那注入器怎么知道如何去创建这些特殊的对象呢? Angular提供了5种方式让注入器创建对象,其中最基础的方式就是提供者(provider), 其余四种方式(Value, Fac
java-写一函数f(a,b),它带有两个字符串参数并返回一串字符,该字符串只包含在两个串中都有的并按照在a中的顺序。
bylijinnan
java
public class CommonSubSequence {
/**
* 题目:写一函数f(a,b),它带有两个字符串参数并返回一串字符,该字符串只包含在两个串中都有的并按照在a中的顺序。
* 写一个版本算法复杂度O(N^2)和一个O(N) 。
*
* O(N^2):对于a中的每个字符,遍历b中的每个字符,如果相同,则拷贝到新字符串中。
* O(
sqlserver 2000 无法验证产品密钥
Chen.H
sql windows SQL Server Microsoft
在 Service Pack 4 (SP 4), 是运行 Microsoft Windows Server 2003、 Microsoft Windows Storage Server 2003 或 Microsoft Windows 2000 服务器上您尝试安装 Microsoft SQL Server 2000 通过卷许可协议 (VLA) 媒体。 这样做, 收到以下错误信息CD KEY的 SQ
[新概念武器]气象战争
comsci
气象战争的发动者必须是拥有发射深空航天器能力的国家或者组织....
原因如下:
地球上的气候变化和大气层中的云层涡旋场有密切的关系,而维持一个在大气层某个层次
oracle 中 rollup、cube、grouping 使用详解
daizj
oracle grouping rollup cube
oracle 中 rollup、cube、grouping 使用详解 -- 使用oracle 样例表演示 转自namesliu
-- 使用oracle 的样列库,演示 rollup, cube, grouping 的用法与使用场景
--- ROLLUP , 为了理解分组的成员数量,我增加了 分组的计数 COUNT(SAL)
技术资料汇总分享
Dead_knight
技术资料汇总 分享
本人汇总的技术资料,分享出来,希望对大家有用。
http://pan.baidu.com/s/1jGr56uE
资料主要包含:
Workflow->工作流相关理论、框架(OSWorkflow、JBPM、Activiti、fireflow...)
Security->java安全相关资料(SSL、SSO、SpringSecurity、Shiro、JAAS...)
Ser
初一下学期难记忆单词背诵第一课
dcj3sjt126com
english word
could 能够
minute 分钟
Tuesday 星期二
February 二月
eighteenth 第十八
listen 听
careful 小心的,仔细的
short 短的
heavy 重的
empty 空的
certainly 当然
carry 携带;搬运
tape 磁带
basket 蓝子
bottle 瓶
juice 汁,果汁
head 头;头部
截取视图的图片, 然后分享出去
dcj3sjt126com
OS Objective-C
OS 7 has a new method that allows you to draw a view hierarchy into the current graphics context. This can be used to get an UIImage very fast.
I implemented a category method on UIView to get the vi
MySql重置密码
fanxiaolong
MySql重置密码
方法一:
在my.ini的[mysqld]字段加入:
skip-grant-tables
重启mysql服务,这时的mysql不需要密码即可登录数据库
然后进入mysql
mysql>use mysql;
mysql>更新 user set password=password('新密码') WHERE User='root';
mysq
Ehcache(03)——Ehcache中储存缓存的方式
234390216
ehcache MemoryStore DiskStore 存储 驱除策略
Ehcache中储存缓存的方式
目录
1 堆内存(MemoryStore)
1.1 指定可用内存
1.2 驱除策略
1.3 元素过期
2 &nbs
spring mvc中的@propertysource
jackyrong
spring mvc
在spring mvc中,在配置文件中的东西,可以在java代码中通过注解进行读取了:
@PropertySource 在spring 3.1中开始引入
比如有配置文件
config.properties
mongodb.url=1.2.3.4
mongodb.db=hello
则代码中
@PropertySource(&
重学单例模式
lanqiu17
单例 Singleton 模式
最近在重新学习设计模式,感觉对模式理解更加深刻。觉得有必要记下来。
第一个学的就是单例模式,单例模式估计是最好理解的模式了。它的作用就是防止外部创建实例,保证只有一个实例。
单例模式的常用实现方式有两种,就人们熟知的饱汉式与饥汉式,具体就不多说了。这里说下其他的实现方式
静态内部类方式:
package test.pattern.singleton.statics;
publ
.NET开源核心运行时,且行且珍惜
netcome
java .net 开源
背景
2014年11月12日,ASP.NET之父、微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣布,微软将开源全部.NET核心运行时,并将.NET 扩展为可在 Linux 和 Mac OS 平台上运行。.NET核心运行时将基于MIT开源许可协议发布,其中将包括执行.NET代码所需的一切项目——CLR、JIT编译器、垃圾收集器(GC)和核心
使用oscahe缓存技术减少与数据库的频繁交互
Everyday都不同
Web 高并发 oscahe缓存
此前一直不知道缓存的具体实现,只知道是把数据存储在内存中,以便下次直接从内存中读取。对于缓存的使用也没有概念,觉得缓存技术是一个比较”神秘陌生“的领域。但最近要用到缓存技术,发现还是很有必要一探究竟的。
缓存技术使用背景:一般来说,对于web项目,如果我们要什么数据直接jdbc查库好了,但是在遇到高并发的情形下,不可能每一次都是去查数据库,因为这样在高并发的情形下显得不太合理——
Spring+Mybatis 手动控制事务
toknowme
mybatis
@Override
public boolean testDelete(String jobCode) throws Exception {
boolean flag = false;
&nbs
菜鸟级的android程序员面试时候需要掌握的知识点
xp9802
android
熟悉Android开发架构和API调用
掌握APP适应不同型号手机屏幕开发技巧
熟悉Android下的数据存储
熟练Android Debug Bridge Tool
熟练Eclipse/ADT及相关工具
熟悉Android框架原理及Activity生命周期
熟练进行Android UI布局
熟练使用SQLite数据库;
熟悉Android下网络通信机制,S