SqlSessionTemplate详解

SqlSessionTemplate类是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。

SqlSessionTemplate类实现了SqlSession接口,它管理session的生命周期,包含必要的关闭,提交或回滚操作。

特别注意,SqlSessionTemplate类是线程安全的,可以被多个Dao所共享使用,而SqlSession是线程不安全的,不能被共享。因此SqlSession不能被设置成全局变量,自然也就不能被注入了(如果设为全局变量,那么相同应用程序中两个类之间的转换可能会引起数据一致性的问题。)

Junit4与Spring配合使用

使用以下两个注解:

@RunWith(SpringJUnit4ClassRunner.class)

更改测试运行器,让测试运行于Spring测试环境;(其实就是加载Spring配置文件,创建上下文)

@ContextConfiguration(locations={"classpath:com/hyq/spring.xml"})

用于指定要加载的spring配置文件的地址

如图所示:

通过以上两个注解,我们就无需手动加载spring配置文件以获取上下文了。

 

 

sql注入及解决方法

sql注入就是指用户输入的sql参数中包含单引号,使得原本的sql语句加上该参数组成了新的sql语句。

比如原来的sql语句是以下这一句:

select * from tbl_user2 where username like '%'+?+'%';

而用户输入'or',导致sql语句变成如下情况:

select * from tbl_user2 where username like '%' or '%';

解决办法:

字符串数据是用单引号包在外面的,如果插入的数据中包含单引号,就需要处理,你可以将单引号替换成两个单引号,在sql中连续两个单引号就表示一个单引号字符,例如

insert into yourTable(f1,f2) values(100,'ab''c')表示插入新记录f2字段为ab'c

使用函数replace可以实现这个功能:replace(yourStr,"'","''")

resultMap相关特性

1、如果用了association,那么从数据库中查询出来的字段全部都得设置映射,否则不会赋值;

如果没用association,那么与输出映射中的属性相同的字段会被自动映射,无需手动设置。

2、除了association关联的对象,如果其他属性与前一个查询出来的对象全都相同,那么就会被认为是同一个对象,那么查询出来的对象只会有1个。

如图所示,从数据库中查询出来的数据会有五条,所用的note都为"speed",由于我只配置了一个note映射,

所以实用resultMap查询出来的对象只有一个,这个对象是最后查询出来的那个,他把前面的都覆盖了。

3、resultMap中的id和result标签没什么区别;

动态SQL查询

使用SQL片段

foreach用法

 

foreach中的open中如果写了and并且是where后的第一个,where语句不会自动把and去掉,所以我们需要在if语句中写上and。

 

主键返回策略

 

last_insert_id()可以返回上一个添加数据的主键值;

UUID()可以生成一个字符串,以其作为主键;

别名定义

mapper映射文件加载方式

 

 

延迟加载

使用属性文件配置数据源

 

查询

一对多查询

extends代表继承其它resultMap

多对多查询

逆向工程

再附加一个逆向工程配置文件即可

常用函数

selectOne(“名称空间+方法名”,参数)

下同:

selectList()

insert()

delete()

update()

getMapper(UserMapper.class)

代码规范

将会话工厂配置为全局变量;

由于SqlSession是线程不安全的,所以要将其定义在方法体内,成为局部变量。

 

注意:

1、#{}是一个占位符,程序会自动转为字符串;

${},用于拼接sql语句,将接收到的输入参数不加任何修饰符拼接在sql中;但是使用${}拼接sql,可能会引起sql注入;

如果传入的参数是简单类型,那么${}中就只能使用value,即${value};

2、其实mapper映射文件与接口相配合时,mapper映射文件中的输入类型不写或写错了类型(但是这个类型在java中要找得到)都没事;

3、当传入的参数是map集合时,那么它的键可以直接当作属性使用;

MyBatis操作流程

获取session对象

MyBatis和Spring整合

1、在spring中配置数据源;

2、配置会话工厂,

3、整合mapper,无需用session去获取mapper接口,spring会自动创建,默认创建后的mapper的id名称为类名首字母小写,

突然发现sqlSessionFactoryBeanName不用配置也行

 

 

