- 浏览: 14334 次
- 性别:
- 来自: 成都
最新评论
文章列表
执行方式2:
DeptMapper mapper = openSession.getMapper(DeptMapper.class);
Dept dept2= mapper.select(d);
DefaultSqlSession#getMapper
@Override
public <T> T getMapper(Class<T> type) {
return configuration.<T>getMapper(type, this);
}
//从MapperRegistry获取
public ...
DefaultResultSetHandler#handleResultSets 处理结果集
@Override
public List<Object> handleResultSets(Statement stmt) throws SQLException {
ErrorContext.instance().activity("handling results").object(mappedStatement.getId());
final List<Object> multipleResults = new Ar ...
MyBatis原理(2)-执行流程 2
- 博客分类:
- mybatis
@Override
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
BoundSql boundSql = ms.getBoundSql(parameterObject);
CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);
...
MyBatis执行两种方式:
1.
SqlSession openSession = sqlSessionFactory.openSession();
Dept d = new Dept();
d.setId(1506720);
Object dept = openSession.selectOne("dao.DeptDAO1.select",d);
System.out.println(dept);
2.
DeptMapper mapper = openSession.getMapper(DeptMapper.class);
Dep ...
1.接着上一篇文章解析mapper第一步
mapperElement(root.evalNode("mappers"));
private void mapperElement(XNode parent) throws Exception {
if (parent != null) {
for (XNode child : parent.getChildren()) {
if ("package".equals(child.getName())) {
String mapperPack ...
MyBatis原理(1)-启动流程2
- 博客分类:
- mybatis
1.XMLConfigBuilder.parse
public Configuration parse() {
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
}
parsed = true;
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
...
MyBatis原理(1)-启动流程1
- 博客分类:
- mybatis
概述:本文按三个部分依次循序渐进对mybatis源码-原理进行分析
1.MyBatis 启动流程
2.MyBatis 执行流程
3.MyBatis 核心组件
第一部分 启动流程
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
...
在说一下Lambda表达式之前,我们先了解下为什么java要引入Lambda表达式
在java8 之前要将行为参数化我们有两种选择:
1.策略模式,根据参数传入的具体实现决定方法的实现
2.匿名内部类。
1的缺点是要新增新的行为必须创建新的 ...
在java8中接口可以实现默认方法 ,使用default 关键字
package com.dx;
public interface Caculate {
default int sum( int i,int k){
return i+k;
}
void sayHello(String msg);
}
当然实现接口的类可以选择实现或者不实现默认接口方法。
提问:为什么要新加入默认方法的特性呢?
假设一个场景,现在有一个接口,而且有很多实现类都实现了这个接口,如果要对这个接口添加新的方法,那么按照接口语义所有子类都 ...
JVM内存区域划分:方法区、虚拟机栈、本地方法栈、堆、程序计数器
Java堆(java Heap):(when)堆是被所有线程共享的一块区域,由虚拟机启动时创建。(what)用来存放对象实例和数组;(where)Java堆可以处在不连续的内存空间中,只要在 ...
1、单道程序,即在内存中只有一个程序运行,在这个程序结束之前其他程序无法使用内存。
2、多道程序:多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序(我们后来常说的内核)控制下,相互穿插运行,两个或两个以上程序在计算机系统中同处于开始到结束之间的状态, 这些程序共享计算机系统资源。多道程序的发展,在一定程度上促进了操作系统和多cpu的发展。
3、为什么后来会引入进程?
由于程序在并发执行时,可能会造成执行结果的不可再现,所以用“程序”这个概念已无法描述程序的并发执行,所以必须引入新的概念—进程来描述程序的并发执行,并要对进程进行必要的管理,以保证进程在并发执行时结果可 ...
假设一个应用场景:需要模拟车辆一天的运行轨迹,并且实时监控,就需要不断的像已有的数据集合中添加新的数据,并且遍历集合。
在传统的java集合包中的集合中像 ArrayList HashMap等;在同一线程中传统集合是不允许修改的,也就是遍历时不能修改,添加,删除等操作。多个线程就更不行了。
为此java.util.concurrent包中提出了一些解决方法:
使用Collections.synchronizedList() ,new CopyOnWriteArrayList<String>() 等,将集合包装为安全的集合,这样确实是结局了同步的问题。其内部的原理,就是将资源sync ...
JDK 1.7 引入了 java.lang.AutoCloseable 接口,用来自动关闭像InputStream,OutputStream这样的一些资源,只要该类实现了此接口 就可以使用 try-catch-resource 块将声明部分包括在其中,执行完毕后资源会自动关闭,没有必要再去写 in.close() 类似的代码。
这样的好处是:在手动释放jdbc连接的时候,需要关闭 Connection,Statement,ResultSet 这样的资源,需要嵌套多个try-catch。
使用方式: 多个语句之间用分号分隔
一个简单的读取文件的例子:
public class Try ...
public class SelectSort {
public static void main(String[] args) {
int[] a = { 5, 7, 9, 2, 4, 365, 65536, 6, 34, 421, 2, 14, 51, 57, 90, 7 };
for(int i = 0; i < a.length-1 ;i ++){
/**
* 将第一个元素与每个元素比较 将小的元素放到前面
* 第二个元素与每个元素比较
* 。。。。
* 倒数第二个元素与最后一个元素比较
*/
...
public class Bubble {
public static void main(String[] args) {
int[] a = { 5, 7, 9, 2, 4, 365, 65536, 6, 34, 421, 2, 14, 51, 57, 90, 7 };
// 遍历数组 将相邻的两个元素比较 左边的元素大于右边的元素就交换位置
//首先进行内部遍历 可视为第一次遍历 将最大的元素放到末尾
// 第二次遍历将 第二大的元素放到倒数第二位置
//依次类推 需要进行 N次外部循环
for (int k ...