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. You have configured this virtual machine to use a 64-bit guest operating system. However, 64-bit

    vm虚拟机 问题:You have configured this virtual machine to use a 64-bit guest operating system.  However, ...

  2. POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)

    Sumdiv Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  3. C#Timer停不住

    System.Timers.Timer timer1 = new System.Timers.Timer(); timer1.Interval = ; //1天循环一次 timer1.Elapsed ...

  4. 死磕 java同步系列之JMM(Java Memory Model)

    简介 Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果. 硬件内存模型 在正式讲解Java的内存模 ...

  5. 剑指Offer的学习笔记(C#篇)-- 二叉树的深度(详讲递归)

    题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 一 . 思维发散 借助这个题目,我想用一个更好理解的方法说一说递归. ...

  6. video,audio用法小例子

    用此小程序设计播放/暂停,放大缩小 <!DOCTYPE html> <html> <body> <div style="text-align:cen ...

  7. 用户登录之记住密码 Cookie实现

  8. redis之进阶

    redis之进阶   redis redis介绍 redis的功能特性 1,高速读写 2,数据类型丰富 3,支持持久化 4,多种内存分配及回收策略 5,支持事务 6,消息队列.redis用的多的还是发 ...

  9. [Java]HashMap实现与哈希冲突,与HashTable的区别

    对于 Map ,最直观就是理解就是键值对,映射,key-value 形式.一个映射不能包含重复的键,一个键只能有一个值.平常我们使用的时候,最常用的无非就是 HashMap. HashMap 实现了 ...

  10. Uva1377

    /* 在n个刻度和他们的差里挑不超过7个刻度,0是固定的,最大的刻度肯定是最大值,然后剩下的dfs挑. */ #include<bits/stdc++.h> #define inf 0x3 ...