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. Gym - 100801H Hash Code Hacker (构造)

    题意:求 n 个哈希值相同的串. 析:直接构造,通过取模来查找相同的串. 代码如下: #pragma comment(linker, "/STACK:1024000000,102400000 ...

  2. C++ 无边框的拖动窗口代码

    按下鼠标时,记录下鼠标在窗体上的坐标, 同时用一个BOOL变量记录下鼠标左键按下的状态 弹起左键,则记录状态的布尔变量为FALSE. 处理鼠标移动事件,如果左键同时按下,则为鼠标拖动窗体运动,设置窗体 ...

  3. 软件工程作业——Word Counter

    github地址 https://github.com/Pryriat/Word_Counter 项目说明 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命 ...

  4. LeetCode: 598 Range Addition II(easy)

    题目: Given an m * n matrix M initialized with all 0's and several update operations. Operations are r ...

  5. C++11/14的新特性——更简洁

      新的字符串表示方式——原生字符串(Raw String Literals) C/C++中提供了字符串,字符串的转义序列,给输出带来了很多不变,如果需要原生义的时候,需要反转义,比较麻烦. C++提 ...

  6. Pycharm 设置TextStyle

    之前在脚本中选择了一个字符串, PyCharm会"高亮"所有相同的字符串, 但是我不满意这个"高亮"的颜色,因为和背景色太相似了,所以需要做一下操作,修改这个& ...

  7. spring框架_AOP和注解

    1.什么是AOP :全称是Aspect Oriented Programming即:面向切面编程. 简单来说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础 ...

  8. Codeforces Round #562 (Div. 2) C. Increasing by Modulo

    链接:https://codeforces.com/contest/1169/problem/C 题意: Toad Zitz has an array of integers, each intege ...

  9. Redis 基础特性讲解

    目录 1.Redis基础杂项小节 1.是什么 2.能干嘛 3.去哪下 4.Redis启动后基础知识讲解 2.Redis数据类型 1.常用的五大数据类型 2.高级'玩家'才知道的其他数据类型 3.Red ...

  10. Java中的构造函数——通过示例学习Java编程(14)

      作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=25 构造函数是用来初始化新创建的对象的代码块. ...