Mybatis从头到尾(一)--MyBatis简介及项目搭建

一、简介

MyBatis的前身是iBATIS,是ClintonBegin在2001年发起的一个开源项目,最初侧重于密码软件的开发,后来发展成为一款基于Java的持久层框架。2004年,Clinton将iBATIS的名字和源码捐赠给了Apache软件基金会,接下来的6年中,开源软件世界发生了巨大的变化,一切开发实践、基础设施、许可,甚至数据库技术都彻底改变了。2010年,核心开发团队决定离开Apache软件基金会,井且将iBATIS改名为MyBatis。

MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用XML或注解进行配置和映射,MyBatis通过将参数映射到配置的SQL形成最终执行的SQL语句,最后将执行SQL的结果映射成Java对象返回。

与其他的ORM(对象关系映射)框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。MyBatis允许用户充分利用数据库的各种功能,例如存储过程、视图、各种复杂的查询以及某数据库的专有特性。如果要对遗留数据库、不规范的数据库进行操作,或者要完全控制SQL的执行,MyBatis将会是一个不错的选择。

与JDBC相比,MyBatis简化了相关代码,SQL语句在一行代码中就能执行。MyBatis提供了一个映射引擎,声明式地将SQL语句的执行结果与对象树映射起来。通过使用一种内建的类XML表达式语言,SQL语句可以被动态生成。MyBatis支持声明式数据缓存(declarativedatacaching)。当一条SQL语句被标记为“可缓存”后,首次执行它时从数据库获取的所有数据会被存储在高速缓存中,后面再执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库。MyBatis提供了默认情况下基于JavaHashMap的缓存实现,以及用于与OSCache、Ehcache、Hazeleast和Memcached连接的默认连接器,同时还提供了API供其他缓存实现使用。

二、添加Maven依赖

<dependency>
    <groupid>junit</groupid>
    <artifactid>junit</artifactid>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<!-- 最新版本号3.5.2 -->
<dependency>
    <groupid>org.mybatis</groupid>
    <artifactid>mybatis</artifactid>
    <version>3.5.2</version>
</dependency>
<dependency>
    <groupid>mysql</groupid>
    <artifactid>mysql-connector-java</artifactid>
    <version>5.1.38</version>
</dependency>
<dependency>
    <groupid>org.slf4j</groupid>
    <artifactid>slf4j-api</artifactid>
    <version>1.7.12</version>
</dependency>
<dependency>
    <groupid>org.slf4j</groupid>
    <artifactid>slf4j-log4j12</artifactid>
    <version>1.7.12</version>
</dependency>
<dependency>
    <groupid>log4j</groupid>
    <artifactid>log4j</artifactid>
    <version>1.2.17</version>
</dependency>

三、运行项目

3.1 准备数据库

  1. 本地创建一个mybatis的数据库;
  2. 创建一个country(国家)的表,添加3个字段“id”, "countryname"(名称), "countycode"(代码)。

3.2 Mybatis配置文件

使用XML形式进行配置,首先在src/main/resources下面创建mybatis-config.xml配置文件,然后输入如下内容。

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTDConfig3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logimpl" value="LOG4J"/>
    </settings>
    <typeAliases>
        <package name="tk.mybatis.simple.model"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC">
                <property name=""value=""/>
            </transactionManager>
            <dataSource type="UNPOOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapperre source="tk/mybatis/simple/mapper/CountryMapper.xml"/>
    </mappers>
</configuration>

3.3 创建对应实体和Mapper.xml文件

MyBatis是一个结果映射框架,这里创建的实体类实际上是一个数据值对象(DataValueObject),在实际应用中,一个表一般会对应一个实体,用于INSERT、UPDATE、DELETE和简单的SELECT操作,所以姑且称这个简单的对象为实体类。

