初始MyBatis框架

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、框架技术概述

框架的概念

框架(Framework)是一种经过检验的、具有特定功能的半成品软件。

作用

1.可以节省大量基础代码的编写工作,从而提高工作效率和开发速度,为构建新的应用程序提供了极大的便利。
2.可以使混乱的东西变得结构化、规范化。
3.提供了优秀的架构设计,保证了应用结构风格统一,且为基础功能提供了优质的实现。

二、主流框架技术简介

MyBatis框架

MyBatis 框架是一个基于 ORMobject Relational Mapping,对于/关系映射)的优秀的持久化框架。但是,MyBatis框架不是一个完整的 ORM 实现,而是一种半自动化的 ORM 实现。MyBatis 框架的主要特点是 SQL 映射器机制。MyBatis 框架使用 XML 或注解将 Java 中的接口和 POJOPlain Ordinary Java Object,普通的 Java 对象)与 SQL 语句结合在一起,使用灵活、简单易学、性能优秀,并且随着互联网企业和应用的兴起而得到广泛应用。

Sqring框架

Sqring 框架是一个开源的、轻量的企业应用框架,覆盖了 Java EE 技术的方方面面。Sqring 框架的设计目标是实现有的 Java EE 技术更容易使用,促进开发人员养成良好的编程习惯。Sqring 框架主要作为依赖注入容器和 AOP 实现存在,可以很方便地与MyBatisHibernate Struts2 等框架集成使用,使应用程序的架构更加轻巧优雅,开发过程更加快捷高效。

Spring MVC框架

Spring MVC 框架的正式名称是 “Sprint Web MVC ”,是基于 Servlet API 构建的 Web 框架,从一开始就包含在 Sprint Framework 中,是目前最主要的 MVC 框架。Spring MVC* 框架是全功能 MVC 模块,结构清晰、使用灵活,具有高度的可配置性,可以方便地进行定制化开发,所支持的视图技术非常全面。

Hibernate框架

Hibernate 框架是一个优秀的持久化框架,是一个典型的 ORM 解决方案,通过简单地配置和编码即可实现烦琐的 JDBC 代码才能实现的功能,具有出色的封装性和移植性,

Struts2框架

Struts2 框架是一个基于 WebMVC 框架。Struts2 框架借鉴了 WebWork 框架的优秀设计,引入了多种新特性。如拦截器、值钱、OGNL 表达式语言,而默认设置注解及 “惯例重于配置” 原则等待性的应用能够大大减少 XML 配置。

三、数据的持久化及ORM

持久化简介

持久化就是将内存中有用的数据以某种技术保存起来,并且可以再次取出来应用。即可以将内存中的数据模型(可以是任意数据结构或对象模型)转换为存储模型(可以是XML\二进制流、关系模型等),以及将存储模型转换为内存中的数据模型。数据库技术及将数据以文件形式保存在永久介质(磁盘等)中的序列化技术等,都是对数据进行持久化的例子。

ORM简介

ORM是一种在关系型数据库和面向对象编程语言之间进行数据转换的编程技术。它试图通过在对象模型和数据库关系模型之间建立起对应关系,从而达到通过JavaBean对象操作数据库表中数据的目的,如图所示:
在这里插入图片描述

四、使用MyBatis框架实现数据库操作

MyBatis框架的主要思想

将SQL语句从程序代码中分离出来,配置在XML文件中,便于统一管理,降低程序的耦合度。

好处

1.分离JDBC中的变化部分,抽象出规律性的内容进行封装,MyBatis框架的API封装了所有JDBC访问数据库的代码,从程序中消除了所有SQL参数设置及处理结果及的JDBC代码。  
2.实现对SQL语句的灵活管理,可以直接在XML文件中修改SQL语句而不影响程序代码。

搭建基于MyBatis框架的开发环境

