标签: mybatis

如何为Mybatis配置log4j以打印我的SQL

我的项目是使用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,任何人都可以帮助我吗?非常感谢

java log4j mybatis

15
推荐指数
3
解决办法
3万
查看次数

(如何)我可以安全地使用MyBatis和DB-agnostic在SQL查询中使用"LIKE"?

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}%'

并且必须自己清理输入.

有更优雅的解决方案吗?

sql mybatis

15
推荐指数
4
解决办法
4万
查看次数

我可以使用MyBatis生成动态SQL而不执行它吗?

我有一些复杂的查询要使用许多可选的过滤器构建,MyBatis似乎是生成动态SQL的理想候选者.

但是,我仍然希望我的查询在与应用程序的其余部分(不使用MyBatis)相同的框架中执行.

所以我希望做的是严格使用MyBatis来生成SQL,但是从那里使用我的应用程序的其余部分来实际执行它.这可能吗?如果是这样,怎么样?

java dynamic-sql mybatis

15
推荐指数
1
解决办法
1万
查看次数

从MyBatis <插入>映射方法返回值

我有一个使用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>标签保存?

postgresql mybatis

15
推荐指数
3
解决办法
4万
查看次数

如何在带有注释的mysql中使用mybatis返回插入内容上的id

  • 请参阅 Postgres的相关问题.出于某种原因,该解决方案对我不起作用 - insert语句的返回值始终为"1".
  • 有关基于XML的解决方案,请参阅此其他问题.我想在没有XML的情况下做同样的事情 - 插入一条记录并找到我刚刚插入的记录的新自动生成的id.

我没有找到匹配的注释<selectkey>(请参阅此未解决的问题)如何继续?

检查mybatis代码显示INSERT通过实现UPDATE,并始终返回插入的行数!所以...除非我在这里完全遗漏了一些东西,否则使用当前的(3.0.3)实现无法做到这一点.

java mysql mybatis

14
推荐指数
2
解决办法
3万
查看次数

使用HSQL而不是Oracle对MyBatis进行单元测试

我想使用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一样使用其他数据库进行单元测试?


我用:

  • Spring 3.0.5
  • HSQL 2.2.4
  • MyBatis 3.0.5

更新:

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)

oracle hsqldb mybatis

14
推荐指数
1
解决办法
1万
查看次数

如何传递多个参数并使用它们?

嗨,我是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)

spring ibatis mybatis

14
推荐指数
2
解决办法
3万
查看次数

MyBatis 3 - 从mapper获取SQL字符串

我想仅使用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)

java sql mybatis

14
推荐指数
1
解决办法
1万
查看次数

是否有带注释的iBATIS 3的综合示例或教程?

是否有带注释的iBATIS 3 的综合示例或教程?

我特别感兴趣的是从基于XML的映射器配置转向使用纯Java注释,其中SQL语句通常采用或返回复杂的数据结构.

此外,在我看到的样本中,当从基于XML的映射器转移到基于注释的映射器接口时,配置文件是如何被调整的还不清楚.

java annotations ibatis mybatis

13
推荐指数
0
解决办法
2191
查看次数

使用mybatis进行Java 8 LocalDate映射

我使用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进行映射?

java mybatis

13
推荐指数
3
解决办法
2万
查看次数

标签 统计

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