mybatis insert两张表generator的insert为什么有两个

1606人阅读
Mybatis(12)
如果要让generator自动添加该功能,可以如下配置:
&!-- tableName:用于自动生成代码的数据库表;domainObjectName:对应于数据库表的javaBean类名;不需要生成Example类 --&
& & & & &table schema=&& tableName=&ACT_SecurityBlockLog& domainObjectName=&BlockLog&
& & & & & & & &enableCountByExample=&false& enableUpdateByExample=&false&
& & & & & & & &enableDeleteByExample=&false& enableSelectByExample=&false&
& & & & & & & &selectByExampleQueryId=&false&&
& & & & & & &property name=&useActualColumnNames& value=&true&/&
& & & & & &&&generatedKey column=&id& sqlStatement=&MySql& identity=&true&/&
& & & & &/table&
或者手动增加:
&insert id=&insert& parameterType=&Activity&&keyProperty=&id&
& & &keyColumn=&ID& useGeneratedKeys=&true&&
主键值有 &对象.getId()获得
方法只返回成功影响的行数:1
在insert里面加入selectKey标签就可以了. 一般都是返回的int类型.对应是自增长字段.
要注意的是: ibatis会直接返回int值. Mybatis则把int值包装在参数对象里面.
public int insert(User user) {
//ibatis方式.
int result = UserMapper.insert(user);
//Mybatis方式
user = UserMapper.insert(user);
return user.getId();
还要注意的是数据库类型不一样,生成ID的策略也不一样. 可以对selectKey添加属性(名字忘记了), pre---先生成ID. post---后生成ID. default是post.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:323075次
积分:4948
积分:4948
排名:第4768名
原创:49篇
转载:795篇
评论:27条
(16)(10)(1)(25)(2)(1)(198)(280)(155)(92)(64)(12)(19)(1)MyBatis如何引用多个数据源操作 - ITeye问答
目前我使用了mybatis-generator.xml进行自动生成持久层代码,现在我想把mybatis整合到sping中,现在的情况是,我这有两个数据源,一个主库,一个从库,主库负责写操作,从库负责读操作,请问,mybatis中如何对一个mapper接口配置多个数据库,根据不同的操作选择不同的数据源?
在spring配置文件中如图地方该如何配置?
参考使用:
/blog/1746213
或者为读和写分别提供不同的接口,如XXXReadDao、XXXWriteDao
两个数据源的例子,希望有帮助
&!-- spring beans 组件扫描 --&
&context:component-scan base-package="com.test.tt"&&/context:component-scan&
&!-- jdbc配置文件 --&
&context:property-placeholder location="classpath:jdbc.properties" /&
&!-- proxool连接池 --&
&bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"&
&property name="alias" value="${alias}" /&
&property name="driver" value="${driver}" /&
&property name="driverUrl" value="${driverUrl}" /&
&property name="user" value="${user}" /&
&property name="password" value="${password}" /&
&property name="houseKeepingTestSql" value="${house-keeping-test-sql}" /&
&property name="maximumConnectionCount" value="${maximum-connection-count}" /&
&property name="minimumConnectionCount" value="${minimum-connection-count}" /&
&property name="prototypeCount" value="${prototype-count}" /&
&property name="simultaneousBuildThrottle" value="${simultaneous-build-throttle}" /&
&property name="trace" value="${trace}" /&
&bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&
&property name="dataSource" ref="dataSource" /&
&property name="configLocation" value="classpath:mybatis-config.xml"&&/property&
&bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&property name="dataSource" ref="dataSource" /&
&!-- 注解式事务管理 --&
&tx:annotation-driven transaction-manager="transactionManager" /&
&!-- 自动扫描 mybatis mapper接口 --&
&bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&
&property name="basePackage" value="com.test.tt.mapper" /&
&property name="sqlSessionFactory" ref="sqlSessionFactory"&&/property&
&!-- 数据源2--&
&!-- proxool连接池 --&
&bean id="dataSource_d2" class="org.logicalcobwebs.proxool.ProxoolDataSource"&
&property name="alias" value="${d2.alias}" /&
&property name="driver" value="${driver}" /&
&property name="driverUrl" value="${d2.driverUrl}" /&
&property name="user" value="${d2.user}" /&
&property name="password" value="${d2.password}" /&
&property name="houseKeepingTestSql" value="${house-keeping-test-sql}" /&
&property name="maximumConnectionCount" value="${maximum-connection-count}" /&
&property name="minimumConnectionCount" value="${minimum-connection-count}" /&
&property name="prototypeCount" value="${prototype-count}" /&
&property name="simultaneousBuildThrottle" value="${simultaneous-build-throttle}" /&
&property name="trace" value="${trace}" /&
&bean id="sqlSessionFactory_d2" class="org.mybatis.spring.SqlSessionFactoryBean"&
&property name="dataSource" ref="dataSource_d2" /&
&property name="configLocation" value="classpath:mybatis-d2-config.xml"&&/property&
&bean id="transactionManager_d2"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&property name="dataSource" ref="dataSource_d2" /&
&!-- 注解式事务管理 --&
&tx:annotation-driven transaction-manager="transactionManager_d2" /&
&!-- 自动扫描 mybatis mapper接口 --&
&bean name="mapperScannerConfigurer_d2"
class="org.mybatis.spring.mapper.MapperScannerConfigurer"&
&property name="basePackage" value="com.test.tt.d2mapper" /&
&property name="sqlSessionFactory" ref="sqlSessionFactory_d2"&&/property&
你可以参考我的
&bean id="abstractDataSource"
abstract="true" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"&
&property name="driverClass" value="com.mysql.jdbc.Driver" /&
&property name="idleConnectionTestPeriod" value="60"/&
&property name="idleMaxAge" value="240"/&
&property name="maxConnectionsPerPartition" value="30"/&
&property name="minConnectionsPerPartition" value="10"/&
&property name="partitionCount" value="3"/&
&property name="acquireIncrement" value="5"/&
&property name="statementCacheSize" value="100"/&
&property name="releaseHelperThreads" value="3"/&
&bean id="writeDS" parent="abstractDataSource"&
&property name="username" value="root"/&
&property name="password" value="mysql"/&
&property name="jdbcUrl" value="" /&
&bean id="readDS1" parent="abstractDataSource"&
&property name="username" value="root"/&
&property name="password" value="mysql"/&
&property name="jdbcUrl" value="" /&
&bean id="readDS2" parent="abstractDataSource"&
&property name="username" value="root"/&
&property name="password" value="mysql"/&
&property name="jdbcUrl" value="" /&
&bean id="readDS3" parent="abstractDataSource"&
&property name="username" value="root"/&
&property name="password" value="mysql"/&
&property name="jdbcUrl" value="" /&
&bean id="multiDataSource" class=""&
&property name="readDataSource"&
&ref bean="readDS1"/&
&ref bean="readDS2"/&
&ref bean="readDS3"/&
&/property&
&property name="writeDataSource"&
&ref bean="writeDS"/&
&/property&
希望对你有帮助
已解决问题
未解决问题20044人阅读
mybatis(2)
MyBatis中批量插入&&
&insert id=&insertbatch& parameterType=&java.util.List&&
& &selectKey keyProperty=&fetchTime& order=&BEFORE&
& resultType=&java.lang.String&&
& SELECT CURRENT_TIMESTAMP()
& &/selectKey&
& insert into kangaiduoyaodian ( depart1, depart2, product_name,
& generic_name, img, product_specification, unit,
& approval_certificate, manufacturer, marketPrice, vipPrice,
& website, fetch_time, productdesc ) values
& &foreach collection=&list& item=&item& index=&index&
& separator=&,&&
& ( #{item.depart1}, #{item.depart2}, #{item.productName},
& #{item.genericName}, #{item.img},
& #{item.productSpecification}, #{item.unit},
& #{item.approvalCertificate}, #{item.manufacturer},
& #{item.marketprice}, #{item.vipprice}, #{item.website},
& #{fetchTime}, #{item.productdesc} )
& &/foreach&
& &/insert&
&insert id=&batchInsertB2B& parameterType=&ArrayList&&
insert into xxxxtable(hkgs,hkgsjsda,office,asdf,ddd,ffff,supfullName,classtype,agent_type,remark)
&foreach collection=&list& item=&item& index=&index& separator=&union all&&
select #{item.hkgs,jdbcType=VARCHAR},
#{item.hkgsjsda,jdbcType=VARCHAR},
#{item.office,jdbcType=VARCHAR},
#{item.asdf,jdbcType=VARCHAR},
#{item.ddd,jdbcType=VARCHAR},
#{item.ffff,jdbcType=VARCHAR},
#{item.supfullName,jdbcType=VARCHAR},0,0,
#{item.remark,jdbcType=VARCHAR} from dual
&/foreach&
可以考虑用union all来实现批量插入。
insert into XX_TABLE(XX,XX,XX)select 'xx','xx','xx' union all select 'xx','xx','xx' union all select 'xx','xx','xx' ...
先拼装好语句再动态传入insert into XX_TABLE(XX,XX,XX)后面部分
MyBatis中批量删除
&!-- 通过主键集合批量删除记录 --&
&delete id=&batchRemoveUserByPks& parameterType=&java.util.List&&
DELETE FROM LD_USER WHERE ID in&
&foreach item=&item& index=&index& collection=&list& open=&(& separator=&,& close=&)&&
&/foreach&
MyBatis中in子句
1.只有一个参数
参数的类型要声明为List或Array
Sql配置如下:
&select id=&selectProduct& resultMap=&Map&&
FROM PRODUCT
WHERE PRODUCTNO IN
&&&& &foreach item=&productNo& index=&index& collection=&参数的类型List或array&&
&&&&&&&&&&& #{productNo}
&&& &/foreach&
2.多个参数
首先要将多个参数写入同一个map,将map作为一个参数传入mapper
Sql配置如下:
&select id=&selectProduct& resultMap=&Map&&
FROM PRODUCT
WHERE PRODUCTNO IN
&&&& &foreach item=&productNo& index=&index& collection=&map中集合参数的名称&&
&&&&&&&&&&& #{productNo}
&&& &/foreach&
&MyBatis批量修改
&&update&id=&updateOrders&&parameterType=&java.util.List&&
&update&orders&set&state&=&'0'&where&no&in
&&foreach&collection=&list&&item=&nos&&open=&(&&separator=&,&&close=&)&&
&&/foreach&
&&/update&
&MyBatis的前身就是著名的Ibatis,不知何故脱离了Apache改名为MyBatis。
&MyBatis所说是轻量级的ORM框架,在网上看过一个测试报告,感觉相比于Hibernate来说,优势并不明显。
下面说一下比较有趣的现象,根据MyBatis的官方文档,在获得sqlSession时,它有为批量更新而专门准备的:
= sessionFactory.openSession();//用于普通update
session = sessionFactory.openSession(ExecutorType.BATCH,
true);//用于批量update
&一般来说,对MYSQL数据库批量操作时速度取决于,是为每一个处理分别建立一个连接,还是为这一批处理一共建立一个连接。按MyBatis的手册说明,选择ExecutorType.BATCH意味着,获得的sqlSession会批量执行所有更新语句。不过我测试了一下,批量插入1000条数据,发觉ExecutorType.BATCH方式的效率居然比普通的方式差很多。我测试用的Mapper中的insert配置如下,再用for循环插入1000条记录:
id=&insert& parameterType=&sdc.mybatis.test.Student&&
&!-- WARNING - @mbggenerated This element is automatically generated by
MyBatis Generator, do not modify. This element was generated on Mon May 09
11:09:37 CST 2011. --&
insert into student (id, name, sex,
address, telephone, t_id
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
#{sex,jdbcType=VARCHAR},
#{address,jdbcType=VARCHAR}, #{telephone,jdbcType=VARCHAR}, #{tId,jdbcType=INTEGER}
&我不清楚原因在哪里, 就配置了MyBatis的log4j,想查看下日志。下载了log4j.jar和commons-logging.jar并配置到项目的类路径,然后在代码路径下新建文件log4j.properties,内容如下:
log4j.rootLogger=DEBUG, stdout
# SqlMap logging configuration...
.ibatis=DEBUG
.mon.jdbc.SimpleDataSource=DEBUG
.ibatis.sqlmap.engine.cache.CacheModel=DEBUG
.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG
.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG
.mon.util.StopWatch=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
&然后再次测试普通的sqlSession,发现日志内容中虽然插入了1000条数据,但只新建了一次连接,最后又关闭了该连接(日志如下)。也就是说MyBatis中的普通sqlSession好像已经对批量插入默认是一次连接中完成,那么还提供ExecutorType.BATCH方式干什么,况且该方式好像效率也不行,或者是我使用ExecutorType.BATCH方式不对??
DEBUG [main] - Created connection
DEBUG [main] - ooo Connection Opened
DEBUG [main] -
==& Executing: insert into student
( name, sex, address,
telephone, t_id
( ?, ?, ?,
DEBUG [main] -
==& Parameters: 新人0(String), male(String),
addr0(String), dd(String),3(Integer)
DEBUG [main] -
==& Executing: insert into student
( name, sex, address,
telephone, t_id
( ?, ?, ?,
DEBUG [main] -
==& Parameters: 新人1(String), male(String),
...............
...............
DEBUG [main] - xxx Connection Closed
DEBUG [main] - Returned connection
3502256 to pool.
&最后一点是关于数据库批量插入时sql语句级的优化,我特意测试了两种方式,在StudentMapper中配置了两种insert模式。第一种对应insert value1,insert value2,,,,;第二种对应insert values (value1, value2,....)。发现后者果然比前者快很多啊。下面是两种insert模式,及测试结果对应图:&
&!-- 在外部for循环调用一千次
id=&insert& parameterType=&sdc.mybatis.test.Student&&
insert into student (id, name, sex,
address, telephone, t_id
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
#{sex,jdbcType=VARCHAR},
#{address,jdbcType=VARCHAR}, #{telephone,jdbcType=VARCHAR}, #{tId,jdbcType=INTEGER}
&!-- 批量 ,传入一个长度为1000的list
id=&insertBatch&&
insert into student ( &include
refid=&Base_Column_List&/& )
collection=&list& item=&item&
index=&index& separator=&,&&
(null,#{item.name},#{item.sex},#{item.address},#{item.telephone},#{item.tId})
&/foreach&
MyBatis配置文件的DTD文件(与Ibatis3不同):MyBatis的中文手册:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:111620次
积分:1061
积分:1061
排名:千里之外
原创:11篇
转载:49篇
(1)(1)(1)(1)(1)(1)(1)(2)(3)(4)(1)(1)(1)(3)(8)(1)(10)(13)(5)(1)}

我要回帖

更多关于 mybatisgenerator安装 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信