MyBatis环境搭建的基本步骤:
1.创建项目
在这里插入图片描述
在这里插入图片描述
2.编写pom.xml文件
引入jar包,添加编译配置。

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.bdqn</groupId>
  <artifactId>MyBatis</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>MyBatis</name>
  <dependencies>
    <!-- 引入MySQL驱动包 -->
    <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
      <version>8.2.0</version>
    </dependency>
    <!-- 引入MyBait(数据库操作框架) -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.16</version>
    </dependency>
    <!-- 引入Log4j -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <!-- 打包文件名称 -->
    <finalName>MyBatis</finalName>
      <!-- 资源文件配置 -->
      <resources>
        <resource>
          <!-- 资源文件目录 -->
          <directory>src/main/resources</directory>
          <!-- 编译引入的文件 -->
          <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
          </includes>
        </resource>
      </resources>
  </build>
</project>

3.编写配置文件
src/main/resources目录中编写如下配置文件:

数据源配置文件 database.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/convenience?serverTimezone=GMT-8
username=root
password=root

日志配置文件 log4j.properties

log4j.rootLogger=DEBUG,console,logfile

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %m%n

log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] %m%n

log4j.logger.com.bdqn.mapper=debug
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug

MyBatis核心配置文件 mybatis-config.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>
    <!-- 引入database.properties配置 -->
    <properties resource="database.properties"/>
    <!-- 设置MyBatis框架的运行时行为 -->
    <settings>
        <!-- 使用log4j作为MyBatis框架的日志实现 -->
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!-- 配置MyBatis框架的运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 配置事务管理器,采用JDBC事务,由应用自行管理事务 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源,POOLED:MyBatis 提供的数据源,JNDI:JNDI 数据源 -->
            <dataSource type="POOLED">
                <!-- 使用${}引用定义的参数,此处参数来自database.properties 文件-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置映射文件 -->
    <mappers>
        <mapper resource="mapper/SysUserMapper.xml"/>
    </mappers>
</configuration>

4.编写代码
src/main/java/ 目录中建立对应的包结构编写代码。

① 实体类 com.bdqn.entity

新建 SysUser.java

package com.bdqn.entity;

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

/**
 * 系统用户
 *
 */
public class SysUser implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键ID
     */
    private Integer id;

    /**
     * 账号
     */
    private String account;

    /**
     * 真实姓名
     */
    private String realName;

    /**
     * 密码
     */
    private String password;

    /**
     * 性别(1:女、 2:男)
     */
    private Integer sex;

    /**
     * 出生日期(年-月-日)
     */
    private Date birthday;

    /**
     * 手机号码
     */
    private String phone;

    /**
     * 用户地址
     */
    private String address;

    /**
     * 用户角色id
     */
    private Integer roleId;
    
    /**
     * 创建人
     */
    private Integer createdUserId;

    /**
     * 创建时间
     */
    private Date createdTime;

    /**
     * 修改人
     */
    private Integer updatedUserId;

    /**
     * 修改时间
     */
    private Date updatedTime;
    
    public SysUser() {
    }

    public SysUser(String account, String password, String realName, Integer sex, Date birthday, String address, String phone, Integer roleId, Integer createdUserId, Date createdTime, Integer updatedUserId, Date updatedTime) {
        this.account = account;
        this.password = password;
        this.realName = realName;
        this.sex = sex;
        this.birthday = birthday;
        this.address = address;
        this.phone = phone;
        this.roleId = roleId;
        this.createdUserId = createdUserId;
        this.createdTime = createdTime;
        this.updatedUserId = updatedUserId;
        this.updatedTime = updatedTime;
    }

    public SysUser(Integer id, String account, String password, String realName, Integer sex, Date birthday, String address, String phone, Integer roleId, Integer createdUserId, Date createdTime, Integer updatedUserId, Date updatedTime) {
        this.id = id;
        this.account = account;
        this.password = password;
        this.realName = realName;
        this.sex = sex;
        this.birthday = birthday;
        this.address = address;
        this.phone = phone;
        this.roleId = roleId;
        this.createdUserId = createdUserId;
        this.createdTime = createdTime;
        this.updatedUserId = updatedUserId;
        this.updatedTime = updatedTime;
    }

    @Override
    public String toString() {
        return "SysUser{" +
                "id=" + id +
                ", account='" + account + '\'' +
                ", password='" + password + '\'' +
                ", realName='" + realName + '\'' +
                ", sex=" + sex +
                ", birthday=" + birthday +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                ", roleId=" + roleId +
                ", createdUserId=" + createdUserId +
                ", createdTime=" + createdTime +
                ", updatedUserId=" + updatedUserId +
                ", updatedTime=" + updatedTime +
                '}';
    }

    public Integer getId() {
        return id;
    }

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

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

    public Integer getSex() {
        return sex;
    }

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

    public Date getBirthday() {
        return birthday;
    }

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

    public String getAddress() {
        return address;
    }

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

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Integer getRoleId() {
        return roleId;
    }

    public void setRoleId(Integer roleId) {
        this.roleId = roleId;
    }

    public Integer getCreatedUserId() {
        return createdUserId;
    }

    public void setCreatedUserId(Integer createdUserId) {
        this.createdUserId = createdUserId;
    }

    public Date getCreatedTime() {
        return createdTime;
    }

    public void setCreatedTime(Date createdTime) {
        this.createdTime = createdTime;
    }

    public Integer getUpdatedUserId() {
        return updatedUserId;
    }

    public void setUpdatedUserId(Integer updatedUserId) {
        this.updatedUserId = updatedUserId;
    }

    public Date getUpdatedTime() {
        return updatedTime;
    }

    public void setUpdatedTime(Date updatedTime) {
        this.updatedTime = updatedTime;
    }
}

