`

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文件反向生成数据库表

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

    ideal mybatis打印sql插件

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

    mybatis教案

    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将...

    mybatis 模糊查询的实现方法

    mybatis的逆向助手确实好用,可以省去很多编写常规sql语句的时间,但是它没办法自动生成模糊查询语句,但开发中模糊查询是必不可少的,所以,需要手动对mapper编写模糊查询功能。 这里先明确MyBatis/Ibatis中#和$的...

    mybatis-3-mybatis-3.5.13.zip

    SqlSessionFactory负责创建SqlSession,而SqlSession用于执行SQL语句并管理数据库连接。 2. 配置解析: MyBatis的配置文件(通常是mybatis-config.xml)包含了框架的各种配置信息,如数据库连接、映射文件路径等。...

    springmybatis

    请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句: session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID", 1) 其实还有更简单的方法,而且是更好的方法,使用合理描述参数和...

    Mybatis学习笔记整合架构

    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将...

    mybatis_day01.docx

    mybatis为半自动化,需要自己书写sql语句,需要自己定义映射。增加了程序员的一些操作,但是带来了设计上的灵活,并且也是支持hibernate的一些特性,如延迟加载,缓存和映射等;对数据库的兼容性比hibernate差。移植...

    MyBatis数据持久层框架 v3.5.13

    MyBatis使用XML描述符或注释将对象与存储过程或SQL语句耦合。相对于对象关系映射工具,简单性是MyBatis数据映射器的最大优势。 Mybaits的优点: 1、基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计...

    SpringBoot项目整合MyBatis连接数据库

    比如,刚开始学习Java的时候可能会遇到JDBC,它是连接Java和数据库的桥梁,我们可以使用JDBC来建立与数据库之间的连接并且执行相应的SQL语句。虽然JDBC的执行效率很高,但是其开发效率比较低。正是如此,市面上出现...

    mybatis 最佳实践

    MyBatis 的前身是 iBatis 。是一个数据持久层(ORM)框架。至今,MyBatis 源 码内的包名仍在使用 org.apache.ibatis。 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 ...

    Python实现的MySQL数据库的操作框架,简单封装,声明式事务

    Python实现的MySQL数据库的操作框架,简单封装,声明式事务 类似MyBatis接口调用执行SQL,SQL与代码分离,接口可复用。 类似iBatis根据sql_id执行SQL,提供了更多操作数据库...可以直接执行SQL语句。 ORM方式操作数据库

    04第一天-mybatis-mybatis入门-认识MyBatis.mp4

    MyBatis的前身就是iBatis , MyBatis使用XML描述符或注释将对象与存储过程或SQL语句耦合,将关系数据库与面向对象应用程序结合使用变得更加容易。支持定制化SQL、存储过程以及高级映射。

    java,mybiats总结

    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将...

    05第一天-mybatis-mybatis的使用_MyBatis的jar包导入_SqlSession对象的创建_mybatis.xml文件的创建和配置.mp4

    MyBatis的前身就是iBatis , MyBatis使用XML描述符或注释将对象与存储过程或SQL语句耦合,将关系数据库与面向对象应用程序结合使用变得更加容易。支持定制化SQL、存储过程以及高级映射。

    01第一天-mybatis-mybatis入门-介绍.mp4

    MyBatis的前身就是iBatis , MyBatis使用XML描述符或注释将对象与存储过程或SQL语句耦合,将关系数据库与面向对象应用程序结合使用变得更加容易。支持定制化SQL、存储过程以及高级映射。

    Ibatis3.0 增删改查(二)

    Ibatis3.0 增删改查(二) Ibatis3.0 mybatis 增删改查(二),包含jar包和建表语句。sql语句在log文件夹下面

    03第一天-mybatis-mybatis入门-ORM的认识.mp4

    MyBatis的前身就是iBatis , MyBatis使用XML描述符或注释将对象与存储过程或SQL语句耦合,将关系数据库与面向对象应用程序结合使用变得更加容易。支持定制化SQL、存储过程以及高级映射。

    02第一天-mybatis-mybatis入门-认识框架.mp4

    MyBatis的前身就是iBatis , MyBatis使用XML描述符或注释将对象与存储过程或SQL语句耦合,将关系数据库与面向对象应用程序结合使用变得更加容易。支持定制化SQL、存储过程以及高级映射。

    ibatis 增删改查(DB2版本)

    ibatis 增删改查(DB2版本),用其他数据库的话,直接把配置文件改一下就可以了。WEBROOT下面有建表sql语句

Global site tag (gtag.js) - Google Analytics