一文入门MyBatis!!!

MyBatis开山篇

1、MyBatis是什么?

MyBatis官方定义是这样描述的,MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的 XML或注解来配置和映射原始类型、接口和 Java POJO。

上面文字描述太官方了,整体读下来可能仅仅了解到MyBatis是用于解决持久层方案的一款持久层框架,那么,在我们没有使用过MyBatis之前,我们使用各种各样的持久层技术来与数据库交互,这些技术和MyBatis有什么不同呢?

2、传统的持久层技术

  • JDBC技术

  • SpringJdbcTemplate

Spring中对jdbc进行简单的封装。

  • Apache的DButils

它和Spring的JdbcTemplate很像,也是对jdbc进行简单的封装

上面列举的都不是框架,JDBC是一种规范,而JdbcTemplate和Dbutils都只是工具类。

既然有那么多技术用于持久层,那么我们为什么还要学MyBatis呢,我们先使用JDBC技术实现对一个数据库表的操作,看看有什么特点

JDBC编码技术

执行流程

  • 加载数据库驱动
  • 获取数据库连接
  • 定义sql语句
  • 预处理
  • 遍历查询结果集
  • 关闭连接
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/test","root", "root");
     //定义 sql 语句 ?表示占位符    
        String sql = "select * from user where username = ?"; 
        //获取预处理 statement    
        preparedStatement = connection.prepareStatement(sql); 
        //设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的 参数值 
        preparedStatement.setString(1, "Simon"); 
        //向数据库发出 sql 执行查询,查询出结果集 
        resultSet =  preparedStatement.executeQuery(); 
        //遍历查询结果集 
        while(resultSet.next()){ 
            System.out.println(resultSet.getString("id")+"   
                               "+resultSet.getString("username"));
                               }    
                       } catch (Exception 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) {  
                                   // TODO Auto-generated catch block     
                                   e.printStackTrace();      							
                                   } 
                               }
                           }
                       }

大家应该很熟悉这段代码吧,使用原生的JDBC会出现什么样的问题呢

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

查询一条语句那么繁琐,我们当然希望可以将我们的主要精力放在sql上,那么MyBatis是否有能力帮我们解决呢?它的执行有什么特点呢?

3、MyBatis入门

事实上,MyBatis封装了jdbc操作的很多细节,它可以使开发者更多的关注sql语句本身,而无需关注注册驱动、创建链接等繁琐的过程,它使用ORM的思想实现对结果集的封装。

ORM全称是Object Relational Mapping,即对象关系映射,即把数据库表和实体类即实体类的属性对应起来,使得我们可以操作实体类就可以实现操作数据库表。

3.1MyBatis框架结构

一文入门MyBatis!!!_第1张图片

  • SqlMapConfig.xml

MyBatis的全局配置文件,配置了MyBatis的运行环境等信息。

  • mapper.xml

mapper.xml文件,即sql映射文件,文件中配置了操作数据库的sql语句,需要在SqlMapperConfig.xml文件中加载

  • SqlSessionFactory

通过MyBatis环境等配置信息构造SqlSessionFactory会话工厂

  • SqlSession

由会话工厂创建sqlSession,操作数据库需要通过sqlSession进行

  • Executor

MyBatis底层自定义了Executor执行器接口操作的数据库,Executor接口有两个实现,一个是基本执行器,一个缓存执行器。

  • Mappered Statement

是一个底层封装对象,包装了MyBatis配置信息及sql映射信息等。

3.2MyBatis入门案例

  • 读取配置文件
  • 创建SqlSessionFactory工厂
  • 创建SqlSession
  • 创建Dao接口的代理对象
  • 执行dao中的方法
  • 释放资源

基于xml配置

  • SqlMapConfig配置文件
<?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>
    <!--配置mybatis的环境-->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&serverTimezone=UTC"></property>
                <property name="username" value="root"></property>
                <property name="password" value="root"></property>
            </dataSource>
        </environment>
    </environments>
    <!--告知mybatis的映射配置位置-->
    <mappers>
        <mapper resource="com/simon/dao/IUserDao.xml"></mapper>
    </mappers>
</configuration>
  • mapper.xml配置文件
<?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="com.simon.dao.IUserDao">
    <select id="findAll" resultType="com.simon.domain.User" >
        select * from user
    </select>
</mapper>
  • User实体类
package com.simon.domain;

import java.util.Date;

/**
 * @Author: Simon Lang
 * @Date: 2020/2/26 12:09
 * @Version 1.0
 */
public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private char sex;
    private String address;
  • dao接口
public interface IUserDao {
    public List<User> findAll();
}
  • 测试
 //导入配置文件
        InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建sqlSessionFactory的构建者对象
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        //使用构建者创建工厂对象sqlSessionFactory
        SqlSessionFactory factory=builder.build(in);
        //4.使用 SqlSessionFactory 生产 SqlSession 对象
        SqlSession session = factory.openSession();
        //5.使用 SqlSession 创建 dao 接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //6.使用代理对象执行查询所有方法
        List<User> users=userDao.findAll();
        for (User user:users){
            System.out.println(user);
        }
        session.close();
        in.close();

基于注解

  • 修改SqlMapConfig.xml
<mappers>
        <mapper class="com.simon.dao.IUserDao.xml">mapper>
    mappers>
  • 移除IUserDao.xml配置文件,并在dao接口的方法上加入@(select * from user)

参考

https://mybatis.org/mybatis-3/zh/getting-started.html

https://www.cnblogs.com/benjieqiang/p/11183580.html

一文入门MyBatis!!!_第2张图片

关注公众号:10分钟编程,让我们每天博学一点点

公众号回复success,领取独家整理的学习资源,JAVA、大数据全套视频资料

你可能感兴趣的:(后端,数据库,mybatis,java)