前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis 3学习笔记(一)主要内容:

Mybatis 3学习笔记(一)主要内容:

作者头像
阿杜
发布2018-08-06 11:54:03
3200
发布2018-08-06 11:54:03
举报
文章被收录于专栏:阿杜的世界

主要内容:

  • What is MyBatis?
  • Why MyBatis?
  • Installing and configuring MyBatis
  • Sample domain model

What is MyBaits?

MyBatis是一个开源持久化框架,用于简化持久层的实现。Mybatis可以减少很多JDBC相关的模板样式代码,还提供了方便使用的数据库API。

MyBatis发展自iBATIS,但是MyBatis 3对iBATIS进行了彻底的重构,从而可以使用注解(annotations)和映射器(Mappers)。

简洁的设计和易用性使得MaBatis在J2EE开发中很快流行起来。在Java应用中,持久层的工作包括:将SQL语句从数据库中查询出的数据填充进Java对象中、使用SQL语句将Java对象中的数据保存进数据库。

MyBatis提供了下列特性来简化SQL查询:(1)抽象底层的JDBC代码;(2)自动将SQL查询的结果集保存进对应的Java对象;(3)从Java对象中提取数据并存入数据库中对应的表。

ORM模型就是数据库的表和简单Java对象(Plain Ordinary Java Object,简称POJO)的映射关系模型,它主要解决数据库数据和POJO对象的映射。

Why MyBatis?

企业级应用开发领域有很多持久化开发框架,MyBatis能够脱颖而出的原因在于:

  • 减少了很多JDBC的模板样式代码;
  • 学习曲线低;
  • 可以很好地适配遗留数据库;
  • 开发者需要自己写SQL语句;
  • 可以和Spring、Guice等框架整合使用;
  • 支持第三方缓存库;
  • 具备良好的性能。

减少JDBC的模板样式代码

关于JDBC代码的冗长,可以参考Spring实战6-利用Spring和JDBC访问数据库一文中用过的例子。

直接使用JDBC的API,会有很多重复代码:创建连接、创建statement、设置输入参数,最后还需要关闭资源。MyBatis将这些通用功能抽象出来单独完成,以便开发者可以专注于真正重要的事情,包括书写SQL语句、构建Java对象等。

除了这些,MyBatis可以自动完成两个工作:把Java对象中的属性设置进SQL字符串的查询参数、利用SQL查询结果集的数据构造Java对象。实现方法如下:

  1. 在SQL Mapper配置文件中(StudentMapper.xml)配置查询语句
代码语言:javascript
复制
<select id="findStudentById" parameterType="int" resultType="Student">
    SELECT STUD_ID AS studId, NAME , EMAIL, DOB
    FROM STUDENTS WHERE STUD_ID=#{Id}
