初识Mybatis,您可太棒了

这是学习Mybatis的第一天,冲冲冲!

一. 什么是框架

简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

框架的重要性

框架一般处在低层应用平台(如 J2EE)和高层业务逻辑之间的中间层,框架封装了很多细节,使开发者可以用极简的方式开发功能,大大提高了开发效率
框架的重要性在于它实现了部分功能,并且能够很好的将低层应用平台和高层业务逻辑进行了缓和。
为了实现软件工程中的“高内聚、低耦合”。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。我们常见的 MVC 软件设计思想就是很好的分层思想。
刚从javaweb上来的同学有必要了解一下三层架构在ssm框架中的对应关系
在这里插入图片描述

Mybatis框架概述

mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis通过xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并 返回。
采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
ORM: object relational Mappging 对象关系映射
简单的说就是: 把数据库表实体类及实体类的属性对应起来,让我们操作实体类就实现操作数据库表.
实体类中的属性要和数据库表的字段名保持一致:
user User
id id
user_name user_name

二. 持久层技术解决方案

  1. JDBC技术:
    connection
    preparedStatement
    ResultSet
  2. spring的JdbcTemplate
    Spring对jdbc的简单封装
  3. Apache的DButils
    它和spring的JdbcTemplate很像,也是对Jdbc的简单封装

以上都不是框架:
JDBC是规范
spring的JdbcTemplate和Apache的Dbutils都是工具类

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/mybatis?characterEncoding=utf-8","ro ot", "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 (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 的原始方法(未经封装)实现了查询数据库表记录的操作。 

jdbc 问题分析

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

三. Mybatis入门

mybatis环境搭建

第一步:创建maven工程并导入坐标
第二步:创建实体类和dao的接口
第三步:创建Mybatis的主配置文件
sqlMapconfig.xml
第四步:创建映射配置文件
IUserDao.xml

环境搭建的注意事项
第一个:创建IUserDao.xml和IUserDao.java是为了和我们之前的知识保持一致。
在Mybatis中把持久层的操作接口名称和映射文件也叫作:mapper
所以IUserDao和IUserMapper是不一样的
第二个:在idea中创建目录的时候,它和包是不一样的包在创建时,com.zzd.dao是三级结构,目录在创建时com.zzd.dao是一级目录。
在这里插入图片描述
关于如何建目录创建多级package:

在这里插入图片描述
点击取消即可
第三个
mybatis的映射配置文件位置必须和dao接口的包结构相同
第四个
映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
第五个
映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名

IDEA创建步骤

  1. 创建Maven项目
  2. 在 pom.xml 文件中添加 Mybatis3.4.5 的坐标,如下:
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
</dependencies>

3.编写 User 实体类

package com.zzd.domain;

import java.util.Date;

/**
 * @author 张振东
 * @version V1.0
 * @Title:
 * @Package
 * @Description: (用一句话描述该文件做什么)
 * @date:
 */
public class User {
   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
package com.zzd.dao;

import com.zzd.domain.User;

import java.util.List;

/**
 * @author 张振东
 * @version V1.0
 * @Title:
 * @Package
 * @Description: (用一句话描述该文件做什么)
 * @date:
 */
public interface IUserDao {
   /**
    * 查询所有用户   * @return
    */
   List<User> findAll();
}
  1. 编写持久层接口的映射文件 IUserDao.xml
    要求: 创建位置:必须和持久层接口在相同的包中。
    名称:必须以持久层接口名称命名文件名,扩展名是.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.zzd.dao.IUserDao">   <!-- 配置查询所有操作 -->
    <select id="findAll" resultType="com.zzd.domain.User">
   select * from user
    </select>
</mapper>
  1. 编写 SqlMapConfig.xml 配置文件
<?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">   <!-- 配置 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/firstdb?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="zzd..000"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 告知 mybatis 映射配置的位置 -->
    <mappers>
        <mapper resource="com/zzd/dao/IUserDao.xml"/>
    </mappers>
</configuration>
  1. 编写测试类
import com.zzd.dao.IUserDao;
import com.zzd.domain.User;
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 java.io.InputStream;
import java.util.List;

/**
 * @author 张振东
 * @version V1.0
 * @Title:
 * @Package
 * @Description: (用一句话描述该文件做什么)
 * @date:
 */
public class MybatisTest {
   public static void main(String[] args) throws Exception {
      //1.读取配置文件
      InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
      //2.创建 SqlSessionFactory 的构建者对象
      SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
      //3.使用构建者创建工厂对象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);
      }
      //7.释放资源
      session.close();
      in.close();
   }

}

补充(基于注解的 mybatis 使用)

  1. 在持久层接口中添加注解
/**  *   * <p>Title: IUserDao</p> 
 * <p>Description: 用户的持久层操作</p> 
 *  * <p>Company: http://www.itheima.com/ </p>  
 *  */ public interface IUserDao {    /** 
  * 查询所有用户   * @return   */ 
  *  @Select("select * from user")  
  * List<User> findAll(); }
  1. 修改 SqlMapConfig.xml
<!-- 告知 mybatis 映射配置的位置 --> <mappers> 
 <mapper class="com.itheima.dao.IUserDao"/> </mappers> 
  1. 注意事项: 在使用基于注解的 Mybatis 配置时,请移除 xml 的映射配置(IUserDao.xml)

小结

通过快速入门示例,我们发现使用 mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 mybatis 要求编写两个配置文件,就可以实现功能。远比我们之前的 jdbc 方便多了。(我们使用注解之后,将变得 更为简单,只需要编写一个 mybatis 配置文件就够了。)
但是,这里面包含了许多细节,比如为什么会有工厂对象(SqlSessionFactory),为什么有了工厂之后还 要有构建者对象(SqlSessionFactoryBuilder),为什么 IUserDao.xml 在创建时有位置和文件名的要求等等。
这些问题我们在自定义 mybatis 框架的章节,通过层层剥离的方式,给大家讲解。
请注意:自定义 Mybatis 框架,不是让大家回去自己去写个 mybatis,而是让我们能更好了了解 mybatis 内部是怎么执行的,在以后的开发中能更好的使用 mybatis 框架,同时对它的设计理念(设计模式)有 一个认识

在这里插入图片描述
END!!! 下篇接着介绍。

原创文章 58 获赞 177 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43688587/article/details/105833103