https://benworld.iteye.com/blog/1748886
`
J2EE大鸟
- 浏览: 298243 次
- 性别:
- 来自: 宁波
最近访客 更多访客>>
博主相关
博客专栏
浙大软院考研
浏览量:12134
文章分类
- 全部博客 (290)
- javaweb应用问题解决 (98)
- 软件测试 (3)
- Java和SOA (16)
- 设计模式 (1)
- 物联网 (1)
- Linux (19)
- javaweb J2EE (39)
- 数据库与java类型匹配 (2)
- 网络应用 (1)
- mysql (6)
- maven (2)
- 其他 (18)
- C语言 (39)
- 面试题 (10)
- 数据库 (7)
- C/C++ (26)
- 算法 (4)
- ruby (1)
- 书之总结 (2)
- 计算机 (4)
- 考研 (9)
- 多线程 (16)
- COM+ (8)
- 软件 (3)
- 公开课 (4)
社区版块
存档分类
最新评论
- J2EE大鸟: muzeng 写道非常感谢,比淘宝的还全,向学长学习,谢谢哈哈 ...
2013浙大878计算机基础综合大题答案解析 - muzeng: 非常感谢,比淘宝的还全,向学长学习,谢谢
2013浙大878计算机基础综合大题答案解析 - J2EE大鸟: tianxia2s 写道 求楼主给个选择题答案不不好意思,博客 ...
2012浙大878计算机专业基础综合大题答案解析 - tianxia2s: 求楼主给个选择题答案不
2012浙大878计算机专业基础综合大题答案解析 - tianxia2s: 感谢楼主
关于浙大考研878历年试卷的说明
mybatis/ibatis直接执行sql语句
- 博客分类:
- javaweb J2EE
- javaweb应用问题解决
在项目中,使用的是mybatis3.0.5,但没有采用其提供的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 java.lang.String 的异常
所以考虑:用一个适配器,将sql作为属性加入其中
首先:
Xml代码
- <typeAlias alias="sqladapter" type="com.zj.logistics.util.SQLAdapter" />
其次:
Java代码
- 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;
- }
- }
最后:
Xml代码
- <select id="findRecords" parameterType="SQLAdapter" resultMap="orderTypeResultMap">
- ${sql}
- </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语句后续
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代码
- public EsqlDemoBean selectBeanByBean(Object params) {
- return new Esql().selectFirst("selectByBean")
- .params(params)
- .returnType(EsqlDemoBean.class)
- .execute();
- }
Sql代码
- [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更加简单易用,不过在产品化上还差一步。
Java代码
- public EsqlDemoBean selectBeanByBean(Object params) {
- return new Esql().selectFirst("selectByBean")
- .params(params)
- .returnType(EsqlDemoBean.class)
- .execute();
- }
Sql代码
- [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直接执行sql语句
在项目中,使用的是mybatis3.0.5,但没有采用其提供的DAO层接口映射的策略,而且在进行多种属性联合查找时,需要底层提供通用的解决方案,所以需要mybatis直接执行sql语句,各个daoImpl均可调用,减少了在每个mybatis文件中配置符合当前对象的select查询。。 (在mybatis中,需要通过传递对象,在select中判断对象属性是否为空进行where语句的拼凑,对后期...
- ibatis、mybatis—有关在xml中写sql的小技巧(持续更新中)
1、正常情况下,我们在xml中写sql的时候,格式是这样的(以insert语句为例)&lt;!-- 新增实体 --&gt; &lt;insert id="XXX" parameterClass="com.XX.XX.XXX"&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$ 其中最重
- 配置mybatis和ibatis控制台打印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="String", 2.对于任何sql语句,其返回值类型无法用resultMap在xml文件里配置或者返回具体的bean类型,因此设置resultType="java.util.Map",但是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
- ibatis,sql语句中,动态在表名前增加数据库名前缀的方法
解决方案: 1.增加sqlmap.properties 定义里面内容:全局变量 [code="java"] dbSchema1=cl4motdta. dbSchema2=pbsec6m. dbSchema3=cl4devdta.[/code] 2.修改sqlmap-config.xml [code="java"] [/code] 3.运用到sqlmap [co...
- Mybatis 执行传入的sql语句
在项目开发中,需要根据具体业务逻辑动态拼接sql语句,那么我们可以将动态拼接好的sql语句传入mybatis中,这样便能最大限度将sql掌握在自己手里。
- 如何将MyBatis或者iBatis的SQL打印到控制台?
#将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节点
- 2012-12-17 8
-
ibatis、mybatis—有关在xml中写sql的小技巧(持续更新中)
2018-04-09 197 - 2016-02-17 3023
- 2015-11-12 5721
-
mybatis如何直接 执行传入的任意sql语句 并按照顺序取出查询的结果集
2017-09-04 23 - 2014-08-14 3471
- 2016-06-02 13144
- 2016-09-07 3040
-
mybatis如何直接 执行传入的任意sql语句 并按照顺序取出查询的结果集
2017-09-13 2227 - 2015-04-21 2743
-
MyBatis插件及示例----打印每条SQL语句及其执行时间
2017-06-30 563 -
如何在控制台输出mybatis所执行的SQL语句(配置LOG4J文件)
2017-08-23 431 -
mybatis源码学习之执行过程分析(4)——映射文件中sql的获取和sql语句的执行
2017-01-04 1572 - 2013-01-02 6458
- 2015-04-20 2282
联系我们
微信客服
QQ客服
客服论坛400-660-0108
工作时间 8:30-22:00
©1999-2019 江苏乐知网络技术有限公司
江苏知之为计算机有限公司 北京创新乐知信息技术有限公司版权所有
Global site tag (gtag.js) - Google Analytics