② Mapper接口 com.bdqn.mapper

新建 SysUserMapper.java 接口

package com.bdqn.mapper;

public interface SysUserMapper {
    /**
     * 统计用户数量的方法
     *
     * @return
     */
    int count();

}

③ 编写Mapper映射文件 src/main/resources/mapper

新建 SysUserMapper.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.bdqn.mapper.SysUserMapper">
    <!-- 查询统计用户数量 -->
    <select id="count" resultType="int">
        select count(1) from t_sys_user
    </select>
</mapper>

④ 编写测试类的工具类 com.bdqn.utils

新建 MyBatisUtil.java

package com.bdqn.utils;

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.IOException;
import java.io.InputStream;

/**
 * MyBatisUtil 工具类
 *
 */
public class MyBatisUtil {
    private static final SqlSessionFactory factory;

    static {
        //通过静态代码块,创建SqlSessionFactory实例
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            throw new RuntimeException("初始化失败",e);
        }
    }

    //创建返回SqlSession实例
    public static SqlSession createSqlSession(){
        return factory.openSession(false);//关闭自动提交开启事务
    }

    //关闭SqlSession
    public static void closeSqlSession(SqlSession sqlSession){
        if (sqlSession != null){
            sqlSession.close();
        }
    }
}

5.测试运行
在测试目录 src/test/java/com/bdqn

新建 SysUserMapperTest.java

package com.bdqn;

import com.bdqn.mapper.SysUserMapper;
import com.bdqn.utils.MyBatisUtil;
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 org.apache.log4j.Logger;
import org.junit.Test;

import java.io.InputStream;

import static org.junit.Assert.*;

public class SysUserMapperTest {

    private final Logger logger = Logger.getLogger(SysUserMapperTest.class);
    private SqlSession sqlSession = MyBatisUtil.createSqlSession();

    @Test
    public void count() throws Exception{

        try {
            String resource = "mybatis-config.xml";
            InputStream is = Resources.getResourceAsStream(resource);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            sqlSession = factory.openSession();
            int count = sqlSession.getMapper(SysUserMapper.class).count();
            logger.debug("总数据量:"+ count);
        }finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
    }
}

