MyBatis配置文件和接口编程

来源:互联网 发布:数据结构图应用 编辑:程序博客网 时间:2024/06/03 00:22

MyBatis配置文件和接口编程


如果接触过一些常用的 Java EE框架,应该都知道这些框架需要提供一个全局配置文件,用于指定程序正常运行所需的设置和参数信息。而针对常用的持久层框架而言(HibernateJPAiBatis等),则通常需要配置两类文件:一类用于指定数据源、事务属性以及其他一些参数配置信息(通常是一个独立的文件,可以称之为全局配置文件);另一类则用于指定数据库表和程序之间的映射信息(可能不止一个文件,我们称之为映射文件)MyBatis也不例外,虽然其中的一部分可以通过注解的形式进行,但是这两部分内容本身仍是必不可少的。

MyBatis中多以 MapperSessionConfiguration等其他常用 ORM 框架中的名字代替,体现的无非是两个方面:首先是为了减少开发者在切换框架所带来的学习成本;其次,MyBatis充分吸收了其他 ORM框架好的实践,MyBatis现在已不仅仅是一个 SQL映射框架了)。在全局配置文件中可以配置的信息主要包括如下几个方面:

properties ---用于提供一系列的键值对组成的属性信息,该属性信息可以用于整个配置文件中。

settings ---用于设置 MyBatis的运行时方式,比如是否启用延迟加载等。

typeAliases --- Java 类型指定别名,可以在 XML 文件中用别名取代 Java 类的全限定名。这个非常重要

typeHandlers --- MyBatis 通过 PreparedStatement为占位符设置值,或者从 ResultSet取出值时,特定类型的类型处理器会被执行。

objectFactory --- MyBatis通过 ObjectFactory来创建结果对象。可以通过继承 DefaultObjectFactory来实现自己的 ObjectFactory类。

plugins ---用于配置一系列拦截器,用于拦截映射 SQL语句的执行。可以通过实现 Interceptor接口来实现自己的拦截器。

environments ---用于配置数据源信息,包括连接池、事务属性等。

mappers ---程序中所有用到的 SQL映射文件都在这里列出,这些映射 SQL都被 MyBatis 管理。

上面提及的大多数元素都不是必需的,通常 MyBatis会为没有显式设置的元素提供缺省值。一个简单的全局配置文件示例如下:

 1. 简单的全局配置文件示例

  <?xml version="1.0" encoding="UTF-8" ?>

 <!--iBatis 和 MyBatis 的全局配置文件使用不同的 DTD 约束,在将应用由

 iBatis 升级至 MyBatis 时需要注意(两者的映射文件 DTD 约束也不相同)-->

 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

 <configuration>

 <!-- 配置数据源相关的信息 -->

 <environments default="demo">

 <environment id="demo">

 <transactionManager type="JDBC"/>

 <dataSource type="POOLED">

 <property name="driver" value= … />

 <property name="url" value= … />

 <property name="username" value="root"/>

 <property name="password" value="root"/>

 </dataSource>

 </environment>

 </environments>

 <!-- 列出映射文件 -->

 <mappers>

 <mapper resource="footmark/mybatis/demo/UserInfoMapper.xml"/>

 </mappers>

 </configuration>

有了这些信息,MyBatis便能够和数据库建立连接,并应用给定的连接池信息和事务属性。MyBatis封装了这些操作,最终暴露一个 SqlSessionFactory实例供开发者使用,从名字可以看出来,这是一个创建 SqlSession的工厂类,通过 SqlSession实例,开发者能够直接进行业务逻辑的操作,而不需要重复编写 JDBC相关的样板代码。根据全局配置文件生成 SqlSession的代码如下:

 Reader reader = Resources.getResourceAsReader("Configuration.xml");

 SqlSessionFactory sqlSessionFactory =

 new SqlSessionFactoryBuilder().build(reader);

 SqlSession sqlSession = sqlSessionFactory.openSession();

可以把上面的三行代码看做是 MyBatis创建 SqlSession的样板代码。其中第一行代码在类路径上加载配置文件,Resources MyBatis 提供的一个工具类,它用于简化资源文件的加载,它可以访问各种路径的文件,不过最常用的还是示例中这种基于类路径的表示方式。如果读者对 Hibernate有所了解,一定会发现 MyBatis不论是使用风格还是类名都和 Hibernate非常相像。

在完成全局配置文件,并通过 MyBatis获得 SqlSession对象之后,便可以执行数据访问操作了。对于 MyBatis而言,要执行的操作其实就是在映射文件中配置的 SQL语句。两者的配置基本相同,如下所示:

  2. 在映射文件中配置 SQL  语句

  <?xml version="1.0" encoding="UTF-8" ?>

 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 <mapper namespace="mybatis.demo.UserInfoMapper">

 <select id="selectUser" parameterType="int"

 resultType="mybatis.demo.UserInfo">

 select * from UserInfo where userid =#{userid}

 </select>

 </mapper>

