`

mybatis/ibatis直接执行sql语句

 
阅读更多

在项目中,使用的是mybatis3.0.5,但没有采用其提供的DAO层接口映射的策略,而且在进行多种属性联合查找时,需要底层提供通用的解决方案,所以需要mybatis直接执行sql语句,各个daoImpl均可调用,减少了在每个mybatis文件中配置符合当前对象的select查询。。

(在mybatis中,需要通过传递对象,在select中判断对象属性是否为空进行where语句的拼凑,对后期的维护工作带来不小的考验,所以采用直接执行sql策略)

先说一说配置时,遇到的异常:

 

 

<select id="findRecords" parameterType="String" resultMap="orderTypeResultMap">
	${sql}
</select>

 这样配置时,会出现:there no getter sql in java.lang.String 的异常

 

所以考虑:用一个适配器,将sql作为属性加入其中

首先:

 

<typeAlias alias="sqladapter" type="com.zj.logistics.util.SQLAdapter" />

 其次:

 

public class SQLAdapter {
	String sql;

	public SQLAdapter(String sql) {
		this.sql = sql;
	}

	public String getSql() {
		return sql;
	}

	public void setSql(String sql) {
		this.sql = sql;
	}
}

 最后:

 

<select id="findRecords" parameterType="SQLAdapter" resultMap="orderTypeResultMap">
	${sql}
</select>

注意,不要忘记在调用该select方法时,用new SqlAdapter("自己写的sql语句")作为参数哦。。。 

 

搞定。。

 

想更深入了解,请浏览   mybatis/ibatis直接执行sql语句后续

 

 

 

 

6
5
分享到:
评论
29 楼 xsldlm 2012-12-20  
真能折腾人的,这个直接写 value 不就可以了?

<select id="findRecords" parameterType="String" resultMap="orderTypeResultMap"> 
    ${value}
</select> 
28 楼 JustDone 2012-12-19  
这思路挺好
27 楼 J2EE大鸟 2012-12-18  
bingoohuang 写道
我自己实现了一个Esql, 比IBatis更加简单易用,不过在产品化上还差一步。
    public EsqlDemoBean selectBeanByBean(Object params) {
        return new Esql().selectFirst("selectByBean")
                .params(params)
                .returnType(EsqlDemoBean.class)
                .execute();
    }


[selectByBean]
SELECT A,B,C,D,E
FROM ESQL_TEST
WHERE A = #a#
AND C = #c#


示例代码在:https://github.com/AL-WUHC2/n3r-core/blob/master/src/test/java/org/n3r/esql/demo/EsqlDemo.java
示例SQL在:https://github.com/AL-WUHC2/n3r-core/blob/master/src/test/resources/org/n3r/esql/demo/EsqlDemo.esql

好的,有空研究下。。
26 楼 J2EE大鸟 2012-12-18  
kjj 写道
楼主,你还别说,你这个思路我还真觉得挺新颖的,我一直想用mybatis,但是xml里写sql还真有些蛋疼

这个问题我也是想了很久,除了必要的依赖对应关系以及查询条件不复杂的select写在了xml中,像 [where ... order by ... limit ... ] 还是自己维护比较方便。。另外,如果查询条件中有大于小于号,在xml中还得用转义符号。。
25 楼 bingoohuang 2012-12-18  
我自己实现了一个Esql, 比IBatis更加简单易用,不过在产品化上还差一步。
    public EsqlDemoBean selectBeanByBean(Object params) {
        return new Esql().selectFirst("selectByBean")
                .params(params)
                .returnType(EsqlDemoBean.class)
                .execute();
    }


[selectByBean]
SELECT A,B,C,D,E
FROM ESQL_TEST
WHERE A = #a#
AND C = #c#


示例代码在:https://github.com/AL-WUHC2/n3r-core/blob/master/src/test/java/org/n3r/esql/demo/EsqlDemo.java
示例SQL在:https://github.com/AL-WUHC2/n3r-core/blob/master/src/test/resources/org/n3r/esql/demo/EsqlDemo.esql
24 楼 kjj 2012-12-18  
楼主,你还别说,你这个思路我还真觉得挺新颖的,我一直想用mybatis,但是xml里写sql还真有些蛋疼
23 楼 J2EE大鸟 2012-12-18  
jixian3204 写道
${sql} 改成#{sql}呢?

那更不行啦。。
MyBatis看到 #{}会认为你在给sql中的变量赋值,就像JDBC编程中给问号赋值一样(比如MyBatis会判断它的类型,并自动在前后加单引号)。而当MyBatis看到${}的时候会直接将之替换成变量的值而不做任何处理。
22 楼 jixian3204 2012-12-18  
${sql} 改成#{sql}呢?
21 楼 J2EE大鸟 2012-12-18  
jixian3204 写道
<select id="findRecords" parameterType="String" resultMap="orderTypeResultMap">
${sql}
</select>
这样配置时,会出现:there no getter sql in java.lang.String 的异常
这是因为配置parameterType="String"有问题
parameterType后跟具体类名
或者是
org.apache.ibatis.type.TypeAliasRegistry中注册的类型,你应该写parameterType="string"才对。

你说的我也试过,也是不行的,同样还是抛there no getter sql in java.lang.String 的异常
20 楼 jixian3204 2012-12-18  
<select id="findRecords" parameterType="String" resultMap="orderTypeResultMap">
${sql}
</select>
这样配置时,会出现:there no getter sql in java.lang.String 的异常
这是因为配置parameterType="String"有问题
parameterType后跟具体类名
或者是
org.apache.ibatis.type.TypeAliasRegistry中注册的类型,你应该写parameterType="string"才对。
19 楼 J2EE大鸟 2012-12-18  
jixian3204 写道
你的sql应该不会被,mybatis缓存的

你说的很可能是对的,按主键查询和外键之间的查询,还是按照mybatis的标准配置来进行,
如果查询条件很多,而且又包含order by及分页数据,自己维护应该要容易一点,因为order by的数据需要用linkedmap,而查询条件用hashmap就够了。。所以我还是写了一个父类,让每个daoImpl去继承,在父类中写一个抽象方法帮助我们拼接sql语句。。
18 楼 jixian3204 2012-12-18  
你的sql应该不会被,mybatis缓存的
17 楼 J2EE大鸟 2012-12-17  
longfor5 写道
楼主是怎么处理参数的?有没有sql注入问题?

sql参数是通过键值对的形式传递的,比如
servlet接受到参数后,将参数放入map中,
map.put("username","小")
map.put("address","杭州")
然后将数据传递至数据访问层,对map进行遍历,拼出where语句。。

sql注入的问题没有考虑过,但由于是自己写的sql语句,肯定有方法能够检测,这还有待研究啊。。
16 楼 J2EE大鸟 2012-12-17  
hamber 写道
SQL参数,预处理如何处理先?

sql参数是通过键值对的形式传递的,比如
servlet接受到参数后,将参数放入map中,
map.put("username","小")
map.put("address","杭州")
然后将数据传递至数据访问层,对map进行遍历,拼出where语句。。

15 楼 longfor5 2012-12-17  
楼主是怎么处理参数的?有没有sql注入问题?
14 楼 hamber 2012-12-17  
SQL参数,预处理如何处理先?
13 楼 J2EE大鸟 2012-12-17  
kevincollins 写道
比如在下面这种情况下,可能只想些一条sql。

<!--TeacherMapper接口中getById方法对应的SQL语句。 查询教师及其指导的学生的信息。由于教师、学生都有 id、name、gender等属性,因此给教师的字段都起了别名 -->
<select id="getById" parameterType="int" resultMap="teacherResultMap">
select t.id t_id, t.name t_name,
s.id,s.name
from i_teacher t,i_student s
where 1=1
and s.t_id = t.id
and t.id=#{id}
</select>

<select id="getAll" resultMap="teacherResultMap">
select t.id t_id, t.name t_name,
s.id,s.name
from i_teacher t,i_student s
where 1=1
and s.t_id = t.id
</select>

你的这种写法没错,但是在项目中,尤其是类似于依赖对应关系(一对多,多对多)很多的情况下,这样的维护往往是令我们吃不消的。往往依靠mybatis提供的association和collection帮助我们维护。。
在进行组合条件查询时,我们一般都会将select * from table [where ... order by ... limit ... ] 中 [...]写成通用方法,供每个daoImpl去引用
12 楼 J2EE大鸟 2012-12-17  
lvwenwen 写道
麻烦楼主把工程共享出来,谢谢

嗯,过几天我整理一下。。
11 楼 J2EE大鸟 2012-12-17  
kevincollins 写道
作者说的 是mybatis 运行期 获取xml中定义的 sql语句吧?


拿到这个sql ,然后再动态进行各种拼接。

是我们自己写一个sql语句,直接让mybatis执行
select * from table [where ... order by ... limit ... ]
在[...]中,我们可以自己在dao层通过抽象通用方法,拼接出来符合自己业务逻辑的条件。。
10 楼 J2EE大鸟 2012-12-17  
jeffsc 写道
resultType="java.util.Map",返回一个Map对象也是可以的

嗯,这要看我们写的sql语句返回的内容是什么了。。
select * from ... 用map就不合适了。。

相关推荐

    mybatis/ibatis自动生成SQLMapper脚本

    首先,SQLMapper是MyBatis的核心组成部分,它定义了与数据库交互的SQL语句和映射规则。通过自动生成这些映射文件,开发者可以避免手动编写繁琐的SQL代码,同时保持代码的整洁和可维护性。 1. **配置Generator**: ...

    根据MyBatis或iBatis的SQLMapper文件反向生成数据库表

    根据MyBatis或iBatis的SQLMapper文件解析生成数据库表,通常是指通过解析MyBatis或iBatis的SQLMapper文件中的SQL语句,然后根据这些SQL语句来生成对应的数据库表结构。这样的需求可能源于需要将已有的SQLMapper文件...

    根据mybatis/ibatis sqlmapper文件解析生成数据库表

    它可能首先寻找`&lt;insert&gt;`、`&lt;update&gt;`、`&lt;select&gt;`和`&lt;delete&gt;`等标签,这些是MyBatis/iBatis中定义SQL语句的地方。接着,它会分析`&lt;resultMap&gt;`和`&lt;parameterMap&gt;`来获取字段信息和参数映射,以确定数据库表的列名...

    generate mybatis ibatis artifacts

    XML配置文件是MyBatis的核心,它包含了Mapper接口的方法与对应的SQL语句的映射。通过这个文件,MyBatis能够理解如何执行数据库操作。 7. **优势与价值** - 提升开发速度:自动化的代码生成减少了手动编写代码的...

    mybatis,ibatis,hibernate 显示查询SQL

    在iBatis中,同样可以通过配置日志系统,如log4j,查看执行的SQL语句,这对于调试和性能优化非常有用。 **Hibernate** Hibernate 是一个全面的ORM框架,提供了更强大的对象关系映射功能。它不仅处理SQL的生成,还...

    原样输出mybatis的sql执行语句(mysql和oracle都可用).zip

    在默认情况下,MyBatis并不会直接打印出执行的SQL语句,因此我们需要开启日志功能以获取这些信息。 1. **启用MyBatis日志** MyBatis支持多种日志实现,如Log4j、Logback和Java内置的日志API。在SpringBoot项目中,...

    从iBatis迁移到MyBatis

    在数据库开发中,持久层框架是至关重要的,它负责处理数据库的CRUD(创建、读取、更新、删除)操作,以及SQL语句的动态构建和执行。iBatis以其灵活的SQL映射和对XML或注解的支持而受到欢迎,但随着时间的推移,...

    myBatis or ibatis 神器

    总结起来,myBatis和iBatis都是强大的Java持久层框架,它们通过将SQL语句与Java代码分离,提高了开发效率和代码的可维护性。myBatis作为iBatis的升级版,提供了更多的功能和便利,而iBatis Auto Generator这样的工具...

    在ibatis日志信息中打印SQL语句的方法(个人总结)

    在使用iBatis(现为MyBatis)作为持久层框架进行开发时,有时我们需要调试SQL语句,以便查看执行的SQL、优化性能或者解决查询问题。本文将详细讲解如何在iBatis日志信息中打印SQL语句,以便更好地理解和优化数据库...

    iBatis的动态SQL语句

    iBatis(现在通常被称为MyBatis)提供了一套强大的动态SQL功能,可以帮助开发者灵活地构建SQL语句,极大地提高了开发效率和代码的可维护性。 #### 一、基本概念 iBatis框架中的动态SQL主要通过XML映射文件来实现,...

    MyBatis和IBatis配置文件中的自动补全功能

    在开发过程中,配置文件的正确设置至关重要,因为它定义了数据库连接、映射文件的位置以及SQL语句的执行方式。本文将深入探讨如何在MyBatis和iBatis的配置文件中启用自动补全功能,以提高开发效率。 首先,我们来看...

    ideal mybatis打印sql插件

    把 mybatis 输出的sql日志还原成完整的sql语句。 将日志输出的sql语句中的问号 ? 替换成真正的参数值。 通过 "Tools -&gt; MyBatis Log Plugin" 菜单或快捷键 "Ctrl+Shift+Alt+O" 启用。 点击窗口左边的 "Filter" ...

    myBatis和ibatis的区别

    - **动态SQL支持**:myBatis增强了动态SQL的支持能力,使得开发者可以更容易地构建复杂的查询语句。 - **对象关系映射(ORM)**:ibatis更多关注SQL查询的映射,而myBatis在此基础上加强了对象关系映射的能力,更好...

    generator, A code generator for MyBatis and iBATIS..zip

    生成的Mapper接口可以直接与MyBatis的SqlSession进行交互,执行数据库操作。 XML映射文件包含了具体的SQL语句,MBG会根据表结构生成对应的SELECT、INSERT、UPDATE和DELETE语句。这些映射文件会定义字段到数据库列的...

    MyBatis(iBATIS) 学习

    XML配置文件中包含了SQL语句、参数映射、结果映射等信息,而注解方式则更简洁,直接在Mapper接口的方法上标注SQL语句和相关属性。 4. Mapper接口与Mapper XML文件: Mapper接口是业务逻辑层调用数据库的桥梁,其中...

    使用P6spy打印ibatis执行的SQL语句

    本文将详细探讨如何使用P6Spy来打印iBatis(现为MyBatis)执行的SQL语句,以便进行性能分析和调试。 首先,我们需要了解P6Spy的工作原理。P6Spy通过替换JDBC驱动,将自己插入到应用程序和数据库之间,监听所有的SQL...

    mybatis和ibatis代码生成工具

    iBatis,即现在的MyBatis前身,最初由Clinton Begin创建,是一个SQL映射框架,它将SQL语句写在XML配置文件中,通过映射关系,使得Java对象可以直接与数据库进行交互。 2. 代码生成工具的重要性: 代码生成工具...

    通过Mybatis拦截器自动定位慢SQL并记录日志

    Mybatis拦截器(Interceptor)是一种插件机制,它允许我们在Mybatis执行SQL语句之前或之后进行自定义操作,比如统计SQL执行时间、添加日志等。拦截器基于Java的动态代理实现,可以拦截Mapper接口方法的调用。 接...

    Mybatis Log(自动填充sql参数打印到控制台)

    Mybatis 是一个流行的Java持久层框架,它简化了数据库操作,允许开发者将SQL语句直接映射到Java方法。在开发过程中,为了调试和优化SQL性能,常常需要查看执行的SQL语句及其参数。Mybatis 提供了一种日志机制,能够...

    mybatis、ibatis、spring各种整合方式

    首先,iBatis(现为MyBatis)是一个轻量级的ORM(对象关系映射)框架,它允许开发者将SQL语句直接写在配置文件中,将数据库操作与业务逻辑分离。Spring框架则提供了一个强大的依赖注入(DI)机制,能够管理包括...

Global site tag (gtag.js) - Google Analytics