MyBatis

mybatis-sql builder class

有些话、适合烂在心里 提交于 2020-03-02 07:23:22
在拼接sql的时候,经常遇到字符串写的太长无法辨别的情况 String sql = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, " "P.LAST_NAME,P.CREATED_ON, P.UPDATED_ON " + "FROM PERSON P, ACCOUNT A " + "INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID " + "INNER JOIN COMPANY C on D.COMPANY_ID = C.ID " + "WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) " + "OR (P.LAST_NAME like ?) " + "GROUP BY P.ID " + "HAVING (P.LAST_NAME like ?) " + "OR (P.FIRST_NAME like ?) " + "ORDER BY P.ID, P.FULL_NAME"; mybatis3中通过SQLclass使得代码更整洁 private String selectPersonSql() { return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");

mybatis 基础支持层解析文件

[亡魂溺海] 提交于 2020-03-02 05:26:25
在初始化过程中处理mybatis-config.xml配置文件中,使用DOM解析,并结合XPath解析XML配置文件。 上面三个接口是jdk中的,mybatis封装了它们。 XMLMapperEntityResolver 实现了 EntityResolver 用作离线加载DTD文档即如下所示的 避免联网加载导致缓慢 其中的resolveEntity方法入参解释如下: DTD声明始终以!DOCTYPE开头,空一格后跟着文档根元素的名称,如果是内部DTD,则再空一格出现[],在中括号中是文档类型定义的内容. 而对于外部DTD,则又分为私有DTD与公共DTD,私有DTD使用SYSTEM表示,接着是外部DTD的URL. 而公共DTD则使用PUBLIC,接着是DTD公共名称,接着是DTD的URL doctype 属性可返回与文档相关的文档类型声明(Document Type Declaration)。 systemId: 外部资源(多半是DTD)的URI,比如本地文件file:///usr/share/dtd/somefile.dtd或者网络某个地址的文件http://www.w3.org/somefile.dtd; publicId: systemId已经可以表示任何位置的外部DTD资源了,但是它是直接指向相应的资源,publicId的作用在于其间接性。 publicID就相当于一个名字

MyBatis 实践 -Mapper与DAO

╄→гoц情女王★ 提交于 2020-03-02 05:14:12
MyBatis 实践 标签: Java与存储 MyBatis简介 MyBatis 前身是 iBatis ,是一个基于Java的 数据持久层/对象关系映射(ORM)框架 . MyBatis是对JDBC的封装,使开发人员只需关注SQL本身,而不需花费过多的精力去处理如 注册驱动 、 设置参数 、 创建 Connection / Statement 、 解析结果集 等JDBC过程性代码.MyBatis基于XML/注解的方式配置 Statement ,执行SQL,并将执行结果映射成Java对象, 大大降低了数据库开发的难度. MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs

Mybatis(三)返回值四.注解配置

你。 提交于 2020-03-02 04:57:23
一. Mybatis 返回值    MyBatis 中在查询进行 select 映射的时候,返回类型可以用 resultType ,也可以用 resultMap , resultType 是直接表示返回类型的,而 resultMap 则是对外部 ResultMap 的引用,但是 resultType 跟 resultMap 不能同时存在。    在 MyBatis 进行查询映射时,其实查询出来的每一个属性都是放在一个对应的 Map 里面的,其中键是属性名,值则是其对应的值。    ①当提供的返回类型属性是 resultType 时, MyBatis 会将 Map 里面的键值对取出赋给 resultType 所指定的对象对应的属性。其实 MyBatis 的每一个查询映射的返回类型都是 ResultMap ,只是当提供的返回类型属性 resultType 的时候, MyBatis 自动的给对应的值赋给 resultType 所指定对象的属性。    ②当提供的返回类型是 resultMap 时,因为 Map 不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用 ( association,Collection),    <resultMap type="com.softjx.model.User" id="UserMap"> <result

mybatis 返回值类型是Map

你离开我真会死。 提交于 2020-03-02 04:53:10
<select id="selectByMemberKey" resultType="java.util.HashMap"> SELECT member_id ,expire FROM member_key_make_up WHERE member_key = #{memberKey,jdbcType=VARCHAR} </select> public interface MemberKeyMakeUpMapper { HashMap<String,Object> selectByMemberKey(@Param("memberKey")String memberKey); } private Long mackUpKeyGet(String memberKey) { HashMap<String, Object> map = memberKeyMakeUpMapper.selectByMemberKey(memberKey); if (map == null || map.get("MEMBER_ID") == null || map.get("EXPIRE").toString() == null) { return null; } Long memberId = Long.valueOf(map.get("MEMBER_ID").toString()); Long

使用 Mybatis 中 # 与 $ 区别