iBatis中,namespace不是必需的,且它的存在没有实际的意义。在 MyBatis中,namespace终于派上用场了,它使得映射文件与接口绑定变得非常自然。关于接口绑定,后面会有篇幅专门描述。使用 SqlSession执行 SQL 的方式如下:


清单 3.  使用 SqlSession  执行映射文件中配置的 SQL  语句

  try

 {

 UserInfo userinfo = (UserInfo) sqlSession.selectOne

 ("mybatis.demo.UserInfoMapper.getUser", 2);

 System.out.println(userinfo);

 } finally

 {

 sqlSession.close();

 }

需要注意的是,SqlSession的使用必需遵守上面的格式,即在 finally块中将其关闭。以保证资源得到释放,防止出现内存泄露!

以上就是一个简单而完整的 MyBatis程序。其中涉及了全局配置文件,映射文件,构建 SqlSession对象,执行数据访问操作等四个步骤。

下面将针对除构建 SqlSession对象之外的三块内容进行分解。

MyBatis 全局配置文件的改变


清单 5.   MyBatis  中设置属性的方式

   <settings>

 <setting name="props1" value="value1"/>

 <setting name="props2" value="value2"/>

……

 </settings>

另外,之前配置事务管理器和数据源的方式如下:

 MyBatis中调整为如下的方式:

 

 MyBatis  中配置事务管理器和数据源的方式

 <environments default="demo">

 <environment id="demo">

 <transactionManager type="JDBC"/>

 <dataSource type="POOLED">

 <property name="JDBC.Driver" value="${driver}"/>

 <!-- 其他数据源信息省略 -->

 </dataSource>

 </environment>

 </environments>

通过<environments>来进行数据源管理,主要是为了简化在多套数据源配置之间的切换,比如开发和发布使用不同的配置。

 MyBatis  中指定映射文件的方式

   <mappers>

 <mapper resource=... />

 <mapper resource=... />

 </mappers>

上面的这些调整,主要出发点其实并不是使得 MyBatis功能更为强大,而是使配置更为合理,让开发者更容易阅读和理解。

 

 

 

2.以接口的方式编程

 

到目前为止,我们主要讨论了 XML形式的全局配置,其实这也不是唯一选择,MyBatis还提供了通过代码来进行配置的方式(略)。

需要注意的是 Configuration addMapper()方法,该方法的参数通常是一个接口,可以在接口里面定义若干方法,

1)     在方法上使用注解来指定映射的 SQL语句

一个典型的接口定义以及对应的数据访问方法如下:

·将映射的  SQL 语句与接口中的方法绑定:

    // 映射 SQL 绑定接口

 public interface UserInfoMapper

 {

 @Select("select * from userinfo where userid = #{userid}")

 public UserInfo getUserInfo(int userid);

 }

 // 接口绑定对应的数据访问方法

 try

 {

 //UserInfo userinfo = (UserInfo) sqlSession.selectOne

 ("mybatis.demo.UserInfoMapper.selectUser", 2);

 UserInfoMapper userinfoMapper =

 sqlSession.getMapper(UserInfoMapper.class);

 UserInfo userinfo = userinfoMapper.getUserInfo(1);

 System.out.println(userinfo);

 } finally

 {

 sqlSession.close();

 }

2)     不通过注解的方式

<mappernamespace="com.yihaomen.inter.IUserOperation">

 

       <selectid="selectUserByID" parameterType="int"resultType="User">

           select * from `user` where id = #{id}

       </select>

      

       <!--为了返回list 类型而定义的returnMap-->

       <resultMaptype="User" id="resultListUser">

       <id column="id" property="id" />

       <result column="userName" property="userName"/>

       <result column="userAge" property="userAge" />

       <result column="userAddress"property="userAddress" />

   </resultMap>

      

       <!--返回list 的select 语句,注意 resultMap 的值是指向前面定义好的 -->

       <selectid="selectUsers" parameterType="string"resultMap="resultListUser">

<!-- #{username}代表的是parameterType是string的参数值 -->

           select * from user where userName like#{userName}

       </select>

</mapper>

 

对应的IUserOperation类里面:

public interface IUserOperation {

       publicUser selectUserByID(int id);

       publicList<User> selectUsers(String userName);     

}




参考:http://blog.csdn.net/techbirds_bao/article/details/9233599

http://blog.csdn.net/hupanfeng/article/details/9238127


0 0
原创粉丝点击