Mybatis的若干问题总结
1.配置文件
1.mybatis配置:https://mybatis.org/mybatis-3/zh/configuration.html
2.传入变量
1 | SELECT * FROM realtime where RecordTime BETWEEN ${startdate} AND ${enddate} |
#和$的区别
1.#是把传入的数据当作字符串,如#field#传入的是id,则sql语句生成是这样,order by “id”,这当然会报错..
2.$传入的数据直接生成在sql里,如$field$传入的是id,则sql语句生成是这样,order by id, 这就对了.
3.#方式能够很大程度防止sql注入.
4.$方式无法防止sql注入.
5.$方式一般用于传入数据库对象.例如传入表名.
6.一般能用#的就别用$.
1.mybatis中的变量#与$:https://www.cnblogs.com/duanxz/p/3745284.html
2.配置:https://mybatis.org/mybatis-3/zh/configuration.html
3.动态生成sql语句
需求来源于在一张表中查找id号符合多个值的记录,id可能是一个也可能是两个,我能想到的就是使用in操作符,id in (1,2,3,4)。那么如何传入这个(1,2,3,4)呢?官网给的例子如下:
1 | <select id="selectPostIn" resultType="domain.blog.Post"> |
其中list为我们需要传入的List
1 | /* |
java端mapper代码:
1 | // 根据开始时间和结束时间以及站点列表查询历史记录 |
1.How to pass an Integer Array to IN clause in MyBatis
2.How to use Annotations with iBatis (myBatis) for an IN query?
3.动态 SQL
4.Mybatis 示例之 foreach (上)
5.MYBATIS - Dynamic SQL
4.打印输出日志
只需要在application.yml中添加,其中com.bibichuan.bigdata.mapper是我mapper的包路径
1 | logging: |
5.返回值
(1) 如下语句,我只返回了max(InsFlux),min(InsFlux),这两个字段。
1 |
|
如果使用List返回值,我觉得是不是大材小用了。
1 | List<Object[]> getMaxMinInsFlux(String startdate,String enddate); |
注意
resultType="返回结果类型",一般把结果映射到对应的JAVAbean,select 返回的每一条记录的类型,而不是所有记录组成的类型。
也就是说,resultType的类型,是把sql语句返回的每一行映射成什么类型。比如:
1 | resultType="com.bibichuan.bigdata.Entity.RealTime" |
即把select 返回的每一行都映射为一个RealTime类型。
(2) 参考文章1中,我们还可以找到两种方式将返回值包装成map,第一种就是直接返回的结果是[key1=value1,key2=value2...]
这种形式,另一种是把结果封装成{key=object [id=1, name=Bob, age=15.0]},也就是关键字可以指定,而值是一个对象,类似于Map<String,Object>
这种形式。
第一种直接指定resultType=”Map”,第二种指定resultType=”你自己定义的JavaBean”,然后在mapper的interface接口中,通过@MapKey(“关键字”),例如参考文章中,指定了name作为返回的Map中的key:
1 | public interface UserDao { |
(3) 其他类型的返回值
1 | public interface AuthorMapper { |
1.Mybatis把返回结果封装成map类型
2.深入了解MyBatis返回值
3.mybatis查询结果集,返回List的对象集合
4.在spring中使用MyBatis将两列数据以map的形式返回
5.MyBatis Java API
6.java.lang.UnsupportedOperationException
主要是返回值的问题。
1 | <!--出现错误--> |
使用map类型,即可返回正确的内容。
1.mybatis报错java.lang.UnsupportedOperationException原因及处理方法
2.用mybatis映射SQL语句的时候出现异常 java.lang.UnsupportedOperationException
7.无法获取数据类型为text的值
数据库中的一个字段是text类型,但是使用java总是获取不到其中的值。参考资料中,大部分是说,有WithBLOBs方法等,自动生成等。
解决方法是编写一个resultMap,比如我的实体类是SiteInfo,我将数据库中属性为extra_settings的字段映射为VARCHAR类型就可以了。
1 |
|
1.Mybatis中逆向工程无法查询到类型为text的数据
2.MyBatis Generator 配置文件详解 之 table 元素
3.关于mybatis中获取message字段(字段类型为text)一直为null的解决方法
4.Mybatis的generator生成WithBLOBS.java文件原因及解决
5.Mybatis自动生成的Xml文件,text数据类型会默认产生XXWithBlobs的方法,用以获取含有该类型的数据
6.mybatis generator无法将数据表中text字段映射问题
7.使用MyBatis操作 数据库text类型时 有“坑”!
8.返回list
需求就是使用sql返回多条数据,但是我不想再增加一个实体类,可以分为如下几步:
1.xml中使用 HashMap 作为返回值
1 | <select id="getSiteInfo" resultType="java.util.HashMap"> |
2.mapper中的代码,使用list进行返回
1 | List<Map<String,Object>> getSiteInfo(; List<Integer> site_list) |
3.可以将返回的值进行遍历,也可以通过键获取数据内容
1 | List<Map<String,Object>> siteinfos=vRealTimeService.getSiteInfo(sitelist); |
1.Mybatis返回Map,List