本文主要介绍Mybatis(对于较小型的系统,特别是报表较多的系统,个人偏向Mybatis),对于它,个人比较喜欢的是:
使用简单、方便;
支持的XML动态SQL的编写,方便浏览、修改,同时降低SQL与应用程序之间的耦合。
不喜欢的是:
出现错误时,调试不太方便
本文主要介绍Mybatis的搭建,是学习Mybatis过程后整理的札记,其中包括“单独搭建Mybaits”和常用的“Mybatis与Spring的整合”。
一、数据库的准备
因为Mybatis是持久层框架,毫无疑问,是需要操作数据库的。所以,在搭建之前,我们需要先创建一个简单的表。
SQL - DDL - Create Table
插入一些数据,以作查询的测试。
SQL - DML - Insert table
二、单独搭建Mybaits 1)环境准备、版本说明
此工程使用JDK1.6 + mybatis-3.2.4 + Oracle11g。
新建一个Web工程,由于只构建Mybatis,只引用Mybatis和Oracle JDBC驱动包
2)程序的搭建
mybatis-3.2.4.jar ojdbc6.jar
首先,我们将数据源等配置信息放在一个xml,让Mybatis可以根据这个信息去连接数据库、管理事务。
目前我们可只关注environments节点,此节点是用于配置数据源、事务管理的 。 其他的节点,如typeAliases、mappers,是用于注册一些信息的,后面会陆续提到。
mybatis-config.xml
既然有了配置的xml,下一步就需要让Mybatis加载它了。
1. 首先以输入流的形式加载xml
2. 以“SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession”的流程
最后构建出SqlSession。
1. SqlSession,顾名思义,是一次会话,是应用程序与数据库交互的会话,所以,
其生命周期应在一次数据库连接之间,当然,此次数据库连接可以包含一次或多次数据库操作。
2. SqlSessionFactory,顾名思义,是SqlSession的工厂类,用于产出
SqlSession。我们知道,SqlSession主要用于数据库操作,而数据库操作又是贯穿于应用程序整个生命周期当中的,那么,\"产出SqlSession\"这个动作也应当贯穿于应用程序整个生命周期当中,所以,SqlSessionFactory的生命周期一般为应用程序的整个生命周期,一般为单例/static的形式存在。 3. SqlSessionFactoryBuilder,由代码可见,其主要作用是从配置文件中获取配
置信息,然后构建SqlSessionFactory,所以其生命周期可以是临时的,局部的。 Call
UserMapper是一个DAO的接口,是定义作哪些数据库操作的。
UserMapper.java
UserMapper只是供调用的接口,那么具体的实现逻辑在哪里呢?
我们可见UserMaper.xml,它定义的SQL就是用于定义UserMapper接口的实现。我们需在mybatis-config.xml注册UserMaper.xml,可见mybatis-config.xml的mappers节点。
我们可以看到id为queryUser,与接口的方法名对应;
SQL我们很熟悉了,就是一个简单的SQL,而#{username},就是接口方法的入参;
通过SqlSession获取UserMapper接口,再调用该接口的数据操纵方法。
resultType为\"user\",这个user是一个别名,具体对应
com.nicchagil.mybatisonly.bean.User这个类,我们可以看到在
mybatis-config.xml文件的typeAliases节点中已经注册它们的映射关系。
UserMapper.xml
而com.nicchagil.mybatisonly.bean.User是实体类,用于装载数据。 User.java
最后,我们运行Call.java,将能成功查询、插入数据库。我们可通过打印的信息和查询数据库,以查看是否成功查询、插入数据。
3)事务说明
对于数据库有写操作的应用程序,一般来说,事务是不可或缺的一部分。因为未使用其他框架,这里使用编程式事务,即使用SqlSession.commit()和SqlSession.rollback()方法,可见Call.java。
由于本程序对事务有异常回滚的要求,所以,需要获取非自动提交的SqlSession 如程序执行正常,则最后执行session.commit()以提交事务。
o session.commit()有个需注意的地方,参考其如下注释,即如果当前会话中不涉
及updates/deletes/insert等写数动作则不提交事务。所以,如果要触发Mybatis提交事务,就需执行明确的触发动作,如“执行session.insert(...)方法”或“执行对应的SQL Mapper配置中的insert、update、delete等标签”等操作。(本人曾尝试在SQL Mapper配置中用select标签包含INSERT的SQL,使用SqlSession.commit()后,执行正常,但没有提交事务,可见并未触发,所以,需规范使用标签)。如需强制提交,可用SqlSession.commit(boolean)。 Flushes batch statements and commits database connection. Note that database connection will not be committed if no updates/deletes/inserts were called. To force the commit call SqlSession.commit(boolean)
单独搭建Mybaits完毕!
二、 Mybatis与Spring的整合
如程序执行异常,则回滚事务,session.rollback()
一个项目中,单独使用Mybatis的情况并不多;更多的情况下,我们需要将Mybatis与其他框架进行整合,以便更好地使用。比如Mybatis + Spring,就是一个流行的整合组合。
1)环境准备、版本说明
本次用Mybatis3 + Spring3进行整合。注意,并不包含MVC框架的配置,因为本文的目的是学习Mybatis,所以尽量不引用其他框架,以避免影响代码的理解。 需引入的类库详情如下:
MVN dependencies
2)程序的搭建
首先,我们在Spring中配置关于Mybatis数据源的信息。
这里以applicationContext-mybatis.xml来体现,配置了如下信息:
注册数据源,常见的有JDBC或JNDI,根据具体情况择一。 注册sqlSessionFactory
o sqlSessionFactory是用来生产sqlSession以操作数据库的,所以,需指定
sqlSessionFactory所引用的数据源
o 指定相应的SQL Mapper文件在哪里。我们自命名“_mapper后缀的xml文件”,
主要用来定义SQL;“_resultmap后缀的xml文件”,则主要用来定义DB字段与应用程序实体属性的映射。
o 指定相应的应用程序实体在哪里,并自动注册不包含package名的别名
在哪些package下扫描Mapper接口,即DAO接口
applicationContext-mybatis.xml
除了Mybatis的信息,还有一些Spring的信息需要配置:
根据注解自动扫描并注册bean
Spring的声明式事务管理(用以替代上一章节的“编程式事务”)
由于本程序没有集成MVC框架,在Servlet是通过Spring编程式地获得Spring管理的bean,所以这里注册一个Spring的工具类。(使用了MVC框架并将框架交由Spring IOC容器管理的,可忽视此点配置)
applicationContext.xml
众所周知,以上是Spring的配置文件,那么我们需要告诉应用程序“这些配置文件在哪里”,所以我们需要在web.xml中告诉应用程序。另外,此web.xml注册了一个Servlet,用于接收页面的请求。 web.xml
我们还需要定义Mapper的接口,即DAO接口。此处的Mapper的接口,我们已经在applicationContext-mybatis.xml中注册为指定路径下自动扫描。
UserMapper.java
而Mapper的实现是如何的呢?
Mybatis会帮我们实现,我们只需要通过user_mapper.xml文件告诉Mybatis对应的SQL,此处的mapper文件,已经在applicationContext-mybatis.xml中注册为指定路径下自动扫描。
user_mapper.xml
可以看到,Mapper和SQL配置文件中都引用到了实体类,我们也需要定义。此处的实体类,已经在applicationContext-mybatis.xml中注册为指定路径下自动扫描。 User.java
实体的属性与DB的字段之间的映射/匹配,我们需要定义一下。此处的resultmap.xml文件已经在applicationContext-mybatis.xml中注册为指定路径下自动扫描。
user_resultmap.xml
完成了DAO,那么接着写Service。 首先一个Service的接口。
UserService.java
Service的实现类如下,这里只简单地测试查询、保存、事务是否能正常处理。
UserServiceImpl.java
由于没有整合MVC框架,此处由一个Servlet(此Servlet已于web.xml中注册)获取页面请求并调用Service,
那么如何在Servlet中获得Spring IOC管理下Service的bean呢?这里借助
SpringContextUtil(implements ApplicationContextAware),此SpringContextUtil于以上提及的applicationContext.xml中注册。
UserServlet.java
SpringContextUtil.java
几乎大功告成。
这里写了些触发测试的页面,执行结果可通过“查看控制台”或“查询数据库”获得。哈哈!~~ 导航页
index.html
输入username查询记录的触发页面 find.html 保存页面 save.html
测试事务的触发页面
testTransaction.html
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- hzar.cn 版权所有 赣ICP备2024042791号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务