年末了,停下来歇歇,顺便把自己对mybatis的理解来说一说。
本次开发用的是spring mvc 3.0+mybatis, spring mvc就不多说了,接下来,重点说一下mybatis,本人也第一次使用mybatis,
mybatis其实就是对jdbc的封装,对程序员的编写sql能力的要求比较高。
下面来说说在实际应用中的mybatis
首先要构建一个SqlSessionFactory
database.driverClassName=oracle.jdbc.driver.OracleDriver
database.url=jdbc:oracle:thin:@10.21.2.89:1521:portal
database.dialect=org.hibernate.dialect.Oracle10gDialect
database.username=username
database.password=password
mybatis的映射文件,其实mybatis框架的核心就是对mybatis映射文件的操作,mybatis的文件配置就是sql的映射,所以要想特别熟练的应用mybatis,必须能熟练地操作sql。
mybatis其实是在jstl的基础上进行的改进,主要有9个标签
对查询结果集做缓存并不是MyBatis框架擅长的,它专心做的应该是sql mapper,所以在这我就不研究这两个标签了。
CONTAINER
container_id as containerId,
parent_id as parentId,
container_name as containerName,
total_well_count as totalWellCount,
empty_well_count as emptyWellCount,
sort as sort,
is_box as isBox,
xNumber as xNumber,
yNumber as yNumber,
remarks as remarks,
creat_time as createTime,
creator as creator,
last_modify_person as lastModifyPerson,
last_modify_time as lastModifyTime,
domain as domain
order by sort asc
1=1
select seq_container.nextVal
from dual
insert into
(
container_id,
parent_id,
container_name,
total_well_count,
empty_well_count,
sort,
is_box,
xNumber,
yNumber,
remarks,
creat_time,
creator,
last_modify_person,
last_modify_time,
domain
)
values
(
#{containerId,jdbcType=NUMERIC},
#{parentId,jdbcType=NUMERIC},
#{containerName,jdbcType=VARCHAR},
#{totalWellCount,jdbcType=NUMERIC},
#{emptyWellCount,jdbcType=NUMERIC},
#{sort,jdbcType=VARCHAR},
#{isBox,jdbcType=NUMERIC},
#{xNumber,jdbcType=NUMERIC},
#{yNumber,jdbcType=NUMERIC},
#{remarks,jdbcType=VARCHAR},
sysdate,
#{creator,jdbcType=VARCHAR},
#{lastModifyPerson,jdbcType=VARCHAR},
sysdate,
#{domain,jdbcType=VARCHAR}
)
delete container where container_id in(
select container_id from container c start with c.container_id=#{containerId} connect by c.parent_id = prior c.container_id
)
update
container_name = #{containerName},
parent_id = #{parentId}
where container_id = #{containerId}
以上是对我们常用的操作的一些总结,主要就是查询,新增,修改,删除等操作。
以下,我写一些在项目上的经验之谈。我在项目中,主要做的是对easyui tree的操作,之前,由于是半路被拉进项目中,不知道oracle有操作tree的语句,再加上项目一直没定下来批量操作,所以,后来才加上的批量操作,希望对有需要的童鞋有帮助,也希望以此来警戒自己,在项目开始之前,一定要做好功课,确定好最佳方案,在遇到问题时寻求最优的解决方案解决问题。
下面是批量操作的映射文件代码
insert into
select seq_container.nextval, c.* from (
select
#{item.parentId,jdbcType=NUMERIC},
#{item.containerName,jdbcType=VARCHAR},
#{item.totalWellCount,jdbcType=NUMERIC},
#{item.emptyWellCount,jdbcType=NUMERIC},
#{item.sort,jdbcType=VARCHAR},
#{item.remarks,jdbcType=VARCHAR},
sysdate createTime,
#{item.creator,jdbcType=VARCHAR},
#{item.lastModifyPerson,jdbcType=VARCHAR},
sysdate lastModifyTime,
#{item.domain,jdbcType=VARCHAR},
#{item.isBox,jdbcType=NUMERIC},
#{item.xNumber,jdbcType=NUMERIC},
#{item.yNumber,jdbcType=NUMERIC}
from dual
) c
delete from
where container_id in
#{item.containerId}
update container set
total_well_count = total_well_count + #{totalWellCount},
empty_well_count = empty_well_count + #{emptyWellCount},
last_modify_person = #{lastModifyPerson},
last_modify_time = sysdate
total_well_count = total_well_count - #{totalWellCount},
empty_well_count = empty_well_count - #{emptyWellCount},
last_modify_person = #{lastModifyPerson},
last_modify_time = sysdate
where container_id in (
select m.container_id from container m start with m.container_id=#{containerId} connect by prior m.parent_id=m.container_id
)
也提一点注意:在进行mybatis的操作时,最好先将自己的sql提出来,拿到数据库进行格式化和执行,这样的话,能 更快的提高效率,当然,如果sql的功力特深的话,更好了。
本人在数据库方面的了解还甚少,有童鞋有更优的方案,敬请提出,共同努力,如果以上有啥问题,希望大神提出,共同来进行探讨。