MyBatis归纳的更多相关文章

  1. MyBatis动态sql语句归纳

    1.删除数据(假删除)并修改时间 <!--根据id删除学生信息(多条)--> <update id="updateStuStatus" parameterType ...

  2. MyBatis与Spring整合

    1.单独使用MyBatis 单独使用MyBatis,不结合其他框架,主要步骤是: 1.创建SqlSessionFactory对象 创建方法是通过SqlSessionFactoryBuilder这个类从 ...

  3. mybatis笔记2 基础理论准备

    之前发了一篇mybatis的crud入门笔记,算是入门了,为了让功力加深一级,来研究下mybatis的理论知识,哈哈,以后好拿来跟技术经理吹吹牛- 按照问题来吧!个人觉得有自主意识,带着自己的问题来研 ...

  4. MyBatis极速入门开发手册(2017-2-6更新)

    前言: 本篇文章对我的学习内容做一个归纳梳理,同时也记录一些学习过程中遇上的问题及注意事项等等,可以帮助新入门的朋友们消除一些误区与盲区,希望能帮上一些正在学习的朋友们.在编写时会引用一些mybati ...

  5. Spring mybatis源码学习指引目录

    前言: 分析了很多方面的mybatis的源码以及与spring结合的源码,但是难免出现错综的现象,为了使源码陶冶更为有序化.清晰化,特作此随笔归纳下分析过的内容.博主也为mybatis官方提供过pul ...

  6. Spring + Mybatis 集成原理分析

    由于我之前是写在wizNote上的,迁移过来比较浪费时间,所以,这里我直接贴个图片,PDF文件我上传到百度云盘了,需要的可直接下载. 地址:https://pan.baidu.com/s/12ZJmw ...

  7. 日常报错记录2: MyBatis:DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.------------ Cause: java.lang.NoSuchMethodException: com.offcn.dao.ShopDao.<init>()

     直接上干货:  报错归纳1: DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4 ...

  8. 使用ThreadLocal管理Mybatis中SqlSession对象

    转自http://blog.csdn.net/qq_29227939/article/details/52029065 public class MybatisUtil { private stati ...

  9. spring-data-jpa与mybatis的对比

    Spring Data JPA 与 MyBatis对比 Spring Data JPA是Spring Data的子模块.使用Spring Data,使得基于“repositories”概念的JPA实现 ...

随机推荐

  1. DeleteDC ReleaseDC DeleteObject之间的区别

    DeleteDC 该函数删除指定的设备上下文环境(DC). 原型: BOOL DeleteDC(HDC hdc): 参数: hdc:设备上下文环境的句柄. 返回值: 成功,返回非零值:失败,返回零.调 ...

  2. JEECMS-新闻内容中遍历批量上传的图片

    [#list content.pictures as p] <li value="${p_index+1}"> <img src="${p.imgPat ...

  3. Django 开发拓展 auth 模块,注册用户时发生 ValueError: The given username must be set

    原因 使用局部钩子函数 _clean_fields() 对 username.email 字段进行验证时,未返回,具体请参考 _clean_fields() 函数源码. def clean_usern ...

  4. LeetCode: 669 Trim a Binary Search Tree(easy)

    题目: Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so th ...

  5. 数据库路由中间件MyCat - 源代码篇(11)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 4.配置模块 每个MyCatServer初始化时,会初始化: MyCatServer.java: publi ...

  6. Codeforces617E【莫队算法+前缀异或】

    题意: 给出一系列数,对每个查询区间,计算有多少个子区间异或为k. 思路: 可以先预处理异或前缀,一个区间[L,R]的异或值=sum[R]^sum[L-1]; 如果当前区间是[a,b],加一个右端点b ...

  7. 2015 Noip提高组 Day2

    P2678 跳石头 [题目背景] 一年一度的“跳石头”比赛又要开始了! [题目描述] 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和 ...

  8. MySQL 5.7 INFORMATION_SCHEMA 详解

    refman mysql 5.7 INFORMATION_SCHEMA提供了对数据库元数据的访问,MySQL服务器信息,如数据库或表的名称,列的数据类型,访问权限等. 有时也把这些信息叫做数据字典或系 ...

  9. IT兄弟连 JavaWeb教程 监听器4

    感知Session绑定事件的监听器 保存在Session域中的对象可以有多种状态:绑定(session.setAttribute("bean",Object)到Session中:从 ...

  10. oracle rownum(转)

    对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between……and,只能用以上符号(<.& lt;=.!=),并非说用>,>=,=,be ...