简述Mybatis框架(一)

本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教。

简述Mybatis

Mybatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为Mybatis。Mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等复杂的过程。Mybatis通过xml方式和注解方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果映射为java对象并返回。该框架采用ORM(Object Relation Mapping)思想解决了实体和数据库的映射问题,对jdbc进行了封装,屏蔽了jdbc api底层访问的细节,使我们不用与jdbc api打交道就可以完成对数据库的持久化操作。

JDBC简单回顾

public static void main(String[] args)  {
    Connection  connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
        // 加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 通过驱动管理获取数据库连接
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?charsetEncoding=utf-8", "root", "root");
        // 定义sql语句?表示占位符
        String sql = "SELECT * FROM user WHERE username = ?";
        // 获取预处理statement
        preparedStatement = connection.prepareStatement(sql);
        // 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
        preparedStatement.setString(1, "张三");
        // 执行sql,并得到结果集
        resultSet = preparedStatement.executeQuery();
        // 遍历结果集
        while (resultSet.next()) {
            System.out.println(resultSet.getString("id") + ":" + resultSet.getString("username"));
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        // 释放资源
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

通过上面对JDBC的简单回顾,我们可以分析一下问题:

  1. 数据库频繁的连接、释放会造成系统资源的浪费从而影响系统的性能,可使用数据库连接池解决此问题。
  2. sql语句在代码中硬编码,造成了代码的不易维护,实际应用sql的变化可能较大,sql变动需要改变java的代码。
  3. prepareStatement中占位符传参数存在硬编码,因为可能sql语句变化较大,导致我们须修改sql的同时还要修改代码,系统不易维护。
  4. result结果集解析同样存在硬编码,理由同上。

Mybatis入门案例(使用xml方式)

步骤一:创建一个maven工程,我这里使用的是idea开发工具,目录结构如下,并在pom.xml文件添加所需的坐标。

<dependencies>
   <!-- 连接数据库坐标,我这里使用的mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    <!-- Mybatis坐标 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
</dependencies>

步骤二:准备所需的数据库、表以及记录信息。
在这里插入图片描述
在这里插入图片描述
步骤三:创建entity包并创建User实体类,实体类的名称以及属性名要和数据库的表名以及字段名对应起来(也可以不对应,我们会在后面提及),这就是ORM思想,让我们可以通过操作实体类来对数据库进行操作。

public class User {
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    // 自定添加get、set方法以及重写toString方法
    .......
}

步骤四:创建dao包并创创建UserDao接口。

public interface UserDao {
    /**
     * 查询所有user对象
     * @return
     */
    List<User> findAll();
}

步骤五:创建映射配置文件,在创建时需要注意创建的位置和名称,具体得看主配置文件如何注册映射文件。

<?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">
<!-- namespace:表示映射到哪个包下的哪个接口 -->
<mapper namespace="dao.UserDao">
    <!-- id:表示映射到这个接口的哪个方法,resultType:表示返回值的类型-->
    <select id="findAll" resultType="entity.User">
        SELECT * FROM user
    </select>
</mapper>

步骤六:创建Mybatis主配置文件,文件名自己随意起。

<?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>
    <!-- 配置mybatis的环境 -->
    <environments default="mysql">
        <!-- 配置mysql的环境 -->
        <environment id="mysql">
            <!-- 配置事物类型 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置连接数据库的信息:这里用的是数据源(连接池) -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/farmer"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

   
    <!-- 1.在注册映射文件时使用<package name="包名">标签时,需要映射文件名和接口名一样,不然会报错。-->
    <!-- 2.在注册映射文件时使用<mapper class="">mapper标签的class属性时,需要映射文件名和接口名一样,不然会报错。-->
    <!-- 3.在注册映射文件时使用<mapper resource="org/xx/demo/mapper/xx.xml"/>,不需要映射文件名和接口名一样 -->
    <!-- 注册映射文件 -->
    <mappers>
        <mapper resource="dao/UserDao.xml"></mapper>
    </mappers>
</configuration>

步骤七:编写测试类

public static void main(String[] args) throws IOException {
	    // 1.读取配置文件
	    InputStream in = Resources.getResourceAsStream("MapConfig.xml");
	    // 2.创建SqlSessionFactory的构建者对象
	    SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
	    // 3.使用构建者创建工厂对象SqlSessionFactory
	    SqlSessionFactory factory = factoryBuilder.build(in);
	    // 4.使用工厂对象生产session对象
	    SqlSession session = factory.openSession();
	    // 5.使用session对象创建dao接口的代理对象
	    UserDao userDao = session.getMapper(UserDao.class);
	    // 6.使用代理对象执行方法,并得到结果
	    List<User> users = userDao.findAll();
	    users.forEach(item -> System.out.println(item));
	    // 7.释放资源
	    session.close();
	    in.close();
}

控制台打印结果,第二张图片为工程目录结构。
在这里插入图片描述
在这里插入图片描述

Mybatis入门案例(使用注解方式)

只需要修改两处,一处是为接口添加注解,另一处时在主配置文件修改注册映射文件的方式,注意在使用注解方式时,请移除xml方式的映射文件,否则会出现下图错误。

public interface UserDao {
    /**
     * 查询所有user对象
     * @return
     */
    @Select("select * from user")
    List<User> findAll();
}
<!-- 修改注册映射文件的方式-->
<mappers> 
  <mapper class="dao.UserDao"/> 
</mappers> 

在这里插入图片描述

Mybatis简单分析

通过上面的简单使用,我们可以体会到Mybatis的便利性,在这里我们简单分析下Mybatis,来了解下它在底层究竟为我们做了什么,如图所示,我们可以从中总结出来,这里使用了三种设计模式,分别为构建者模式,工厂模式以及代理模式,而这三种模式的好处,我们也简单叙述了下。
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值