我想使用 Hibernate 和 MyBatis 与 Spring 集成来构建一个应用程序。在原型中,我必须运行它们,但不能一起运行。我的Spring应用上下文是:
\n\n <?xml version="1.0" encoding="UTF-8"?>\n<!--\n Document : applicationContext-spring.xml\n Created on : 26 de diciembre de 2012, 15:49\n Author : Pedro Fdez\n Description:\n Fichero de configuraci\xc3\xb3n de Spring\n-->\n<beans xmlns="http://www.springframework.org/schema/beans"\n xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n xmlns:aop="http://www.springframework.org/schema/aop"\n xmlns:context="http://www.springframework.org/schema/context"\n xmlns:tx="http://www.springframework.org/schema/tx"\n xsi:schemaLocation="http://www.springframework.org/schema/beans \n http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n http://www.springframework.org/schema/aop \n http://www.springframework.org/schema/aop/spring-aop-3.0.xsd\n http://www.springframework.org/schema/context \n http://www.springframework.org/schema/context/spring-context-3.0.xsd\n http://www.springframework.org/schema/tx \n http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" default-autowire="byName">\n\n <context:annotation-config />\n <context:component-scan base-package="com.administracion.model.dao.implementations" />\n <tx:annotation-driven transaction-manager="txManagerHibernate"/>\n <aop:aspectj-autoproxy /> \n\n <!-- ............................ -->\n <!-- Configuraci\xc3\xb3n de datasource -->\n <!-- ............................ -->\n <bean id="dataSource"\n class="org.apache.commons.dbcp.BasicDataSource"\n destroy-method="close">\n <property name="driverClassName" value="${jdbc.driverClassName}"/>\n <property …Run Code Online (Sandbox Code Playgroud) 是否可以进行 MyBatis 更新,您可以提供一个包含要更新的值的 bean,而不是提供单独的参数?
澄清:
而不是这个:
@Update("update widget set name=#{name}, manufacturer=#{manufacturer} where id=#{id}")
public void updateWidget(
@Param("id") int id,
@Param("name") String name,
@Param("manufacturer") String manufacturer);
Run Code Online (Sandbox Code Playgroud)
你能做这样的事情吗:
@Update("update widget set name=#{name}, manufacturer=#{manufacturer} where id=#{id}")
public void updateWidget(@Param("id") int id, Widget newValues);
Run Code Online (Sandbox Code Playgroud)
其中 newValues 已包含要更新的新值?
我已经尝试过了,但我得到了例外:
Exception in thread "main" org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'forename' not found. Available parameters are [id, 1, param1, param2]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:368)
at com.sun.proxy.$Proxy8.update(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:254)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:49)
Run Code Online (Sandbox Code Playgroud) 我有一个作为 cron 运行的 java 应用程序。它使用MyBatis。在我的 mybatis-config.xml 中,我有
<environments default="staging">
<environment id="prod_read">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.10.2:3306/myDB"/>
<property name="username" value="dbuser"/>
<property name="password" value="dbpass"/>
</dataSource>
</environment>
<environment id="prod_write">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.10.1:3306/myDB"/>
<property name="username" value="dbuser"/>
<property name="password" value="dbpass"/>
</dataSource>
</environment>
<environment id="staging">.....
</environments>
Run Code Online (Sandbox Code Playgroud)
因此,我在生产中使用 2 个 DB - 一个用于读从属,一个用于写主。
代码中,SqlSessionFactory的初始化是这样的
InputStream rd = this.getClass().getClassLoader()
.getResourceAsStream(mybatisConfigXml);
try {
sessionFactory_read = new SqlSessionFactoryBuilder().build(rd, Main.DB_ENV + "_read");
sessionFactory_write = new SqlSessionFactoryBuilder().build(rd, Main.DB_ENV + "_write"); …Run Code Online (Sandbox Code Playgroud) 我想通过mybatis基于注解将一个具有10多个属性的Object插入到mysql中。但我必须列出所有属性,这太不方便了。我想知道是否有一些方法可以轻松插入对象,而无需通过 mybatis 列出所有属性。这是我的片段。多谢。
@Insert("insert into poi_shop(name,brand,tags,status,phone,mobile,business_time,address,city,lng,lat,business_type,attribute_json) values(#{name},#{brand},#{tags},#{status},#{phone},#{mobile},#{business_time},#{address},#{city},#{lng},#{lat},#{business_type},#{attribute_json})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
public Long insertPoiInfo(PoiBo poiBo);
Run Code Online (Sandbox Code Playgroud) 我们正在从 SQL Server 2005 迁移到 2012。其中一项功能因此错误而失败
com.microsoft.sqlserver.jdbc.SQLServerException:不允许从数据类型 varbinary 到 datetime2 的隐式转换。使用 CONVERT 函数运行此查询。
我们用来SQLJDBC driver 3.0与 SQL Server 2012 进行通信。当我们尝试将 NULL 值插入列DATETIME(可为空)时,我发现会发生此问题。但在 2005 年也同样有效。对于此问题的任何帮助,我们将不胜感激。
这是一个INSERT使用 MyBatis ORM 从 Java 到 SQL Server 2012 失败的简单语句:
Insert into temp_test (date1, name, date2) values ('2010-10-10 00:00:00.0','test',null)
Run Code Online (Sandbox Code Playgroud)
当我们尝试从我们的应用程序(使用 SQL JDBC 驱动程序)时,此插入失败...但是相同的代码库在 SQL 2005 中可以正常工作,没有任何问题。
我有一个带有 mybatis 3.3.0 和 mybatis-spring 1.2.3 的 Spring MVC 项目,我想在我的项目中配置 log4j 。我不用于mybatis-config.xml设置 mybatis sql 会话工厂。所以我不能使用以下设置,
<configuration>
<settings>
...
<setting name="logImpl" value="LOG4J"/>
...
</settings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
所以,我的配置中有以下配置
spring-context.xml ,
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.sample.model"/>
<property name="mapperLocations" value="classpath*:com/sample/mappers/*.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.sample.mappers" />
</bean>
Run Code Online (Sandbox Code Playgroud)
并配置了这个log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" …Run Code Online (Sandbox Code Playgroud) 在3.2.8官方文档\xef\xbc\x8cin\'typeHandlers\'部分\xef\xbc\x8ci有一个测试,\xef\xbc\x8can然后发现它不能覆盖默认的org.apache.ibatis。类型.StringTypeHandler。我调试它,它停在 StringTypeHandler 中,而不是 ExampleTypeHandler 中。\n这是 mybatis-config.xml 文件:
\n\n<?xml version="1.0" encoding="UTF-8" ?>\n<!DOCTYPE configuration\n PUBLIC "-//mybatis.org//DTD Config 3.0//EN"\n "http://mybatis.org/dtd/mybatis-3-config.dtd">\n<configuration>\n <properties resource="db.properties"/>\n\n <settings>\n <setting name="mapUnderscoreToCamelCase" value="true"/>\n </settings>\n\n <typeAliases>\n <package name="com.solverpeng.mybatis.beans"/>\n </typeAliases>\n\n <typeHandlers>\n <typeHandler handler="com.solverpeng.mybatis.typeHandlers.ExampleTypeHandler"/>\n </typeHandlers>\n\n <environments default="development">\n <environment id="development">\n <transactionManager type="JDBC"/>\n <dataSource type="POOLED">\n <property name="driver" value="${jdbc.driver}"/>\n <property name="url" value="${jdbc.url}"/>\n <property name="username" value="${jdbc.username}"/>\n <property name="password" value="${jdbc.password}"/>\n </dataSource>\n </environment>\n </environments>\n <mappers>\n <mapper resource="com/solverpeng/mybatis/beans/mapper/CustomerMapper.xml"/>\n </mappers>\n</configuration>\nRun Code Online (Sandbox Code Playgroud)\n\n这是ExampleTypeHandler.java
\n\n@MappedJdbcTypes(JdbcType.VARCHAR)\npublic class ExampleTypeHandler extends BaseTypeHandler<String> {\n\n @Override\n public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) …Run Code Online (Sandbox Code Playgroud) 是否存在防止 SQL 注入的好方法mybatis?
我将它与spring-boot. 实际上,我在查询中使用用户提供的字符串参数。
有任何想法吗?
如果我使用mybatis,我可以很容易地获得更新的行数,就像
update table set desc = 'xxx' where name = ?
Run Code Online (Sandbox Code Playgroud)
但是,如果我想获取更新的行数,而不是计数,mybatis 如何实现呢?
我正在尝试实现以下 ibatis 插入注释,但不断收到以下错误消息:
org.apache.ibatis.binding.BindingException:未找到参数“person”。可用参数有 [arg1, arg0, param1, param2]
到目前为止,这是我的代码。我如何解决它?
@(Insert("INSERT INTO profile (person, school) VALUES (#{person}, #{school})";)
void insertOne(TestTextMessage person, String school)
Run Code Online (Sandbox Code Playgroud)
一些背景:
试过这个...@(Insert("INSERT INTO profile (person, school) VALUES (#{arg0}, #{arg1})";)但现在得到一个 java.lang.Assertion 错误。TestTextMessage 是一个包含以下值的类:
@Data
@NoArgs
@EqualsAndHashCode
public class TestTextMessage {
private long id;
private String name;
private int age;
}
Run Code Online (Sandbox Code Playgroud)
目前我这样称呼它:
messageMapper.insertOne(new TestTextMessage(person1), SchoolType.EDENGLEN);
Run Code Online (Sandbox Code Playgroud)
如果我将学校类型移到班级,那么它应该可以工作,但是我如何为学校类型赋值?
mybatis ×10
java ×7
annotations ×2
spring ×2
hibernate ×1
ibatis ×1
jakarta-ee ×1
log4j ×1
logging ×1
mysql ×1
spring-mvc ×1
sqljdbc ×1