</select>
<insert id="insertStudent" parameterType="Student">
    INSERT INTO STUDENTS(STUD_ID, NAME, EMAIL, DOB)
    VALUES (#{studId}, #{name}, #{email}, #{dob})
</insert>
  1. 创建StudentMapper接口
代码语言:javascript
复制
public interface StudentMapper {
    Student findStudentById(Integer id);
    void insertStudent(Student student);
}
  1. 在Java代码中的用法如下
代码语言:javascript
复制
SqlSession session = getSqlSessionFactory().openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
// select Student by Id
Student student = mapper.selectStudentById(1);
// To insert a Student record
mapper.insertStudent(student);

可以看出,如果使用MyBatis框架,开发者不需要自己管理资源和处理异常,因为MyBatis会替你完成这些工作。除此之外,MyBatis还提供了其他特性,也可以简化持久层的实现:

  • 支持复杂SQL结果集到复杂对象的映射;
  • 支持1-1和1-n映射,将结果集中的数据映射到Java对象中;
  • 支持基于输入数据构建动态SQL查询。

学习曲线低

MyBatis的学习曲线很低,如果开发者之前熟悉Java和SQL开发,则只需要稍作学习就可以在项目中使用MyBatis。

可以很好地适配遗留数据库

有时候,我们需要使用不规范的遗留数据库。在维护老服务时经常遇到这种情况,使用类似Hibernate的ORM框架会非常麻烦,因为这类框架试图将Java对象映射到数据库中的表格里。

MyBatis可以自动将查询结果映射到Java对象中,这个特性使得MyBatis非常适合使用遗留数据库。

拥抱SQL语句

完全的ORM框架,例如Hibernate鼓励开发者直接使用实体对象,而由框架自动产生SQL语句。正因如此,导致开发者不能使用特定数据库的优化特性。Hibernate也允许开发者写SQL语句,但这又违背了“持久层应该与数据库独立”的承诺。

MyBatis让开发者自己写SQL语句,因此可以利用特定数据库的优化特性,例如支持使用数据库存储过程。

支持使用第三方缓存库

MyBatis本身支持在SqlSession层面缓存SELECT查询结果。除此之外,MyBatis也支持使用其他第三方缓存,例如EHCache、OSCache和Hazelcast。

更好的性能

大型企业级应用必须具备良好的性能。在性能分析时,一般使用调用链路分析法:业务操作、缓存操作和持久层。持久层的性能经常会成为应用的性能瓶颈。

  • MyBatis支持使用数据库连接池,从而避免为每个查询请求创建数据库连接;
  • MyBatis拥有内置的缓存机制,可以在SqlSession层面缓存SQL查询的结果——如果你在执行一个select查询之后不久又再次遇到同样的请求,则直接返回缓存区中的数据,从而节省一次数据库查询。
  • MyBatis并没有大量使用代理,因此比其他大量使用代理的ORM框架有更好的性能。

注意:在软件开发中没有万能的工具。每个应用场景都有不同的需求,我们应该根据具体的应用场景选择要使用的语言和框架。上文中讲了很多MyBatis的优势,不过,也有一些情况下并不适合使用MyBatis。如果应用是基于对象模型驱动并想动态生成SQL语句;另外,如果开发者希望在应用中使用透明的事务处理机制(持久化父对象的同时也持久化与之关联的子对象),这两种情况下都比较适合使用Hibernate。

安装和配置MyBatis

  1. 在数据库中创建students表,并插入例子数据;
代码语言:javascript
复制
create table students
(
stud_id int(11) not null auto_increment,
name varchar(50) not null,
email varchar(50) not null,
dob date default null,
primary key (stud_id)
) engine=InnoDB auto_increment=1 default charset=latin1;
insert into students(stud_id, name, email, dob)
values(1, 'Student1', 'student1@gmail.com', '1983-06-25');
insert into students(stud_id, name, email, dob)
values(2, 'Student2', 'student2@gmail.com', '1983-06-25');
  1. 创建一个maven项目,配置jar依赖项,pom文件的内容如下:
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javadu</groupId>
    <artifactId>leanMybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.spring.platform</groupId>
                <artifactId>platform-bom</artifactId>
                <version>2.0.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>4.2.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.13</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.13</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

然后,在resources目录下创建log4j.properties文件,填入如下内容:

代码语言:javascript
复制
log4j.rootLogger = DEBUG, stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d[%-5p] %c - %m%n
  1. 创建mybatis-config.xmlStudentMapper.xml配置文件,mybatis-config.xml作为MyBatis的主配置文件,用于定义数据库连接、类型别名等等;StudentMapper.xml配置文件包含操作students表的SQL语句。
  2. 首先,mybatis-config.xml文件的内容列举如下:
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org/DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias type="com.javadu.domain.Student" alias="Student" />
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <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="root" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mybatis/mappers/StudentMapper.xml" />
    </mappers>
</configuration>
  • 然后,StudentMapper.xml文件的内容列举如下:
代码语言:javascript
复制
<?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.mappers.StudentMapper">
    <resultMap id="studentResult" type="Student">
        <id property="studId" column="sutd_id" />
        <result property="name" column="name" />
        <result property="email" column="email" />
        <result property="dob" column="dob" />
    </resultMap>

    <select id="findAllStudents" resultMap="studentResult">
        SELECT * FROM students
    </select>

    <select id="findStudentById" parameterType="int" resultType="Student">
        SELECT stud_id as studid, name, email, dob
        FROM students
        WHERE stud_id=#{id}
    </select>

    <insert id="insertStudent" parameterType="Student">
        INSERT INTO students(stud_id, name, email, dob)
        VALUES (#{studId}, #{name}, #{email}, #{dob})
    </insert>
</mapper>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.02.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • What is MyBaits?
  • Why MyBatis?
    • 减少JDBC的模板样式代码
      • 学习曲线低
        • 可以很好地适配遗留数据库
          • 拥抱SQL语句
            • 支持使用第三方缓存库
              • 更好的性能
              • 安装和配置MyBatis
              相关产品与服务
              云数据库 Redis
              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档