我的项目是使用SpringMVC + Mybatis + EXTJS4设置的.这是我的配置:
# Rules reminder:
# DEBUG < INFO < WARN < ERROR < FATAL
# Global logging configuration
log4j.rootLogger=DEBUG,stdout
log4j.logger.org.apache.ibatis=DEBUG,stdout
log4j.logger.java.sql=DEBUG,stdout
#log4j.additivity.com.ibatis = false
#log4j.additivity.java.sql = false
## Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n
Run Code Online (Sandbox Code Playgroud)
但是它不会在Console中打印SQL,任何人都可以帮助我吗?非常感谢
在MyBatis中,您可以在SQL中标记应插入参数的位置,如下所示:
SELECT*FROM Person WHERE id = #{id}
此语法激活正确的转义等,以避免SQL注入攻击等.如果您有可信输入并希望跳过转义,则可以逐字插入参数:
SELECT*FROM {tableName} WHERE id =#{id}
现在,我想对不安全的输入进行LIKE搜索,所以我想做的是:
SELECT*FROM Person WHERE name LIKE #{beginningOfName} || '%'
但遗憾的是,重要的数据库服务器不支持||串联语法:
MSSQL - 使用'+'运算符而不是'||'来打破标准.
...
MySQL - 通过重新定义||严重打破了标准 表示OR.
所以,我也可以
SELECT*FROM Person WHERE name LIKE CONCAT(#{beginningOfName},'%')
在这种情况下,只限于MySQL,或者我可以做到
SELECT*FROM Person WHERE name LIKE '{beginningOfName}%'
并且必须自己清理输入.
有更优雅的解决方案吗?
我有一些复杂的查询要使用许多可选的过滤器构建,MyBatis似乎是生成动态SQL的理想候选者.
但是,我仍然希望我的查询在与应用程序的其余部分(不使用MyBatis)相同的框架中执行.
所以我希望做的是严格使用MyBatis来生成SQL,但是从那里使用我的应用程序的其余部分来实际执行它.这可能吗?如果是这样,怎么样?
我有一个使用MyBatis访问PostgreSQL数据库的Java项目.PostgreSQL允许在INSERT语句后返回新创建的行的字段,我想用它来返回自动生成BIGSERIAL id的新创建的记录.因此,我insert将XML中的命令更改为使用PostgreSQL的功能,resultType="long"向<insert>标记添加属性,并在映射器的Java接口中设置插入方法long而不是返回void.
当我尝试运行时,我得到一个org.xml.sax.SAXParseException说法Attribute "resultType" must be declared for element type "insert".
现在,当我将<insert>标签更改为<select>一切正常时,但我使用<select>标签执行INSERT语句让我感到困扰.
有没有办法让映射到<insert>标签的方法返回结果,或者MyBatis是不是为此设计的,我应该将它们作为<select>标签保存?
我没有找到匹配的注释<selectkey>(请参阅此未解决的问题)如何继续?
检查mybatis代码显示INSERT通过实现UPDATE,并始终返回插入的行数!所以...除非我在这里完全遗漏了一些东西,否则使用当前的(3.0.3)实现无法做到这一点.
我想使用HSQL内存数据库对MyBatis持久层进行单元测试.真正的应用程序使用Oracle数据库.这工作得很好,我们开始为id列添加自动递增的数字.Oracle需要使用序列来获取递增的数字,因此在Oracle数据库中创建了一个名为basis_seq的序列.在我的MyBatis映射器XML文件中,我有:
<insert id="insertBasis" parameterType="com.foo.Basis" useGeneratedKeys="true" keyProperty="id">
<selectKey resultType="long" keyProperty="id" order="BEFORE">
SELECT basis_seq.NEXTVAL FROM DUAL
</selectKey>
insert into basis
(id, name)
values
(#{id}, #{name})
</insert>
Run Code Online (Sandbox Code Playgroud)
这在我运行应用程序但单元测试出错时起作用:
org.springframework.jdbc.BadSqlGrammarException:选择键或将结果设置为参数对象时出错.原因:java.sql.SQLSyntaxErrorException:user缺少未找到的权限或对象:DUAL; 糟糕的SQL语法[]; 嵌套异常是java.sql.SQLSyntaxErrorException:user缺少未找到的权限或对象:DUAL
据我所知,'DUAL'是Oracle中存储序列的某种虚拟表,我在测试数据库中没有这个.如果我删除<selectKey>-tag单元测试工作(因为HSQL可以为标记的列自动生成id identity)但不是真正的应用程序.一种解决方法是为单元测试创建单独的MyBatis映射器XML文件而不使用<selectKey>-tag,但这是不希望的,因为我想测试真实的配置.
有没有办法在HSQL中创建和使用序列,或者为此可能有一些MyBatis解决方法?或者我应该像H2一样使用其他数据库进行单元测试?
我用:
从fredt得到答案之后,这是我编辑Spring配置的方法:
在我定义数据源之前:
<jdbc:embedded-database id="dataSource">
<jdbc:script location="classpath:test-data/schema.sql" />
<jdbc:script location="classpath:test-data/data.sql" />
</jdbc:embedded-database>
Run Code Online (Sandbox Code Playgroud)
现在我这样做:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:test;sql.syntax_ora=true" />
<property name="username" value="sa" />
<property name="password" value="" /> …Run Code Online (Sandbox Code Playgroud) 嗨,我是myBatis的新手.
我正在使用MyBatis和Spring和mybatis-spring.
如何将两种不同类型的对象作为参数传递,如何在查询中使用它们的属性?
<update id="update" parameterType="A, B"> <!-- @@? -->
UPDATE SOME WHERE x=A.x AND y=B.y <!-- @@? -->
</update>
Run Code Online (Sandbox Code Playgroud) 我想仅使用MyBatis3来生成SQL字符串(使用xml映射),但我获得的SQL无效.
例如,我获取了sql字符串:
SELECT * FROM USER WHERE NAME = john
Run Code Online (Sandbox Code Playgroud)
在这个sql中不存在' char sorrounding string value john
在mybatis.xml中:
...
<mappers>
<mapper resource="sql1.xml"/>
</mappers>
...
Run Code Online (Sandbox Code Playgroud)
sql1.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sql1">
<select id="select1" parameterType="map" resultType="String" >
SELECT * FROM USERS
WHERE
name LIKE ${name} AND num = ${number}
</select>
</mapper>
Run Code Online (Sandbox Code Playgroud)
在MyBatisSql.java中:
SqlSessionFactory sessionFactory = ConnectionFactory.getSqlSessionFactory();
Configuration configuration = sessionFactory.getConfiguration();
Map pars = new HashMap<String, Object>();
pars.put("name", "john");
pars.put("number", 1345); …Run Code Online (Sandbox Code Playgroud) 是否有带注释的iBATIS 3 的综合示例或教程?
我特别感兴趣的是从基于XML的映射器配置转向使用纯Java注释,其中SQL语句通常采用或返回复杂的数据结构.
此外,在我看到的样本中,当从基于XML的映射器转移到基于注释的映射器接口时,配置文件是如何被调整的还不清楚.
我使用java.time.LocalDate(Java 8)来表示Java类中的一些成员字段.
class Test{
private LocalDate startDate;
private LocalDate endDate;
//other fields
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我也在使用mybatis来与我的数据库进行交互.
在从DB检索某些数据时,所有其他字段都会正确填充,但startDate和endDate字段最终为null.但是,如果我使用java.util.Date,就像在
private Date startDate;
private Date endDate;
Run Code Online (Sandbox Code Playgroud)
当我将它们声明为java.util.Date时,我得到在这两个字段(startDate和endDate)中检索到的正确值.
是因为mybatis目前没有将'Timestamp'(SQL Server)映射到java.time吗?
我应该如何使用java.time.LocalDate与MyBatis进行映射?
mybatis ×10
java ×6
ibatis ×2
sql ×2
annotations ×1
dynamic-sql ×1
hsqldb ×1
log4j ×1
mysql ×1
oracle ×1
postgresql ×1
spring ×1