mybatis/ibatis直接执行sql语句

https://benworld.iteye.com/blog/1748886

首页 资讯 精华 论坛 问答 博客 专栏 群组

您还未登录 ! 登录

`

J2EE大鸟的博客

J2EE大鸟

  • 浏览: 298243 次
  • 性别: Icon_minigender_1
  • 来自: 宁波

最近访客 更多访客>>

NOthingAj的博客

NOthingAj

17865426202的博客

17865426202

qq_15946053的博客

qq_15946053

svgtx的博客

svgtx

博主相关

博客专栏

C66e42a0-7c37-3c2e-9962-6b7864dae651

浙大软院考研
浏览量:12134

文章分类

社区版块

存档分类

最新评论

mybatis/ibatis直接执行sql语句

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

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

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

Xml代码 

 收藏代码

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

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

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

首先:

Xml代码 

 收藏代码

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

 其次:

Java代码 

 收藏代码

  1. public class SQLAdapter {  
  2.     String sql;  
  3.   
  4.     public SQLAdapter(String sql) {  
  5.         this.sql = sql;  
  6.     }  
  7.   
  8.     public String getSql() {  
  9.         return sql;  
  10.     }  
  11.   
  12.     public void setSql(String sql) {  
  13.         this.sql = sql;  
  14.     }  
  15. }  

 最后:

Xml代码 

 收藏代码

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

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

搞定。。

String table=create table if not exists a   inherits b; //创建表的语句

    partitionMapper.execute(table);

void execute(@Param("sql") String sql);

<update id="execute">
        ${sql}
    </update>

执行各种创建,删除,更新sql.

上面那个执行查询的sql

这些是mybatis的功能。

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

Python正确的学习路线,你一定不知道的薪资翻倍秘

如何从8K提至20K月薪,你要掌握学习那些技能

6 

5 

分享到:  

MyBatis直接执行SQL查询及批量插入数据 | mybatis 主键自增 insert后返回主键

评论

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更加简单易用,不过在产品化上还差一步。
Java代码 

 收藏代码

  1. public EsqlDemoBean selectBeanByBean(Object params) {  
  2.     return new Esql().selectFirst("selectByBean")  
  3.             .params(params)  
  4.             .returnType(EsqlDemoBean.class)  
  5.             .execute();  
  6. }  



Sql代码 

 收藏代码

  1. [selectByBean]  
  2. SELECT A,B,C,D,E  
  3. FROM ESQL_TEST  
  4. WHERE A = #a#  
  5. 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更加简单易用,不过在产品化上还差一步。
Java代码 

 收藏代码

  1. public EsqlDemoBean selectBeanByBean(Object params) {  
  2.     return new Esql().selectFirst("selectByBean")  
  3.             .params(params)  
  4.             .returnType(EsqlDemoBean.class)  
  5.             .execute();  
  6. }  



Sql代码 

 收藏代码

  1. [selectByBean]  
  2. SELECT A,B,C,D,E  
  3. FROM ESQL_TEST  
  4. WHERE A = #a#  
  5. 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就不合适了。。

« 上一页 1 2 下一页 »

发表评论

 您还没有登录,请您登录后再发表评论

相关资源推荐

  • mybatis/ibatis直接执行sql语句

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

  • ibatismybatis—有关在xml中写sql的小技巧(持续更新中)

    1、正常情况下,我们在xml中写sql的时候,格式是这样的(以insert语句为例)&amp;lt;!-- 新增实体 --&amp;gt; &amp;lt;insert id=&quot;XXX&quot; parameterClass=&quot;com.XX.XX.XXX&quot;&amp;gt; insert into tableName ( key1, key2, key3, key4) values( value1,...

  • IBatis 怎样直接执行SQL语句

    有时候,为了代码灵活,便于修改,要直接IBatis传入完整的SQL语句ibatis map 文件如下: <select id="selectBySql" resultClass="java.util.HashMap" remapResults="true" parameterClass="java.util.HashMap"> $sql$ $sql$ 其中最重

  • 配置mybatisibatis控制台打印sql语句

    #将ibatislog4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句log4j.rootLogger=debug,stdout,logfile ### 把日志信息输出到控制台 ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender #log4j.appender.stdout.Target=Syste

  • mybatis如何直接 执行传入的任意sql语句 并按照顺序取出查询的结果集

    mybatis如何直接 执行传入的任意sql语句 并按照顺序取出查询的结果集 需求: 1.直接执行前端传来的任何sql语句,parameterType=&quot;String&quot;, 2.对于任何sql语句,其返回值类型无法用resultMap在xml文件里配置或者返回具体的bean类型,因此设置resultType=&quot;java.util.Map&quot;,但是Map并不保证...

  • SQL 客户端执行快 java执行慢 ibatis

    本人使用SpringMVC架构+ibatis

  • Mybatis 直接执行SQL

    Mybatis 直接执行SQL好久不更新博客了,今天开发遇到一个问题就是如何在mybatis直接执行sql直接上代码:<select id="selectBysql" parameterType="java.lang.String" resultType="java.lang.Integer"> ${sql}//#{sql} </select>上网查了下,网上的解释是: 使用${}代

  • ibatis获取运行时的动态SQL语句及其参数

    从离职的同事那里接手了一个项目开始改bug,然后就接触到了ibatis。然后有个bug是查询到的数据和预期的不一样,改来改去还是不一样。最后只能祭出杀手锏,把ibatis运行时的动态SQL打印出来,发现SQL语句压根就没刷新啊,摔。咳咳,下面讲如何获取ibatis运行时的动态SQL以及其参数。 假设我想获得这段调了ibatis接口的java代码所执行sql语句以及其参数: n = (

  • mybatis如何直接 执行传入的任意sql语句 并按照顺序取出查询的结果集

    mybatis如何直接 执行传入的任意sql语句 并按照顺序取出查询的结果集 需求: 1.直接执行前端传来的任何sql语句,parameterType="String", 2.对于任何sql语句,其返回值类型无法用resultMap在xml文件里配置或者返回具体的bean类型,因此设置resultType="java.util.Map",但是Map并不保证存入取出顺序一致, 因此设置resultT

  • iBATIS.net直接执行sql语句

    在用iBatis.net与数据库打交道的过程中,发现iBatis.net拼接字符串不能直接拷贝然后在dbms里执行(获取runtime时的sql语句都是带@param1,@param2,@param3,...这样的形式)。有时候sql语句一个小小的标点(都怪自己学艺不精,呵呵)都会造成执行错误。其实,直接手写的sql字符串也可以通过iBatis执行,而且支持select,insert,delet

  • MyBatis插件及示例----打印每条SQL语句及其执行时间

    转载地址:http://www.cnblogs.com/xrq730/p/6972268.html Plugins 摘一段来自MyBatis官方文档的文字。 MyBatis允许你在某一点拦截已映射语句执行的调用。默认情况下,MyBatis允许使用插件来拦截方法调用 Executor(update、query、flushStatements、commint、rol

  • 如何在控制台输出mybatis执行SQL语句(配置LOG4J文件)

    #将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句log4j.rootLogger=debug,stdout,logfile ### 把日志信息输出到控制台 ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender #log4j.appender.stdout.Target=System.er

  • mybatis源码学习之执行过程分析(4)——映射文件中sql的获取和sql语句执行

    mybatis源码学习及分析之执行过程分析(4)——映射文件中sql的获取和sql语句执行在上一篇中分析了XXXMapper接口的获取,其实质上拿到的是一个MapperProxy。这一篇主要分析sql执行。MapperProxy.java private final SqlSession sqlSession; //接口名字记录在这里 private final Class<T> ma

  • iBatis应用--控制执行SQL时的超时时间

    执行SQL时,需要关注其执行时花费的时间,避免SQL执行过长的时间,占用数据库的资源。对于OLTP类型的系统,SQL执行时间一般来说都是比较短的,假如某个SQL执行时间超出平均值,则需要给予特别的关注,分析下是正常情况还是代码问题。 SQL执行时间过长,会有哪些后果呢?假如查询操作频率不高,偶尔才会执行一次,那么最多只会占用一个数据库链接,并且在执行成功之后,程序打开的数据库链接对象即会被释放

  • iBATIS.net获取运行时sql语句

    【本文原创,第一次离首页如此之近。发在候选区攒攒rp,管理员看着不合适可以撤下。】   虽然只在iBatis的世界里小打小闹匆匆数月,却历经数次与领导和同事激辩,再通过不懈努力学习和开发积累,楼猪终于被它小巧而不失强大,稳定而不失灵活所折服。作为80后顽固、偏执和nc一族,楼猪一向保守认为自己是美貌与智慧并存的。仗着天资聪慧,在之前的“iBatis.net直接执行sql语句”里曾经公然抱怨i

  • ibatissql语句中,动态在表名前增加数据库名前缀的方法

    解决方案: 1.增加sqlmap.properties 定义里面内容:全局变量 [code=&quot;java&quot;] dbSchema1=cl4motdta. dbSchema2=pbsec6m. dbSchema3=cl4devdta.[/code] 2.修改sqlmap-config.xml [code=&quot;java&quot;] [/code] 3.运用到sqlmap [co...

  • Mybatis 执行传入的sql语句

    在项目开发中,需要根据具体业务逻辑动态拼接sql语句,那么我们可以将动态拼接好的sql语句传入mybatis中,这样便能最大限度将sql掌握在自己手里。

  • 如何将MyBatis或者iBatisSQL打印到控制台?

    #将ibatislog4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句log4j.rootLogger=debug,stdout,logfile ### 把日志信息输出到控制台 ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender #log4j.appender.stdout.Target=Sys

  • Spring配置Mybatis执行原生SQL语句

    为什么要怎么做有这么一个应用场景:需要在Mybatis框架上进行多个连接池的配置,然后进行多种SQL语句的测试,因为有些SQL语句的结构比较复杂,有些会涉及到很多group by、join操作还有一些聚集函数的使用,同时数据量又较大

  • mybatis一次执行多条SQL语句,例如update节点

    mybatis一次执行多条SQL语句,例如update节点

联系我们

微信客服

微信客服

QQ客服

QQ客服

[email protected]QQ客服

客服论坛400-660-0108

工作时间 8:30-22:00

关于我们招聘广告服务 网站地图

百度提供站内搜索 京ICP证09002463号

©1999-2019 江苏乐知网络技术有限公司

江苏知之为计算机有限公司 北京创新乐知信息技术有限公司版权所有

经营性网站备案信息网络110报警服务

北京互联网违法和不良信息举报中心

中国互联网举报中心

 Global site tag (gtag.js) - Google Analytics

猜你喜欢

转载自blog.csdn.net/u013452335/article/details/86169905