MyBatis入门

本文介绍了MyBatis框架的基础知识,包括框架的定义、解决的问题、分层重要性以及JavaEE中的常见分层框架。通过快速入门教程展示了如何创建数据表、搭建Maven工程、编写实体类、持久层接口以及配置XML文件。同时,对比了JDBC的不足,强调了MyBatis在简化数据库操作和提高开发效率方面的优势。最后,简述了MyBatis的注解配置方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

01-MyBatis

第1 章 框架概述

1.1 什么是框架

1.2 框架要解决的问题

1.3 软件开发的分层重要性

1.4 javaEE下常见的分层框架

1.5 回顾JDBC

1.6问题分析

第2章 Mybatis 框架快速入门

2.1 mybatis概述

2.2创建测试用的数据表

2.3创建maven工程

2.4对照数据表编写实体类

2.5编写持久层接口UserDao

2.6编写SqlMapConfig.xml 配置文件

2.7编写UserDao的映射文件

2.8配置日志文件(从网上找一个)

2.9测试类

补充:使用注解配置mybatis

 1.添加注解

总结:


01-MyBatis

1 章 框架概述

1.1 什么是框架

        框架(Framework )是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法 ; 另一种 定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定 义。 简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是 使用别 人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。 使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。

1.2 框架要解决的问题

         框架要解决的最重要的一个问题是技术整合的问题,在 J2EE 的 框架中,有着各种各样的技术,不同的 软件企业需要从 J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因 此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不 是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。

1.3 软件开发的分层重要性

        框架的重要性在于它实现了部分功能,并且能够很好的将低层应用平台和高层业务逻辑进行了缓和。为 了实现 软件工程中的“高内聚、低耦合 。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。我 们常见的 MVC 软件设计思想就是很好的分层思想。

1.4 javaEE下常见的分层框架

框架图解:
1.4.1 解决数据库持久化问题的框架
Mybatis
        mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc ,使开发者只需要关注 sql 语句本身,而 不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。
SpringMVC
        在web 模型中, MVC 是一种很流行的框架,通过把 Model View Controller 分离,把较为复杂的 web应用分成逻辑清晰的几部分,是为了简化开发,减少出错。还是为了组内开发人员之间的配合。总之就是一种分层工作的办法。
SpringMVC ,是 spring 的一个子框架,当然拥有 spring 的特性,如依赖注入。
        Spring下的子项目: Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级Web 框架,即使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求- 响应模型,框架的目的就是帮助我们简化开发, Spring Web MVC 也是要简化我们日常 Web 开发的。
Spring , spring是开源的轻量级框架
        spring主要由两部分:1.面向切面编程(aop)不需要去修改源代码去增强方法的功能。2.控制反转(ioc) 极大程度地解决了程序之间的耦合度,通过spring去管理javabean对象,减少代码与代码之间的依赖关系。

1.5 回顾JDBC

package com.test.jdbc;

import javax.xml.transform.Result;
import java.sql.*;

public class jjdbcText {
    public static void main(String[] args) throws Exception {
//        连接对象
        Connection connection = null;
//        执行对象
        PreparedStatement preparedStatement = null;
//        结果集
        ResultSet resultSet = null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://192.168.137.168/travel?serverTimezone=UTC","root","123456");
            String sql = "select * from tab_user";
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                System.out.println(resultSet);
            }
        }catch ( Exception e ){
            System.out.println();
        }
//        释放资源......
    }
}

1.6问题分析

  • 每执行一次都会创建一次链接释放一次连接,极大的造成了性能资源的浪费
  • 加载驱动,数据库,连接数据库的账号密码全部使用硬编码直接写死,不利于代码维护与管理
  • sql语句糅杂在java代码中,耦合度高,可读性低
  • 结果集每次都要一个一个手动判断获取,提高了代码书写的工作量

2 Mybatis 框架快速入门

2.1 mybatis概述

Mybatis 是一个持久层框架,用 java 编写的。
        它封装了jdbc 操作的很多细节,使开发者只需要关注 sql 语句本身,而无需关注注册驱动,创建连接 等繁杂过程 它使用了ORM(Object Relational Mappging 对象关系映射)思想实现了结果集的封装。简单的说: 就是把数据库表和实体类及实体类的属性对应起来让我们可以操作实体类就实现操作数据库表。

2.2创建测试用的数据表

CREATE TABLE`user`
(
    `id`       int(11)     NOT NULL auto_increment,
    `username` varchar(32) NOT NULL COMMENT '用户名称',
    `birthday` datetime     default NULL COMMENT '生日',
    `sex`      char(1)      default NULL COMMENT '性别',
    `address`  varchar(256) default NULL COMMENT '地址',
    PRIMARY KEY (`id`)
);
insert into`user`(`id`,`username`,`birthday`,`sex`,`address`)values(41,'老
王','2020-02-27 17:47:08','男','北京'),(42,'小二王','2020-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2020-03-04 11:34:34','女','北京金燕龙'),(45,'六星教育','2020-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2020-03-07 17:37:26','男','北京'),
(48,'小马宝莉','2020-03-08 11:44:00','女','北京修正');

2.3创建maven工程

maven配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
    <!--mybatis依赖jar包-->
        <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>
    <!--MySQL数据库-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId><version>8.0.19</version>
            <scope>runtime</scope>
        </dependency>
    <!--日志信息-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
    </dependencies>
</project>

2.4对照数据表编写实体类

package com.haohao.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 + '\'' +
                '}';
    }
}

2.5编写持久层接口UserDao

package com.haohao.dao;

import com.haohao.domain.User;

import java.util.List;

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

2.6编写SqlMapConfig.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTDConfig3.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://192.168.137.168:3306/travel?serverTimezone=UTC"/>
                                <property name="username" value="root"/>
                                <property name="password" value="123456"/>
                        </dataSource>
                </environment>
        </environments>
        <!--配置映射关系-->
        <mappers>
                <mapper resource="com/haohao/dao/UserDao.xml"/>
        </mappers>
</configuration>

2.7编写UserDao的映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTDMapper3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:传入全限定类名-->
<mapper namespace="com.haohao.dao.UserDao">
<!--    方法与sql语句的映射关系 查询集类型-->
    <select id="findAll" resultType="com.haohao.domain.User">
        SELECT * FROM user
    </select>
</mapper>

2.8配置日志文件(从网上找一个)

### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

2.9测试类

import com.haohao.dao.UserDao;
import com.haohao.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.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest {
    public static void main(String[] args) throws IOException {
        //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接口的代理对象
        UserDao userDao=session.getMapper(UserDao.class);
        //6.使用代理对象执行查询所有方法
        List<User> users=userDao.findAll();
        for (User u:users) {
            System.out.println(u);
        }
        session.close();

    }
}

补充:使用注解配置mybatis

 1.添加注解

  /**
  *查询所有用户
  *@return
  */
@Select("select * fromuser")  
List<User>findAll();

2.修改SqlMapConfig.xml中mapper属性class为添加注解的类


<mappers>
    <mapper class="com.sixstar.dao.UserDao"/>
</mappers>

总结:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豪豪喜欢吃猪肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值