关于Mapper的命名方式:在MyBatis中,根据MyBatis官方的习惯,一般用Mapper作为XML和接口类名的后缀,这里的Mapper和我们常用的DAO后缀类似,只是一种习惯而已,本书中全部使用Mapper后缀。通常称XML为Mapper.xml文件,称接口为Mapper接口,在实际应用中可以根据自己的需要来定义命名方式。

 创建一个Country的Java Bean,包括属性id,countryname,countrycode。

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTDConfig3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<mapper namespace ="tk.mybatis.simple.mapper.CouηtryMapper">
    <select id= "selectAll" resultType="Country">
        select id , countryname , countrycode from country
    </select>
<mapper>
  • <mapper>:XML的根元素,属性namespace定义了当前XML的命名空间。
  • <select>元素:我们所定义的一个SELECT查询。
  • id属性:定义了当前SELECT查询的唯一一个id。
  • resultType:定义了当前查询的返回值类型,此处就是指实体类Country,前面配置中提到的别名主要用于这里,如果没有设置别名,此处就需要写成resultType=”tk.mybatis.simple.model.Country”。
  • selectid,...:查询SQL语句。

3.4 配置Log4j 

在src/main/resources中添加log4j.properties配置文件,输入如下内容。

#全局配置
log4j.rootLogger=ERROR,stdout
#MyBatis日志配直
log4j.logger.tk.mybatis.simple.mapper=TRACE
#控制台输出配置
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

用过Log4j日志组件的人可能都会知道,配置中的log4j.logger.tk.mybatis.simple.mapper对应的是tk.mybatis.simple.mapper包,但是在这个例子中,Java目录下并没有这个包名,只在资源目录下有mapper目录。

在MyBatis的日志实现中,所谓的包名实际上是XML配直中的口amespace属性值的一部分。后面章节中介绍结合接口使用的相关内容时,由于namespace属性值必须和接口全限定类名相同,因此才会真正对应到Java中的包。当使用纯注解方式时,使用的就是纯粹的包名。

MyBatis日志的最低级别是TRACE,在这个日志级别下,MyBatis会输出执行SQL过程中的详细信息,这个级别特别适合在开发时使用。

3.5 测试Mybatis核心代码

@Test
public void testSelectAll() {
    Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    List<Country> countryList = sqlSession.selectList("selectAll");
    System.out.println(countryList);
}

对上面这段代码做一个简单的说明,具体如下。

  1. 通过Resources工具类将mybatis-config.xml配置文件读入Reader。
  2. 再通过SqlSessionFactoryBuilder建造类使用Reader创建SqlSessionFactory工厂对象。在创建SqlSessionFactory对象的过程中,首先解析mybatis-config.xml配置文件,读取配置文件中的mappers配置后会读取全部的Mapper.xml进行具体方法的解析,在这些解析完成后,SqlSessionFactory就包含了所有的属性配置和执行SQL的信息。
  3. 使用时通过SqlSessionFactory工厂对象获取一个SqlSessiono。
  4. 通过SqlSession的selectList方法查找到CountryMapper.xml中id="selectAll"的方法,执行SQL查询。
  5. MyBatis底层使用JDBC执行SQL,获得查询结果集ResultSet后,根据resultType的配置将结果映射为Country类型的集合,返回查询结果。
  6. 这样就得到了最后的查询结果countryList,简单将结果输出到控制台。
  7. 最后一定不要忘记关闭SqlSession,否则会因为连接没有关闭导致数据库连接数过多,造成系统崩旗。

从日志中可以看到完整的SQL输出和结果输出,从日志对应的级别可以发现SQL、参数、结果数都是DEBUG级别,具体的查询结果列和数据都是TRACE级别。

 四、小结

在本章中,我们对MyBatis有了一个简单的认识,学习了如何创建一个使用Maven管理的项目,涉及了一些MyBatis的简单配置以及使用方法,井让一个简单的MyBatis项目跑了起来。在后面的章节中,我们会继续深入地学习MyBatis的各项配置以及各种常见的、复杂的用法。

@本系列文章参考《Mybatis入门到精通》-刘增辉-电子工业出版社-请支持正版图书,内容为自己整理,如有侵权请留言删除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值