运行测试方法 count():
在这里插入图片描述

运行结果:
在这里插入图片描述

MyBatis框架的优点

1.与直接使用JDBC相比,代码量减少50%以上。
2.简单小巧且易学易用,能够快速上手应用。
3.基于原生SQL,使用灵活,不会对数据库的现有设计产生任何影响。
4.SQL语句通过XML文件进行维护,与程序代码解耦,便于统一管理和优化,并可方便的重用。
5.支持编写动态SQL语句,与应用代码解耦。
6.支持Java对象属性与查询结果集字段的映射(ORM)

MyBatis框架的缺点

1.SQL语句的编写工作量大,且对开发人员的SQL使用经验有一定要求
2.原生SQL语句依赖特定的数据库产品,导致数据库移植性差,不能方便的更换数据。

五、MyBatis框架的基本要素

MyBatis框架三个基本要素:

  • 核心接口和类
  • 核心配置文件(mybatis-config.xml)
  • SQL映射文件

MyBatis框架的核心对象

MyBatis框架的核心对象包括核心接口和类。如图所示:
在这里插入图片描述

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 负责根据配置信息构建SqlSessionFactory。

SqlSessionFactoryBuilder

由SqlSessionFactoryBuilder 构建的 SqlSessionFactory 实例是 MyBatis 框架应用的核心。

SqlSession

SqlSession 用于执行持久化操作,它提供了面向数据库执行 SQL 命令的能力。

MyBatis框架的核心配置文件

configuration配置
properties属性
settings设置
typeAliases类型别名
typeAliases类型处理器
environments开发环境
dataSource数据源
mappers映射器

属性(properties)

用来读取外部配置文件,这些属性可以在外部进行配置如下:

<!-- 引入database.properties配置 -->
<properties resource="database.properties"/>

设置(settings)

设置项描述允许值默认值
cacheEnabled对此配置文件下所有SQL映射的缓存进行全局性开/关设置true / falsetrue
lazyLoadingEnabled全局启用或禁用延迟加载。启用后,所有关系都会延迟加载true / falsefalse
autoMappingBehavior指定MyBatis框架是否应自动映射,及如和映射查询结果集中的列到Java对象的字段/属性NONE / PARTIAL / FULLPARTIAL
logImpl指定MyBatis框架应使用的日志记录实现,如果不设置,将自动发现日志记录实现SLF4J / LOG4J / LOG4J2 / JDK_LOGGING / COMMONS_LOGGING / STDOUT_LOGGING / NO_LOGGING

配置 log4j的日志实现如下:

<!-- 设置MyBatis框架的运行时行为 -->
<settings>
   <!-- 使用log4j作为MyBatis框架的日志实现 -->
   <setting name="logImpl" value="LOG4J"/>
</settings>

类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字,比如:

<!-- 为实体类配置别名,使用别名简化SQL映射文件 -->
<typeAliases>
   <typeAlias alias="sysuser" type="com.bdqn.entity.SysUser"/>
</typeAliases>

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

<!-- 根据指定的路径方式简化实体类中的别名配置 -->
<typeAliases>
  <package name="com.bdqn.entity"/>
</typeAliases>

环境配置(environments)

environments 元素定义了如何配置环境,代码如下:

<!-- 配置MyBatis框架的运行环境 -->
<environments default="development">
        <environment id="development">
            <!-- 配置事务管理器,采用JDBC事务,由应用自行管理事务 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源,POOLED:MyBatis 提供的数据源,JNDI:JNDI 数据源 -->
            <dataSource type="POOLED">
                <!-- 使用${}引用定义的参数,此处参数来自database.properties 文件-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
             </dataSource>
        </environment>
</environments>

映射器(mappers)

使用相对于类路径的资源引用,代码如下:

<!-- 配置映射文件 -->
<mappers>
    <mapper resource="mapper/SysUserMapper.xml"/>
</mappers>

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值