ibatis

Mybatis运行原理(带你三步走)

生来就可爱ヽ(ⅴ<●) 提交于 2020-08-06 12:05:53
Mybatis运行原理(带你三步走) 官网地址: http://www.mybatis.org/mybatis-3/zh/getting-started.html 第一步:初始化阶段,解析并加载到Configuration实例中。 读取xml配置文件和注解中的配置信息,创建配置对象,并完成各个模块的初始化工作。 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。 源码解读入口: String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 其中: XMLConfigBuilder

Mybaties简单实例测试及注意问题

橙三吉。 提交于 2020-08-05 22:09:38
IDEA下一个简单的mybaties测试程序,适合初学者阅读。 目录结构及lib: 在src>main>java 下 根据数据库表创建实体类:com.itheima.domain.User 注意:表字段名和实体属性要对应一致 package com.itheima.domain; import java.io.Serializable; public class User implements Serializable { private Integer id; private String sname; private Integer age; private String sex; private String phone; private Integer javascore; private String birth; public Integer getId() { return id; } public void setId(Integer id) { this .id = id; } public String getSname() { return sname; } public void setSname(String sname) { this .sname = sname; } public Integer getAge() { return age; }

【Spring Boot】Spring Boot之整合Sharding-JDBC(java config方式)实现分库分表(水平拆分)

眉间皱痕 提交于 2020-08-05 07:55:17
一、概念先行 1)SQL相关的 逻辑表:水平拆分的数据库(表)的相同逻辑和数据结构表的总称。例:订单数据根据主键尾数拆分为2张表,分别是t_order_0到t_order_1,他们的逻辑表名为t_order。 真实表:在分片的数据库中真实存在的物理表。例:示例中的t_order_0到t_order_1 数据节点:数据分片的最小单元。由数据源名称和数据表组成,例:ds_0.t_order_0;ds_0.t_order_1; 绑定表:指分片规则一致的主表和子表。例如:t_order表和t_order_item表,均按照order_id分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。 广播表:指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表,示例中的t 2)分片相关 分片键:用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。 SQL中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,ShardingSphere也支持根据多个字段进行分片。 分片算法:通过分片算法将数据分片,支持通过=、>=、<=、>、<、BETWEEN和IN分片

【Spring Boot】Spring Boot之整合Sharding-JDBC(java config方式)实现分库分表(水平拆分)

♀尐吖头ヾ 提交于 2020-08-05 07:51:53
一、概念先行 1)SQL相关的 逻辑表:水平拆分的数据库(表)的相同逻辑和数据结构表的总称。例:订单数据根据主键尾数拆分为2张表,分别是t_order_0到t_order_1,他们的逻辑表名为t_order。 真实表:在分片的数据库中真实存在的物理表。例:示例中的t_order_0到t_order_1 数据节点:数据分片的最小单元。由数据源名称和数据表组成,例:ds_0.t_order_0;ds_0.t_order_1; 绑定表:指分片规则一致的主表和子表。例如:t_order表和t_order_item表,均按照order_id分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。 广播表:指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表,示例中的t 2)分片相关 分片键:用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。 SQL中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,ShardingSphere也支持根据多个字段进行分片。 分片算法:通过分片算法将数据分片,支持通过=、>=、<=、>、<、BETWEEN和IN分片

Mybatis之BatchExecutor.doUpdate返回Integer.MIN_VALUE + 1002

北城余情 提交于 2020-08-05 05:20:58
Mybatis版本是3.4.4 之前没注意,但是一个偶然机会发现BatchExecutor.doUpdate方法返回一个固定值Integer.MIN_VALUE + 1002,即源码中的org.apache.ibatis.executor.BatchExecutor#BATCH_UPDATE_RETURN_VALUE,为什么返回这个值而不是返回-1或其它? 本着对技术的好奇心搜了下Google,得到如下图1 图1 觉得不过瘾,感觉还是没有解决疑惑,为什么不返回Integer.MIN_VALUE呢,为什么要加上个1002?  所以我又给mybatis提了个 issue 问这个,但是得到的结果还是图1中的邮件内容,好吧! 图1中Eduardo是mybatis的作者之一,有兴趣的可以去github上搜他。从邮件内容可以看出,因为批量更新无法得知更新了多少条记录,作者想要个负数,接近于负无穷的数,所以猜测当时写了Integer.MIN_VALUE + 1002这个固定值,但是为什么不返回Integer.MIN_VALUE呢,对吧,相比较之下,难道Integer.MIN_VALUE不是更接近与负无穷么,不得而知了,也许1002是他的Luck number呢,哈哈,天知...... 来源: oschina 链接: https://my.oschina.net/u/2518341/blog

