ibatis循环批量插入数据,表中五个字段,id自增长,我需要把最重要的两个字段插入,怎么写xml的sql呢?

ibatis循环批量插入数据,表中五个字段,id自增长,我需要把最重要的两个字段插入,怎么写xml的sql呢?,第1张

假设我们有一个java实体类User,它有三个属性:

1

2

3

private Integer id//主键

private String name//姓名

private double rate//进度

构造方法、setter、getter都是正常且完善的。

数据库中有一张对应的t_user表:

1

2

3

4

5

6

7

--mysql数据库

create table t_user

(

id integer primary key auto_increment,

name varchar(20),

rate double

)engine=INNODB

或者

1

2

3

4

5

6

7

8

9

10

--oracle数据库

create table t_user

(

id number(11) primary key,

name varchar2(20),

rate number(10,2)

)

--主键序列

create sequence seq_user_id

在User.xml配置文件中,插入User的配置一般为:

<insert id="insertUser" parameterClass="User">

insert into t_user (ID, NAME, RATE) values (#id#, #name#, #rate#)

</insert>

这样,在java代码中调用方式为:

1

sqlMapper.insert("insertUser", user)//此处的user应该保证id是正确的

为了使用ibatis生成主键,我们可以使用如下配置:

1

2

3

4

5

6

7

8

<!-- mysql -->

<insert id="insertUserByAutoIncrement" parameterClass="User">

insert into t_user (NAME,RATE) values (#name#, #rate#)

<!-- 注意:上述SQL语句中不插入主键id -->

<selectKey resultClass="int" keyProperty="id">

SELECT LAST_INSERT_ID() AS VALUE

</selectKey>

</insert>

或者

<!-- Oracle -->

<insert id="insertUserBySequence" parameterClass="User">

<selectKey resultClass="int" keyProperty="id">

SELECT seq_user_id.NEXTVAL AS VALUE FROM DUAL

</selectKey>

<!-- 注意:下列SQL语句中必须插入ID -->

insert into t_user (ID, NAME, RATE) values (#id#, #name#, #rate#)

</insert>

注意,这里需要说明一下,不同的数据库,主键生成方式是不同的

mysql:SELECT LAST_INSERT_ID() AS VALUE

mssql:select @@IDENTITY as value

oracle:SELECT SEQUENCE.NEXTVAL [AS VALUE] FROM DUAL

还有一点需要注意的是有些数据库是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL,有些数据库是事后生成(post-generate)主键的,如MySQL和SQL Server。所以如果是Oracle数据库,则需要将selectKey写在insert之前。

方法:在系统运行过程中,针对不同数据库类型区分加载不同文件路径下的sqlmap配置。留给开发人员做的事依旧是快乐地编写原始数据库语句,而不再为多数据库兼容问题挠头。

分析问题:

1、解决ibatis多数据库兼容的问题,实际上就是让ibatis可以自动选择不同数据库sqlmap配置文件。

2、打开ibatis源码工程并进行代码跟踪,最终定位到com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.java处,系统中运行的sqlmap节点均从这里统一转化加载的。

3、很明显SqlMapConfigParser源码中的addSqlMapNodelets负责解析“/sqlMapConfig/sqlMap”路径,即也就是sqlmap文件路径。

4、要实现“多数据库兼容”,这里改造下这个方法即可。

解决方法:

1、首选我们在<setting>节点新增一个“DBProductName”用于判断数据库种类。当然通过java.sql.DatabaseMetaData也可以获得,但这太依赖于jdbc驱动,还是手动配置保险。

2、重构SqlMapConfigParser的addSqlMapNodelets方法。

" 1)首选获得单个sqlmap文件的位置,如 sqlmap主目录\XXX.xml;

2)依据上面设置的DBProductName属性值获得数据库类型;

3)将sqlmap的文件路径重定位到运行数据库类型文件下。如 sqlmap主目录\mysql\XXX.xml,代表程序当前运行于msql数据库上,并加载系统mysql数据库对应的 sqlmap文件"

4、ok,现在ibatis支持“多数据库兼容”了(完整源码见附件)。

使用方法:

1、编译SqlMapConfigParser.java生成可运行文件SqlMapConfigParser.class(见附件),并将其覆盖添加到ibatis.jar中。

2、在系统sqlmap配置文件存放主目录如src\conf\mapping添加多数据库兼容支持的子目录,如src\conf\mapping\mysql,src\conf\mapping\oracle等

3、以实际项目需要编写多数据库sqlmap配置文件。注意:不同数据库类型需要确保具有相同的sqlmap配置文件名和sql节点名

4、在ibatis主配置文件(如sql-map-config.xml)中,<setting>指定当前程序运行数据库类型


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/7835007.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-10
下一篇2023-04-10

发表评论

登录后才能评论

评论列表(0条)

    保存