MyBatis归纳
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不用配置也行