Python元类实战,通过元类实现数据库ORM框架

牧云@^-^@ 提交于 2020-08-04 19:02:51
云栖号资讯:【 点击查看更多行业资讯 】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 本文主要是受到了廖雪峰老师Python3入门教程的启发,不过廖老师的博客有些精简,一些小白可能看起来比较吃力。我在他的基础上做了一些补充和注释,尽量写得浅显一些。 ORM框架是什么 如果是没有做过后端的小伙伴上来估计会有点蒙,这个ORM框架究竟是什么?ORM框架是后端工程师常用的一个框架,它的英文全称是Object Relational Mapping,即对象-关系映射框架。顾名思义就是把关系转化成对象的框架,关系这个词我们在哪里用的最多呢? 显然应该是数据库。之前我们在分布式的文章介绍关系型数据库和非关系型数据库的时候就着重介绍过关系的含义。我们常用的MySQL就是经典的关系型数据库,它存储的形式是表,但是表承载的数据其实是两个实体之间的"关系"。比如学生上课这个场景,学生和课程是两个主体(entity),我们要记录的是这两个主体之间的关系,也就是学生上课这件事。 而ORM框架做的事情是将这些关系映射成类,这样我们可以将这张表当中增删改查的功能抽象成类当中的方法。这样我们就可以通过调用类的方式来操作数据库了,从而达到高度抽象业务逻辑、降低用户使用难度的目的。 比如Java后端工程师常用的hibernate和ibatis都是用来做这件事情的,明确了框架的功能之后

Caused by: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which i...

亡梦爱人 提交于 2020-07-29 05:41:54
今天发现一个小细节,没注意就会报错,在xml中自定义sql语句时,里面不能有注释过得sql,简单的说就是:假如第一次写的sql是select * from table,但是在后面发现要写错了,那么只能把之前这一条删除掉,不能注释,如果注释就会报错,当然,这只是一个小错误而已,一般人可能不会犯.... Caused by: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='spuId', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #2 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration

第1章 MyBatis简介

China☆狼群 提交于 2020-07-25 06:35:58
MyBatis介绍 MyBatis是支持 定制化SQL 、存储过程以及高级映射的优秀的 持久层框架 。 MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。 MyBatis可以使用简单的 XML 或 注解 用于配置和原始映射,将 接口和Java的POJO 映射成数据库中的记录。 推荐使用XML而不是注解。 MyBatis历史 原是Apache的一个开源项目iBatis。 2010年6月这个项目由Apache Software Foundation迁移到了Google Code,随着开发团队转投Google Code 旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBatis一词来源于“internet”和“abatis”的组合,是一个 基于Java的持久层框架 。iBatis提供的持久层框架包括SQL Maps和DAO。 为何要用MyBatis MyBatis是一个 半自动化 的持久化层框架。 JDBC SQL夹在Java代码块里,耦合度高导致硬编码内伤。 维护不易且实际开发需求中SQL是有变化,频繁修改的情况很常见。 Hibernate和JPA 长难复杂SQL,对于Hibernate而言处理也不容易。 内部自动生产的SQL,不容易做特殊优化。 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。

Intermittent Java PostgreSQL Connection closed

拟墨画扇 提交于 2020-07-22 12:22:43
问题 My Java program connects using ibatis to a PostgreSQL DB server. Most of the time, the connection is fine. However, sometimes the connection takes very long and then I get an exception stating that the connection has been closed, although I have not closed it at all. Yet later on my program still can access the DB server normally. The stack trace is here. Caused by: org.postgresql.util.PSQLException: This connection has been closed. at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed

Performance comparison between mybaits Batch ExecutorType and for_each Xml

人盡茶涼 提交于 2020-06-01 07:22:46
问题 I have a list of records to be inserted into DB using my baits. Previously, my code is something like: for(Item item : items){ sqlSession.insert("insert", item); } Using this method works but I find there is dynamical incremental DiskIO at Mysql server, due to number of items. As I have little access to MySql configuration, and hope to resolve this high disk io issue, I find some possible solutions: using ExecutorType.BATCH for sqlSession insert multiple values within a single insert