纵饮孤独 提交于 2020-03-02 03:49:04
mybatis 框架使用好处之一就是可以动态的改变 sq l语句,而动态的 sql 语法 #{ } 和 ${ } 则有所不同。 #:因为mybatis是基于 jdbc 封装的,# 解析为 jdbc 预编译(preparedstatement)的参数标记符,一个 #{} 解析成一个参数占位符。 $:是字符串的替换,在动态 sql 解析阶段会进行变量替换。 注意平时优先使用 #{},因为使用 ${} 会引起 sql 注入。 因为在 mybatis 在处理 # 时,会调用 PreparedStatement 的 set 系列方法来赋值, 并且可以安全地设置参数(=?)的值。因为 sql 语句已经预编译好了,传入参数的时候,不会重新生产 sql 语句,安全性高。处理 $ 时,就是把 ${} 替换成变量的值。 例:select * from emp where ename = '用户名',如果使用 $ 入参,用户名被传入例如 ‘smith or 1 = 1’,那无论 ename 是否匹配都能查到结果。 注意: 如果在特定场景下,使用诸如 order by ${ param },这时候就可以使用 $ 总之使用 #{} 可以有效的防止 SQL 注入,提高系统安全性。 水平有限,若有问题请留言交流! 互相学习,共同进步:) 转载请注明出处谢谢! 来源: oschina 链接: https://my

Mybatis Sql语句#{},和 ${}传参的区别

淺唱寂寞╮ 提交于 2020-03-02 03:36:45
#{},和 ${}传参的区别如下: 使用#传入参数时,sql语句解析是会加上"",当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果你传入的参数为 单引号',那么如果使用${}这种方式会报错 另外一种场景是,如果要做动态的排序,比如 order by column,这个时候务必要用${} select * from table order by 'name' ,这样是没用 目前来看,能用#就不要用$。 但是${}在什么情况下使用呢? 有时候可能需要直接插入一个不做任何修改的字符串到SQL语句中。这时候应该使用${}语法。 比如,动态SQL中的字段名,如:ORDER BY ${columnName} (动态排序还可以使用<if> <choose> 等判断语句来区别处理代替传参方式) #{}在预处理时会把参数部分用一个占位符:? 代替,eg:select * from user where id = ?; ${}只是简单的字符串拼接,在动态解析阶段就直接拼接成了最终的sql语句:select * from user where id = 1; 来源: oschina 链接: https://my.oschina.net/u/3553440/blog/1543348

Intellij IDEA 14 安装之后

可紊 提交于 2020-03-02 02:54:51
####Intellij IDEA 14 安装之后 设置IDEA的字体 File -> Settings -> Appearance & Behavior -> Appearance -> 勾选Override default fonts by -> Name下拉框选择字体(文泉驿微米黑/SansSerif) 设置显示内存使用情况 File -> Settings -> Appearance & Behavior -> Appearance -> 勾选Show memory indicator 设置主题风格 File -> Settings -> Appearance & Behavior -> Appearance -> 下拉Theme选择Darcula 设置光标位于行后(14版本默认已经是了) File -> Settings -> Editor -> General -> 去掉勾选Allow placement of caret after end of line 设置显示代码行数和方法线 File -> Settings -> Editor -> General -> Appearance Show line numbers 勾选 SHow method separators 勾选 设置Tab显示多行和Tab个数 File -> Settings -> Editor ->

深入源码分析-线程池的实现原理

人盡茶涼 提交于 2020-03-02 02:38:40
本文主要来介绍一下其中比较简单的线程池的实现原理,希望读者们可以举一反三,通过对线程池的理解,学习并掌握所有编程中池化技术的底层原理。 创建一个线程 在Java的并发编程中,线程是十分重要的,在Java中,创建一个线程比较简单: public class App { public static void main(String[] args) throws Exception { new Thread(new Runnable() { @Override public void run() { System.out.println("线程运行中"); } }).start(); } } 我们通过创建一个线程对象,并且实现Runnable接口就可以实现一个简单的线程。可以利用上多核CPU。当一个任务结束,当前线程就接收。 但很多时候,我们不止会执行一个任务。 如果每次都是如此的创建线程->执行任务->销毁线程,会造成很大的性能开销。 那能否一个线程创建后,执行完一个任务后,又去执行另一个任务,而不是销毁。这就是线程池。 这也就是池化技术的思想,通过预先创建好多个线程,放在池中,这样可以在需要使用线程的时候直接获取,避免多次重复创建、销毁带来的开销。 线程池的简单使用 以下代码,是在Java中创建线程池: import java.util.concurrent.*; public

MyBatis和Druid查询属性LocalDateTime报错

时光毁灭记忆、已成空白 提交于 2020-03-02 01:24:13
问题 技术栈版本号: mybatis:3.5.1 druid:1.1.12 JDK:1.8 产生原因 对象的属性使用新的日期函数定义。JDK8之前的Date似乎被隔离了,JDK8新的时间日期API,开始一个新的纪元,谁用谁知道。 class AccountTbl { var id: Int? = null var userId: String? = null var money: Int? = null var tranDate: LocalDateTime? = null } 问题解决 程序跑出的异常为 SQLFeatureNotSupportedException ,异常是druid,90%应该是druid的问题。分析项目涉及ORM框架的版本号 druid1.1.12,mybatis3.5.1。 渐入渐出了下代码的执行流程。 ResultSetHandler 是Mybatis的核心组件,主要负责将结果集resultSets转化成结果列表(或cursor)和处理储存过程的输出。 DefaultResultSetHandler是Myabtis为ResultSetHandler提供的唯一一个实现类,最终的流程都会走到 getPropertyMappingValue ,进行实体属性和JavaBean属性的映射。 TypeHandler是MyBatis中的类型转换器