这几天在公司做项目,到了收尾的阶段,但是发现自己在使用mybatis的时候给自己留下了很多的坑,于是乎花了两天的时间来调试和重新构思自己写下的mapper.xml文件,总算是有些收获,在这里分享给大家。
mapper.xml是mybatis中的重要的组成部分,也算是核心之一,我们可以看到的就是他是由一些定义好的查询数据库的语句和一些xml规范定义好的。我们在使用mybatis的时候可以看到,在这里mapper文件相当于是一个dao层接口的实现,因为mapper中定义的查询,id都必须要和dao层的方法是一致的,这样才可以进行查询。这里最能体现mybatis特点的就是这个mapper配置文件了,因为mybatis能从里面的内容读取映射,生成sql语句进行查询。
二、mapper的写法和注意事项
我们的mapper有很多种使用方法,这里简要说明与总结一下:
(1)、直接当做sql语句使用
我们可以使用mapper中的
(2)、加判断的条件查询语句
在mapper中,我们可以对条件加上应有的判断,来进行一些分条件的查询,尤其是在where子句中,这里注意的是,使用判断,也就是if也是一个标签为
AND t_acceptanceform.acceptancestate!='0'
AND t_acceptanceform.acceptancestate =#{state}
(3)、增加一些变量集合,用于查询或者返回值
这里所指的变量集合其实是两种,一种是map类型的集合,一种是sql中自定义查询字段集合,我们在做返回值还有mybatis自动生成的代码中常见的就是这种map集合,一般叫做resultmap,他是可以和pojo等类型的实体类进行对应的,用于对于查询返回值的接收和发送,可以被mybatis机制自动转换为一些List集合或者其他的集合之类的东西。
格式:
第二个是
outputrepositorycode,
outdate,
consignee,
ordersno,
repocode,
transferpath,
acceptanceformcode,
address,
totalproducts,
createtime,
batchcount,
comments,
customerid,
pitposition
and ${criterion.condition}
and ${criterion.condition} #{criterion.value}
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
and ${criterion.condition}
#{listItem}
三、传值的注意
我们都知道,在mapper中写查询的时候,我们都会用到一些查询条件和传入变量进行关联的事情,一般这种都用的是#{变量名}或者是${变量名}来做取值,那么他们到底有什么区别呢?
1、#{param}会产生PreparedStatement,并且可以安全地设置参数(=?)的值。以为sql语句已经预编译好了,传入参数的时候,不会重新生产sql语句。安全性高。
2、${parem}则直接将{}号中的param插入字符串,会产生sql注入的问题:
例如:select * from userwhere userName= ${userName}
输出的结果为
select * from userwhere userName= “小明”
3、在特定场景下,例如如果在使用诸如order by '{param}',这时候就可以使用${}
4、#{}方式能够很大程度防止sql注入,${}方式无法防止sql注入
5、${}方式一般用于传入数据库对象,例如传入表名
字符串替换:
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。
重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
这里一定要注意的是,可以用#{param}的时候尽量不要用${param}。