MyBatis框架学习_01

概述

MyBatis框架概述

​ mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

​ mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。

​ 采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。

JDBC编程分析

JDBC操作数据库的步骤

  1. 注册驱动
  2. 获取连接
  3. 获取执行SQL语句对象
  4. 执行SQL
  5. 获取结果集,封装数据
  6. 释放资源

问题分析

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
  2. Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
  3. 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
  4. 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

MyBatis框架快速入门

下载MyBatis

官网下载Mybatis框架: http://www.mybatis.org/mybatis-3/zh/index.html

搭建MyBatis开发环境

  1. 创建maven工程

  2. 添加MyBatis坐标

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <dependencies>
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.5</version>
    </dependency>
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.6</version>
    </dependency>
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.12</version>
    </dependency>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    </dependency>
    </dependencies>
  3. 编写User实体类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    package wzc.domain;

    import java.io.Serializable;
    import java.util.Date;

    public class User implements Serializable{

    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public Integer getId() {
    return id;
    }

    public void setId(Integer id) {
    this.id = id;
    }

    public String getUsername() {
    return username;
    }

    public void setUsername(String username) {
    this.username = username;
    }

    public Date getBirthday() {
    return birthday;
    }

    public void setBirthday(Date birthday) {
    this.birthday = birthday;
    }

    public String getSex() {
    return sex;
    }

    public void setSex(String sex) {
    this.sex = sex;
    }

    public String getAddress() {
    return address;
    }

    public void setAddress(String address) {
    this.address = address;
    }

    @Override
    public String toString() {
    return "User{" +
    "id=" + id +
    ", username='" + username + '\'' +
    ", birthday=" + birthday +
    ", sex='" + sex + '\'' +
    ", address='" + address + '\'' +
    '}';
    }
    }
  1. 编写持久层接口IUserDao

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package wzc.dao;

    import wzc.domain.User;

    import java.util.List;

    /**
    * 用户的持久层接口
    */
    public interface IUserDao {

    /**
    * 查询所有操作
    * @return
    */
    List<User> findAll();
    }
  2. 编写持久层接口的映射文件IUserDao.xml

    注意:

    1. 此配置文件创建位置必须和持久层接口在相同的包中。
    2. 名称必须以持久层接口名称命名,扩展名是.xml.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?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="wzc.dao.IUserDao">
    <!-- 配置查询所有 -->
    <select id="findAll" resultType="wzc.domain.User">
    SELECT * FROM user
    </select>
    </mapper>
  1. 编写SqlMapConfig.xml配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?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">

    <!-- mybatis的主配置文件 -->
    <configuration>
    <!-- 配置环境 -->
    <environments default="mysql">
    <!-- 配置mysql的环境 -->
    <environment id="mysql">
    <!-- 配置事务的类型 -->
    <transactionManager type="JDBC"></transactionManager>
    <!-- 配置数据源(连接池) -->
    <dataSource type="POOLED">
    <!-- 配置连接数据库的4个基本信息-->
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    </dataSource>
    </environment>
    </environments>

    <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
    <mappers>
    <mapper resource="wzc/dao/IUserDao.xml"/>

    </mappers>

    </configuration>
  1. 编写测试类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    package wzc.test;

    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import wzc.dao.IUserDao;
    import wzc.domain.User;

    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;

    /**
    * MyBatis的入门案例
    */
    public class MybatisTest {

    /**
    * 入门案例
    * @param args
    */
    public static void main(String[] args) throws IOException {
    //1.读取配置文件
    InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
    //2.创建SqlSessionFactory工厂
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = builder.build(in);
    //3.使用工厂生产SqlSession对象
    SqlSession session = factory.openSession();
    //4.使用SqlSession创建Dao接口的代理对象
    IUserDao userDao = session.getMapper(IUserDao.class);
    //5.使用代理对象执行方法
    List<User> users = userDao.findAll();
    for (User user : users) {
    System.out.println(user);
    }
    //6.释放资源
    session.close();
    in.close();
    }
    }

总结

​ 整体项目结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
─src
├─main
│ ├─java
│ │ └─wzc
│ │ ├─dao
│ │ │ IUserDao.java
│ │ │
│ │ └─domain
│ │ User.java
│ │
│ └─resources
│ │ log4j.properties
│ │ SqlMapConfig.xml
│ │
│ └─wzc
│ └─dao
│ IUserDao.xml

└─test
└─java
└─wzc
└─test
MybatisTest.java

​ 通过快速入门示例,我们发现使用mybatis是非常容易的一件事情,因为只需要编写Dao接口并且按照mybatis要求编写两个配置文件,就可以实现功能。远比之前的jdbc方便多了。

基于注解的MyBatis使用

  1. 在持久层接口中添加注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package wzc.dao;

    import org.apache.ibatis.annotations.Select;
    import wzc.domain.User;
    import java.util.List;

    /**
    * 用户的持久层接口
    */
    public interface IUserDao {

    /**
    * 查询所有操作
    * @return
    */
    @Select("SELECT * FROM user")
    List<User> findAll();
    }
  2. 修改SqlMapConfig.xml

    1
    2
    3
    4
    5
    6
    <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件
    如果是注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名
    -->
    <mappers>
    <mapper class="wzc.dao.IUserDao"/>
    </mappers>
  3. 注意事项

    在使用基于注解的Mybatis配置时,必须移除xml的映射配置(IUserDao.xml),否则会报错。

0%