目录
通常一个mapper.XML对应一个DAO接口,DAO是否可以重载?
映射文件中A标签引用B标签,如果B标签在A的后面定义,可以吗?
mybatis和ORM
mybatis属于半orm,因为sql语句需要自己写。自己写sql语句的好处是,可以根据自己的需求,写出最优的sql语句。灵活性高。但是,由于是自己写sql语句,导致平台可移植性不高。mysql语句和Oracle语句不同
mybatis分页功能
方法1:
通过自己写SQL语句进行分页。limit
方法2:
mybatis使用RowBounds对象进行分页。
创建RowBounds对象,设置起始记录offset为第0条,查询条数limit为2条。从第0条开始,取两条数据
RowBounds rowBounds = new RowBounds(offset,limit);
方法3:
使用mybatis分页插件PageHelper
pom依赖
<!--
https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter
-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<artifactId>mybatis-spring-boot-starter</artifactId>
<groupId>org.mybatis.spring.boot</groupId>
</exclusion>
</exclusions>
</dependency>
使用 Page<> page = PageHelper.startPage(pageNum,pageSize);pageNum 页数,pageSize每页条数
会返回这样一套json数据,包括了 total 总条数 8条,开始页数2,每页条数2,从第几条开始取的3,到第几条结束的4,总页数4页,具体的数据 ,分页页码的数组也有了
以上为三种分页方式
#{} 和 ${}区别
最经典的问题了
#{}是预编译处理,像传进来的数据会加个" "(#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号),${}就是字符串替换。直接替换掉占位符。$方式一般用于传入数据库对象,例如传入表名.
使用${}的话会导致sql注入。什么是SQL注入呢?比如 select * from user where id = ${value}
value应该是一个数值吧。然后如果对方传过来的是 001 and name = tom。这样不就相当于多加了一个条件嘛?把SQL语句直接写进来了。如果是攻击性的语句呢?001;drop table user,直接把表给删了
所以为了防止SQL注入,能用#{}的不要去用 ${}
如果非要用${}的话,那要注意防止SQL注入问题,可以手动判定传入的变量,进行过滤,一般SQL注入会输入很长的一条SQL语句
接口绑定的几种方式
接口绑定有两种方式
1、使用注解,在接口的方法上面添加@Select@Update等注解,里面写上对应的SQL语句进行SQL语句的绑定。
2、通过映射文件xml方式进行绑定,指定xml映射文件中的namespace对应的接口的全路径名
什么时候用注解绑定?什么时候用xml绑定?
当SQL语句比较简单的时候,使用注解绑定就可以了,当SQL语句比较复杂的话,使用xml方式绑定,一般用xml方式绑定比较多
mybatis里的动态SQL语句,用的ognl语法
1、if
<select id="select"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
<