MyBatis

Mybatis原理之数据源和连接池

落爺英雄遲暮 提交于 2020-02-28 06:08:31
在Java工程项目中,我们常会用到 Mybatis 框架对数据库中的数据进行增删查改,其原理就是对 JDBC 做了一层封装,并优化数据源的连接。 ​ 我们先来回顾下 JDBC 操作数据库的过程。 JDBC 操作数据库 JDBC 操作数据库的时候需要指定 连接类型、加载驱动、建立连接、最终执行 SQL 语句,代码如下: public static final String url = "jdbc:mysql://127.0.0.1/somedb"; public static final String name = "com.mysql.jdbc.Driver"; public static final String user = "root"; public static final String password = "root"; public Connection conn = null; public PreparedStatement pst = null; public DBHelper(String sql) { try { //指定连接类型 Class.forName(name); //建立连接 conn = DriverManager.getConnection(url, user, password); //准备执行语句 pst = conn

Java互联网高级架构师高级进阶实战

非 Y 不嫁゛ 提交于 2020-02-28 05:53:01
01、开学典礼_为什么要从设计模式开始及工厂模式详解 02、单例模式详解 03、代理模式 04、委派模式和策略模式 05、模板模式和适配器模式 06、装饰者模式和观察者模式 07、各设计模式总结与对比 08、Spring框架的前世今生已经源码构建 09、用300行代码手写提炼Spring的核心原理 10、用300行代码手写提炼Spring的核心原理补充 11、一步一步手绘Spring运行时序图(1) 12、19一步一步手绘spring DI运行时序图 13、一步一步手绘spring AOP时序图 14、一步一步手绘springMVC运行时序图 15、用30个类高仿真提炼纯手写Spring框架V2.0(1) 16、用30个类高仿真提炼纯手写Spring框架V2.0(2) 17、用30个类高仿真提炼纯手写Spring框架V2.0之MVC 18、用30个类高仿真提炼纯手写Spring框架V2.0之AOP 19、Spring事务传播原理及数据库事务操作原理 20、基于SpringJDBC手写定制自己的ORM框架 21、Spring5新特性简述及经典的高频面试题分析 22、Mybatis应用分析与最佳实践 23、Mybatis体系结构与工作原理 24、Mybatis插件原理及Spring集成 25、手写自己的Mybatis框架 26、初步认识多线程的发展及使用 27、多线程的原理分析(1)

mybatis 批量新增 orcale带序列

大城市里の小女人 提交于 2020-02-28 03:46:13
以前用的是MySQL,现在公司用orcale,差别在于orcale表id 不是主键自增的,而是用序列,网上搜到的几种xml写法都用不了,后来copy朋友写的xml改了下就能使用了,现分享如下,希望能帮助到大家 <insert id="insertRoleFunction" parameterType="java.util.List"> insert into CAF_ROLEFUNCTION ( ID, FUNCTION_ID, ROLE_ID) select SEQ_CAF_ROLE_FUNCTION.Nextval, A.* FROM ( <foreach collection="list" item="item" index="index" separator="UNION ALL"> <![CDATA[ SELECT #{item.functionId,jdbcType=DECIMAL}, #{item.roleId,jdbcType=DECIMAL} FROM dual ]]> </foreach> ) A </insert> 记得要加上 <![CDATA[]]> 传入的是list,list中有多个RoleFunctionEo对象 Mapper.java代码如下 void insertRoleFunction(List<RoleFunctionEo> list);

[置顶] mybatis的批量新增

南楼画角 提交于 2020-02-28 03:36:59
开发项目中,总是与数据打交道,有的时候将数据放入到一个集合中,然后在遍历集合一条一条的插入,感觉效率超不好,最近又碰到这个问题,插入50条数据用了将近1s,完全满足不了系统的需求.效率必须加快,然后网上查询资料,历经千万bug,终于搞定,这里指提供mybatis中的配置,至于dao层的调用mybatis就自己上网查询下资料吧 1根据网上搜了一下资料,在sql-mapper.xml文件中写了如下配置可进行批量操作 < insert id ="insertBatch" parameterType="List" > insert into REAL_DATA_HW( M_LINE_NO,M_TIME,HW_NUM, VOL_A,VOL_B,VOL_C ) values < foreach collection ="list" item ="item" index ="index" separator =","> ( #{obj.M_LINE_NO},to_date(#{obj.M_TIME},'yyyy-MM-dd hh24:mi:ss'),#{obj.HW_NUM}, #{obj.VOL_A},#{obj.VOL_B},#{obj.VOL_C} ) </ foreach > </ insert > 然后启动,调用这个操作的时候报错 Error setting null

Mybatis 持久化,持久层

时光怂恿深爱的人放手 提交于 2020-02-28 02:15:54
持久化 持久化是将程序数据在持久状态和瞬时状态间转换的机制。 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。 JDBC就是一种持久化机制。文件IO也是一种持久化机制。 在生活中 : 将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。 为什么需要持久化服务呢?那是由于内存本身的缺陷引起的 内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的是,人们还无法保证内存永不掉电。 内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。 持久层 什么是持久层? 完成持久化工作的代码块 . ----> dao层 【DAO (Data Access Object) 数据访问对象】 大多数情况下特别是企业级应用,数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种 关系数据库 来完成。 不过这里有一个字需要特别强调,也就是所谓的“层”。对于应用系统而言,数据持久功能大多是必不可少的组成部分。也就是说,我们的系统中,已经天然的具备了“持久层”概念?也许是

mybatis 动态SQL

吃可爱长大的小学妹 提交于 2020-02-28 02:15:32
动态SQL 官方文档 介绍 什么是动态SQL: 动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 官网描述: MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。 动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。 ------------------------------- - if - choose (when, otherwise) - trim (where, set) - foreach ------------------------------- ​ 我们之前写的 SQL 语句都比较简单,如果有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接

MyBatis:使用注解开发

杀马特。学长 韩版系。学妹 提交于 2020-02-28 02:07:51
面向接口编程 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了; 而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。 关于接口的理解 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。 接口的本身反映了系统设计人员对系统的抽象理解。 接口应有两类: 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class); 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface); 一个体有可能有多个抽象面。抽象体与抽象面是有区别的。 三个面向区别 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法 . 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现 . 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程

MyBatis:一对多、多对一处理

喜欢而已 提交于 2020-02-28 02:05:35
多对一的处理 多对一的理解: 多个学生对应一个老师 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 数据库设计 CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师'); CREATE TABLE `student` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `tid` INT(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fktid` (`tid`), CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1'); INSERT INTO `student`

Spring Boot 2.X(十九):集成 mybatis-plus 高效开发

痴心易碎 提交于 2020-02-28 02:03:57
前言 之前介绍了 SpringBoot 整合 Mybatis 实现数据库的增删改查操作,分别给出了 xml 和注解两种实现 mapper 接口的方式;虽然注解方式干掉了 xml 文件,但是使用起来并不优雅,本文将介绍 mybats-plus 的常用实例,简化常规的 CRUD 操作。 mybatis-plus MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 学习 mybatis-plus: https://mp.baomidou.com/guide 常用实例 1. 项目搭建 1.1 pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework

Mybatis中的update动态SQL语句

柔情痞子 提交于 2020-02-28 01:25:50
Mybatis中的CRUD操作(增删改查)中,简单的SQL操作比较直观,如查找操作: <select id="findBySrcId" resultMap="entityRelationResultMap"> SELECT * FROM ENTITY_RELATION WHERE SRC_ID=#{srcId} </select> 其中id对应同名java文件中的方法,resultMap对应的自定义的数据类型(当使用java自带类型就更容易了,比如java.lang.String之类的)。 但是涉及到更新操作时,可能不需要对所有字段更新,这时不需要更新的字段需要保持原字段信息,当使用以下信息就会报错: <update id="updateOne" parameterType="com.inspur.search.data.EntityRelation"> update ENTITY_RELATION SET SRC_ID=#{srcId},SRC_TYPE=#{srcType},DEST_ID=#{destId}, DEST_TYPE=#{destType},REL_TYPE=#{relType},STATUS=#{status},SN_ID=#{snId} where id=#{id} </update> 因为不更新的字段,会被传递null到SQL中,引起异常。