课题由单独搭建Mybatis到Mybatis与Spring的整合集成.docx
- 文档编号:4514406
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:29
- 大小:25.48KB
课题由单独搭建Mybatis到Mybatis与Spring的整合集成.docx
《课题由单独搭建Mybatis到Mybatis与Spring的整合集成.docx》由会员分享,可在线阅读,更多相关《课题由单独搭建Mybatis到Mybatis与Spring的整合集成.docx(29页珍藏版)》请在冰豆网上搜索。
课题由单独搭建Mybatis到Mybatis与Spring的整合集成
由“单独搭建Mybatis”到“Mybatis与Spring的整合/集成”
在J2EE领域,Hibernate与Mybatis是大家常用的持久层框架,它们各有特点,在持久层框架中处于领导地位。
本文主要介绍Mybatis(对于较小型的系统,特别是报表较多的系统,个人偏向Mybatis),对于它,个人比较喜欢的是:
使用简单、方便;
支持的XML动态SQL的编写,方便浏览、修改,同时降低SQL与应用程序之间的耦合。
不喜欢的是:
出现错误时,调试不太方便
本文主要介绍Mybatis的搭建,是学习Mybatis过程后整理的札记,其中包括“单独搭建Mybaits”和常用的“Mybatis与Spring的整合”。
一、数据库的准备
因为Mybatis是持久层框架,毫无疑问,是需要操作数据库的。
所以,在搭建之前,我们需要先创建一个简单的表。
createtableT_USER_TEST_1407
(
USERNAMEVARCHAR2(255),
PASSWORDVARCHAR2(255)
)
SQL-DDL-CreateTable
插入一些数据,以作查询的测试。
insertintoT_USER_TEST_1407(USERNAME,PASSWORD)
values('nick','Optimistic,Confident,Love-1');
SQL-DML-Inserttable
二、单独搭建Mybaits
1)环境准备、版本说明
此工程使用JDK1.6+ mybatis-3.2.4+Oracle11g。
新建一个Web工程,由于只构建Mybatis,只引用Mybatis和OracleJDBC驱动包
mybatis-3.2.4.jar
ojdbc6.jar
2)程序的搭建
首先,我们将数据源等配置信息放在一个xml,让Mybatis可以根据这个信息去连接数据库、管理事务。
目前我们可只关注environments节点,此节点是用于配置数据源、事务管理的。
其他的节点,如typeAliases、mappers,是用于注册一些信息的,后面会陆续提到。
1
xmlversion="1.0"encoding="UTF-8"?
>
2
DOCTYPEconfiguration
3PUBLIC"-//mybatis.org//DTDConfig3.0//EN"
4":
//mybatis.org/dtd/mybatis-3-config.dtd">
5
6
7
8
--RegisterAlias-->
9
10
11
12
13
--DataSource-->
14
15
16
17
18
19 oracle: thin: @xxx.xxx.xxx.xxx: xxxx: xxxxxx"/> 20 21 22 23 24 25 26 --RegisterMapper--> 27 28 --SQLMapper--> 29 30 31 32 mybatis-config.xml 既然有了配置的xml,下一步就需要让Mybatis加载它了。 首先以输入流的形式加载xml 以“SqlSessionFactoryBuilder-> SqlSessionFactory-> SqlSession”的流程最后构建出SqlSession。 SqlSession,顾名思义,是一次会话,是应用程序与数据库交互的会话,所以,其生命周期应在一次数据库连接之间,当然,此次数据库连接可以包含一次或多次数据库操作。 SqlSessionFactory,顾名思义,是SqlSession的工厂类,用于产出SqlSession。 我们知道,SqlSession主要用于数据库操作,而数据库操作又是贯穿于应用程序整个生命周期当中的,那么,"产出SqlSession"这个动作也应当贯穿于应用程序整个生命周期当中,所以,SqlSessionFactory的生命周期一般为应用程序的整个生命周期,一般为单例/static的形式存在。 SqlSessionFactoryBuilder,由代码可见,其主要作用是从配置文件中获取配置信息,然后构建SqlSessionFactory,所以其生命周期可以是临时的,局部的。 通过SqlSession获取UserMapper接口,再调用该接口的数据操纵方法。 packagecom.nicchagil.mybatisonly; importjava.io.IOException; importjava.io.InputStream; importorg.apache.ibatis.io.Resources; importorg.apache.ibatis.session.SqlSession; importorg.apache.ibatis.session.SqlSessionFactory; importorg.apache.ibatis.session.SqlSessionFactoryBuilder; importcom.nicchagil.mybatisonly.bean.User; importcom.nicchagil.mybatisonly.mapper.UserMapper; publicclassCall{ publicstaticSqlSessionFactorysqlSessionFactory=null; publicstaticvoidmain(String[]args)throwsIOException{ //QueryUser /* kickStartMybatis(); queryUser("nick"); */ //InserUser kickStartMybatis(); insertUser("user004","helloworld."); } publicstaticvoidkickStartMybatis()throwsIOException{ Stringresource="com/nicchagil/mybatisonly/mybatis-config.xml"; InputStreaminputStream=Resources.getResourceAsStream(resource); sqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream); } /** *QueryUser *@paramusername *@return */ publicstaticUserqueryUser(Stringusername){ Useruser=null; SqlSessionsession=sqlSessionFactory.openSession(); try{ /*Un-recommendedMethod*/ /* user=(User)session.selectOne("com.nicchagil.mybatisonly.mapper.UserMapper.queryUser",username); */ /*RecommendedMethod*/ UserMapperuserMapper=session.getMapper(UserMapper.class); user=userMapper.queryUser(username); System.out.println("username-"+user.getUsername()+",password-"+user.getPassword()); }finally{ session.close(); } returnuser; } /** *InsertUser *@paramusername *@parampassword */ publicstaticvoidinsertUser(Stringusername,Stringpassword){ SqlSessionsession=sqlSessionFactory.openSession(); try{ UserMapperuserMapper=session.getMapper(UserMapper.class); Useruser=newUser(); user.setUsername(username); user.setPassword(password); userMapper.insertUser(user); //Flushesbatchstatementsandcommitsdatabaseconnection. //Notethatdatabaseconnectionwillnotbecommittedifnoupdates/deletes/insertswerecalled. mit(); System.out.println("username-"+user.getUsername()+",password-"+user.getPassword()); }catch(Exceptione){ session.rollback(); e.printStackTrace(); //TODOPrinttheexceptionlogs //TODOPromptsfailtoexecuteforuser }finally{ session.close(); } } /** *InsertUser *@paramusername *@parampassword */ publicstaticvoidinsertUserBySQL(Stringusername,Stringpassword){ SqlSessionsession=sqlSessionFactory.openSession(); try{ Useruser=newUser(); user.setUsername(username); user.setPassword(password); session.insert("com.nicchagil.mybatisonly.mapper.UserMapper.insertUser",user); //Flushesbatchstatementsandcommitsdatabaseconnection. //Notethatdatabaseconnectionwillnotbecommittedifnoupdates/deletes/insertswerecalled. mit(); }catch(Exceptione){ session.rollback(); e.printStackTrace(); //TODOPrinttheexceptionlogs //TODOPromptsfailtoexecuteforuser }finally{ session.close(); } } } Call UserMapper是一个DAO的接口,是定义作哪些数据库操作的。 1packagecom.nicchagil.mybatisonly.mapper; 2 3importcom.nicchagil.mybatisonly.bean.User; 4 5publicinterfaceUserMapper{ 6 7publicUserqueryUser(Stringusername); 8 9} UserMapper.java UserMapper只是供调用的接口,那么具体的实现逻辑在哪里呢? 我们可见UserMaper.xml,它定义的SQL就是用于定义UserMapper接口的实现。 我们需在mybatis-config.xml注册UserMaper.xml,可见mybatis-config.xml的mappers节点。 我们可以看到id为queryUser,与接口的方法名对应; SQL我们很熟悉了,就是一个简单的SQL,而#{username},就是接口方法的入参; resultType为"user",这个user是一个别名,具体对应com.nicchagil.mybatisonly.bean.User这个类,我们可以看到在mybatis-config.xml文件的typeAliases节点中已经注册它们的映射关系。 xmlversion="1.0"encoding="UTF-8"? > DOCTYPEmapper PUBLIC"-//mybatis.org//DTDMapper3.0//EN" ": //mybatis.org/dtd/mybatis-3-mapper.dtd"> select*fromt_user_test_1407twheret.username=#{username} INSERTINTOt_user_test_1407T(T.USERNAME,T.PASSWORD)VALUES(#{username},#{password}) UserMapper.xml 而com.nicchagil.mybatisonly.bean.User是实体类,用于装载数据。 1packagecom.nicchagil.mybatisonly.bean; 2 3publicclassUser{ 4 5privateStringusername; 6privateStringpassword; 7 8publicStringgetUsername(){ 9returnusername; 10} 11 12publicvoidsetUsername(Stringusername){ 13this.username=username; 14} 15 16publicStringgetPassword(){ 17returnpassword; 18} 19 20publicvoidsetPassword(Stringpassword){ 21this.password=password; 22} 23 24@Override 25publicinthashCode(){ 26finalintprime=31; 27intresult=1; 28result=prime*result 29+((password==null)? 0: password.hashCode()); 30result=prime*result 31+((username==null)? 0: username.hashCode()); 32returnresult; 33} 34 35@Override 36publicbooleanequals(Objectobj){ 37if(this==obj) 38returntrue; 39if(obj==null) 40returnfalse; 41if(getClass()! =obj.getClass()) 42returnfalse; 43Userother=(User)obj; 44if(password==null){ 45if(other.password! =null) 46returnfalse; 47}elseif(! password.equals(other.password)) 48returnfalse; 49if(username==null){ 50if(other.username! =null) 51returnfalse; 52}elseif(! username.equals(other.username)) 53returnfalse; 54returntrue; 55} 56 57} User.java 最后,我们运行Call.java,将能成功查询、插入数据库。 我们可通过打印的信息和查询数据库,以查看是否成功查询、插入数据。 3)事务说明 对于数据库有写操作的应用程序,一般来说,事务是不可或缺的一部分。 因为未使用其他框架,这里使用编程式事务,即使用SqlSmit()和SqlSession.rollback()方法,可见Call.java。 由于本程序对事务有异常回滚的要求,所以,需要获取非自动提交的SqlSession 如程序执行正常,则最后执行mit()以提交事务。 mit()有个需注意的地方,参考其如下注释,即如果当前会话中不涉及updates/deletes/insert等写数动作则不提交事务。 所以,如果要触发Mybatis提交事务,就需执行明确的触发动作,如“执行session.insert(...)方法”或“执行对应的SQLMapper配置中的insert、update、delete等标签”等操作。 (本人曾尝试在SQLMapper配置中用select标签包含INSERT的SQL,使用SqlSmit()后,执行正常,但没有提交事务,可见并未触发,所以,需规范使用标签)。 如需强制提交,可用SqlSmit(boolean)。 Flushesbatchstatementsandcommitsdatabaseconnection.Notethatdatabaseconnectionwillnotbecommittedifnoupdates/deletes/insertswerecalled.ToforcethecommitcallSqlSmit(boolean) 如程序执行异常,则回滚事务,session.rollback() 单独搭建Mybaits完毕! 二、 Mybatis与Spring的整合 一个项目中,单独使用Mybatis的情况并不多;更多的情况下,我们需要将Mybatis与其他框架进行整合,以便更好地使用。 比如Mybatis+Spring,就是一个流行的整合组合。 1)环境准备、版本说明 本次用Mybatis3+Spring3进行整合。 注意,并不包含MVC框架的配置,因为本文的目的是学习Mybatis,所以尽量不引用其他框架,以避免影响代码的理解。 需引入的类库详情如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课题 单独 搭建 Mybatis Spring 整合 集成