在项目中,使用的是mybatis305,但没有采用其提供的DAO层接口映射的策略,而且在进行多种属性联合查找时,需要底层提供通用的解决方案,所以需要mybatis直接执行sql语句,各个daoImpl均可调用,减少了在每个mybatis文件中配置符合当前对象的select查询。。
(在mybatis中,需要通过传递对象,在select中判断对象属性是否为空进行where语句的拼凑,对后期的维护工作带来不小的考验,所以采用直接执行sql策略)
先说一说配置时,遇到的异常:
Xml代码
<select id="findRecords" parameterType="String" resultMap="orderTypeResultMap">
${sql}
</select>
这样配置时,会出现:there no getter sql in JavalangString 的异常
所以考虑:用一个适配器,将sql作为属性加入其中
首先:
Xml代码
<typeAlias alias="sqladapter" type="comzjlogisticsutilSQLAdapter" />
其次:
Java代码
public class SQLAdapter {
String sql;
public SQLAdapter(String sql) {
thissql = sql;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
thissql = sql;
}
}
最后:
Xml代码
<select id="findRecords" parameterType="SQLAdapter" resultMap="orderTypeResultMap">
${sql}
</select>
注意,不要忘记在调用该select方法时,用new SqlAdapter("自己写的sql语句")作为参数哦。。。
搞定。。
真能折腾人的,这个直接写 value 不就可以了?
<select id="findRecords" parameterType="String" resultMap="orderTypeResultMap">
${value}
</select>
解决方法:如果确认是单条数据,可以直接 Object (); 。没有封装成对象时,默认返回的是List<Map<字段名称String,列值Object>>这样的数据。Dao接口:
List<Map<String,Object>> list(Integer id);
SQL:
<select id="list" parameterType="Integer" resultType="Map">。
拓展:
1、MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(sDAO)。
2、MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
如何MyBatis中使用动态SQL查询与注释
静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。静态SQL在编译时已经确定了引用的表和列。 宿主变量不改变表和列信息。 可以使用主变量改变查询参数值, 但是不能用主变量代替表名或列名。
动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,不在编译时确定 SQL 的表和列,而是让程序在运行时提供,并将SQL 语句文本传给 DBMS 执行。 静态 SQL 语句在编译时已经生成执行计划。 而动态 SQL 语句,只有在执行时才产生执行计划。动态 SQL 语句首先执行 PREPARE 语句要求 DBMS 分析、确认和优化语句,并为其生成执行计划。例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。
在service中把参数放到HashMap中
List list = new ArrayList();
listadd("x");
listadd("y");
listadd("z");
String s = "A"
Date d = new Date();
HashMap param = new HashMap();
paramput("list",list);
paramput("s",s);
paramput("d",d);
XXXDaoqueryXXX(param);
在Mybatis的Mapper中是这么写:
select from tab where zi_duan1 = #{s} and zi_duan2 = #{d}
and zi_duan3 in
<foreach item="item" index="index" collection="list" open="("
separator="," close=")">
#{item}
select t1 from tb_vocation_category t1,tb_vocation_category t2 where t1vocation_category_id = t2vocation_category_parent_id(+)
以上就是关于怎么获取mybatis运行的sql语句全部的内容,包括:怎么获取mybatis运行的sql语句、mybatis 查询数据库返回值某字段是 List 该怎么搞、如何MyBatis中使用动态SQL查询与注释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)