SSM框架-MyBatis基础

news2025/7/16 7:14:32

1. MyBatis简介

1.1 MyBatis历史

MyBatis最初是Apache的一个开源项目iBatis,2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。

iBatis一词来源于“internet”和“abatis”的组合,是一个基于ava的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects (DAO)。

1.2 MyBatis的特性

MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久化框架

MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集

MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(普通java对象)映射成数据库中的记录

MyBatis是一个半自动的ORM框架

1.3 和其他持久化层的对比

  • JDBC
    • SQL夹杂在Java代码中,耦合度高,导致硬编码内伤
    • 维护不易且实际开发需求中SQL有变化,频繁修改的情况很多
    • 代码冗长,开发效率低
  • Hibernate 和 JPA
    • 操作简单,开发效率高
    • 程序中的长难复杂 SQL 需要绕过框架
    • 内部自动产生的SQL不容易做特殊优化
    • 基于全映射的自动框架,大量字段的POJO进行部分映射时比较困难
    • 反射操作太多,导致数据库性能下降
  • MyBatis
    • 轻量级,性能突出
    • SQL和Java分开编码,功能边界清晰,Java代码专注业务,SQL语句专注数据
    • 开发效率稍逊于Hibernate,但是完全能接受

2. 搭建MyBatis

2.1 创建maven工程

(1)创建项目

        a. 新建一个空项目,项目名为SSM;

        b. 在项目SSM中新建一个maven模块,名为MyBatis_Demo;

        c. 在该模块中,test文件夹中存放测试用代码,main文件夹中的java文件夹存放开发代码,main文件夹中的recourse文件夹存放配置文件;

        d. 在MySQL数据库中创建一个数据库ssm,创建一个表t_user;表结构如下(id自增):

(2)打包方式:jar

        在maven项目的pom.xml文件中添加:<packaging>jar</packaging>

(3)引入依赖

          在pom.xml文件中添加如下代码:

<dependencies>
    <!-- Mybatis核心 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>

    <!-- junit测试 -->
    <dependency>
    <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.3</version>
    </dependency>

    <!--实体化类要用到的@Data,就不用构造函数了-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

(4)创建实体类

        在src/main/java目录下,创建一个java类,命名:com.wsl.mybatis.pojo.User.java(命名可根据自己情况随意起,前面的com.wsl.mybatis.pojo表示文件目录,User.java是文件名)

import lombok.Data;

@Data
public class User {

    private Integer id;

    private String username;

    private String password;

    private Integer age;

    private String gender;

    private String email;

}

(5)创建mapper接口

        MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要 提供实现类。

        在src/main/java目录下,创建一个java类,命名:com.wsl.mybatis.mapper.UserMapper.java文件。

import com.wsl.mybatis.pojo.User;
import java.util.List;

public interface UserMapper {

    // 添加用户
    int insertUser();

    // 更新用户
    void updateUser();

    // 删除用户
    void delUser();

    // 根据id查找用户
    User getUserById();

    // 查找所有用户
    List<User>  getAllUser();

}

(5)创建MyBatis的映射文件

        在src/main/recourse目录下,创建com.wsl.mybatis.mapper.UserMapper.xml

    注意:

       1. MyBatis中可以面向接口操作数据,要保证两个一致:

                mapper接口的全类名和映射文件的命名空间(namespace)保持一致

                mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致

        2.查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系:

                resultType:自动映射,用于属性名和表中字段名一致的情况

                resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况

        3.当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常 TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值

<?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.wsl.mybatis.mapper.UserMapper">

    <!--int insertUser-->
    <insert id="insertUser">
        insert into t_user values(null,'张三','123',23,'女','2436@qq.com');
    </insert>

    <!--void updateUser-->
    <update id="updateUser">
        update t_user set username='李四',password='abc' where id=3;
    </update>

    <!--void delUser-->
    <delete id="delUser">
        delete from t_user where id=4;
    </delete>

    <!--User getUserById-->
    <!--resultType:设置结构类型,查询的数据要转换为java类型-->
    <select id="getUserById" resultType="com.wsl.mybatis.pojo.User">
        select * from t_user where id = 3;
    </select>

    <!--List<User>  getAllUser-->
    <select id="getAllUser" resultType="com.wsl.mybatis.pojo.User">
        select * from t_user;
    </select>

</mapper>

(6)创建MyBatis核心配置文件:application.xml

        核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息

        核心配置文件存放的位置是src/main/resources目录下

<?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>

    <!--设置连接数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--设置驱动类的全类名-->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <!--设置连接数据库的连接地址-->
                <property name="url" value="jdbc:mysql://localhost:3306/MyBatis" />
                <!--设置连接数据库的用户名-->
                <property name="username" value="root" />
                <!--设置连接数据库的密码-->
                <property name="password" value="password" />
            </dataSource>
        </environment>
    </environments>

    <!--引入映射文件-->
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>

</configuration>

(7)创建测试类

        在src/test/java目录下,创建com.wsl.mybatis.MyBatisTest.java文件

        SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的 会话)

        SqlSessionFactory:是“生产”SqlSession的“工厂”。

        工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的 相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。

import com.wsl.mybatis.mapper.UserMapper;
import com.wsl.mybatis.pojo.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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest {

    // 增加一列
    @Test
    public void testInsert() throws IOException {
        // 获取配置文件的输入流
        InputStream is = Resources.getResourceAsStream("application.xml");
        // 获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 获取sqlSessionFactoryBuilder对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 获取SQL的会话对象,是MyBatis提供的操作数据库的对象,true表示自动提交commit
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        // 方法1:
        // 获取UserMapper的代理实现类对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 调用userMapper接口中的方法,实现添加操作
        int result = userMapper.insertUser();

        // // 方法2:提供sql以及唯一标识找到sql并执行,唯一标识是namespace.sqlId
        // int result=sqlSession.insert("com.wsl.mybatis.Mapper.UserMapper.insertUser");

        System.out.println("结果是:"+result);

        // 关闭会话
        sqlSession.close();
    }


    // 修改
    @Test
    public void TestUpdate(){
        InputStream is = Resources.getResourceAsStream("application.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.updateUser();
        sqlSession.close();
    }

    // 删除
    @Test
    public void TestDel(){
        InputStream is = Resources.getResourceAsStream("application.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.delUser();
        sqlSession.close();
    }

    // 根据id查找User
    @Test
    public void TestFindById(){
        InputStream is = Resources.getResourceAsStream("application.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById();
        System.out.println(user);
        sqlSession.close();
    }

    // 查询所有的User
    @Test
    public void TestGetAllUsers(){
        InputStream is = Resources.getResourceAsStream("application.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.getAllUser();
        // 循环输出List里面的内容
        users.forEach(System.out::println);
        sqlSession.close();
    }

}

接下来就可以通过每个@Test注释来启动每个测试代码,验证是否正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pipelines in Shell

本篇文章内容需要读者知道 shell 的一些语法和作用&#xff0c;知道 shell 的用途&#xff0c;和一些基本的用法。 这里可以查看原文&#xff1a;Pipelines in Shell 学习 shell 脚本必须要理解 pipeline 的概念&#xff0c;知道 command 的输入&#xff08;input&#xff09;和…

编译概念总结

一个很笨很笨的人的编译自救笔记。 1 程序设计语言 程序设计语言用于书写计算机程序的语言。语言的基础是一组记号和一组规则。根据规则由记号构成的记号串的总体就是语言。在程序设计语言中&#xff0c;这些记号串就是程序。 程序设计语言由三个方面的因素&#xff0c;语法…

[附源码]SSM计算机毕业设计商场日常维修管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

深度学习(19):nerf论文公式理解

注&#xff1a;有问题欢迎评论留言&#xff0c;但尽量不要喷呀。 1. nerf论文第四章翻译如下&#xff1a; 我们的5D神经辐射场将场景表示为空间任意点的体积密度和定向发射辐射&#xff08;directional emitted radiance&#xff09;。我们使用经典体积渲染&#xff08;class…

嗯哦哎辟 2022 游寄

虽然上次不是假的&#xff0c;但这次是真的寄了。 Day 0 虽然是南京本地人&#xff0c;但因疫情原因&#xff0c;晚上决定去住了酒店。 看了一眼考场&#xff0c;感觉位置小得离谱。不愧是 NOI 2022 团体总分第十的“强省”江苏。 刚开始去了 409&#xff0c;发现房间里一股…

C++ 基础入门

1、变量 作用&#xff1a;给一段指定的内存空间起名&#xff0c;方便操作这段内存。 2、常量 作用&#xff1a;用于记录程序中不可更改的数据 C中定义常量的两种方式&#xff1a; #define 宏常量&#xff1a; #define 常量名 常量值const修饰的变量&#xff1a;const数据类型 …

26k Star, 理解Git太轻松了。。。

程序员宝藏库&#xff1a;gitee.com/sharetech_lee/CS-Books-Store Git是目前使用比较广泛一款版本控制工具&#xff0c;从事开发工作&#xff0c;很难绕开Git。 因此&#xff0c;关于如何快速学习Git使用一直都是一个经久不衰的话题。 前不久我在另外一篇文章中曾提到Git对初…

【药材识别】基于色差色温特征结合SVM实现药材炮制程度判断系统附GUI界面

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

十九种卷积

参考文章:一文看尽深度学习中的20种卷积(附源码整理和论文解读) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/381839221 一、原始卷积(Vanilla Convolution) CNNs中的卷积,也称为滤波器,是由一组具有固定窗口大小且带可学习参数(learnable paramerters)的卷积核所组…

Java之IO流详解(一)——File类

一、File类创建文件 方法说明public boolean createNewFile()当具有该名称的文件不存在时&#xff0c;创建一个由该抽象路径命名的新空文件public boolean mkdir()创建由此抽象路径命名的目录public boolean mkdirs()创建由此抽象路径命名的目录&#xff0c;包括任何必须但不存…

Go常见错误第15篇:interface使用的常见错误和最佳实践

前言 这是Go常见错误系列的第15篇&#xff1a;interface使用的常见错误和最佳实践。 素材来源于Go布道者&#xff0c;现Docker公司资深工程师Teiva Harsanyi。 本文涉及的源代码全部开源在&#xff1a;Go常见错误源代码&#xff0c;欢迎大家关注公众号&#xff0c;及时获取本…

加载配置文件内容利用反射动态创建对象和调用方法(开闭原则的体现)

反射的应用&#xff1a;根据配置文件来创建对象和调用方法 需求&#xff1a;1&#xff0c;根据配置文件re.properties 指定的信息&#xff0c;创建对象并调用方法 classfullpathsrc.com.liu.Cat methodhi 即通过外部文件配置&#xff0c;在不修改源码的情况下&#xff0c;来控…

GAN详解

前言 GAN是当今作为火热的生成式算法&#xff0c;由Ian Goodfellow&#xff0c;Yoshua Bengio等人在2014年提出的&#xff0c;Yan LeCun表示道GAN是“adversarial training is the coolest thing since sliced bread”。它使用两个神经网络&#xff0c;将一个神经网络与另一个…

ArcGIS中ArcMap栅格图层0值设置为NoData值的简便方法

本文介绍在ArcMap软件中&#xff0c;将栅格图层中的0值或其他指定数值作为NoData值的方法。 在处理栅格图像时&#xff0c;有时会发现如下图所示的情况——我们对某一个区域的栅格数据进行分类着色后&#xff0c;其周边区域&#xff08;即下图中浅蓝色的区域&#xff09;原本应…

C语言学习记录(十五)C预处理器和C库

文章目录一、C预处理器1.1 翻译程序1.2 明示常量&#xff1a;#define1.3 在#define中使用参数1.4 文件包含&#xff1a;#include1.5 其他指令1.5.1 #undef指令1.5.2 从C预处理角度看已定义1.5.3 条件编译1.5.3.1 #ifdef、#else和#endif指令1.5.3.2 #ifndef1.5.3.3 #if和elif指令…

Gof23-创建型-工厂-单例-抽象工厂-建造-原型以及UML的绘制

创建型的设计模式工厂模式单例模式抽象工厂建造者模式原型模式UML图形的绘制工厂模式 工厂模式 Factory Pattern 适用的场景&#xff1a;统一的接口作为统一的零件&#xff0c;实现类作为零件的组合&#xff0c;将实例产品类的生产交给工厂&#xff0c;用户只需要面对工程提取…

XML的创建和读取

rapidxml是一个快速的xml库&#xff0c;由C模板实现的高效率xml解析库&#xff0c;同时也是boost库的property_tree的内置解析库。 当使用rapidxml时&#xff0c;只需要把rapidxml.hpp 、 rapidxml_print.hpp 和 rapidxml_utils.hpp 三个文件拷贝到你的工程目录下&#xff0c;就…

Pytorch中KL loss

1. 概念 KL散度可以用来衡量两个概率分布之间的相似性&#xff0c;两个概率分布越相近&#xff0c;KL散度越小。 上述公式表示P为真实事件的概率分布&#xff0c;Q为理论拟合出来的该事件的概率分布。D(P||Q)&#xff08;P拟合Q&#xff09;和D(Q||P)&#xff08;Q拟合P&…

ajax之Content-Type示例

参考资料: Content-Type详解【SpringBoot】SpringBoot接收请求的n种姿势 目录前期准备0. Content-Type概念解释1. application/x-www-form-urlencoded1.1 form表单示例1.2 jQuery的ajax示例2. application/json2.1 指定contentType为json,不使用RequestBody接收2.2 不指定cont…

01 OSI七层网络排查 troubleshooting 思路及对应工具

文章目录1 .前言2. OSI 的七层模型&#xff0c;和 TCP/IP 的四层 / 五层模型区别2.1 网络专业术语2.2 TLS 解释2.3 什么是TCP 流&#xff1f;3. 网络各层排查工具3.1 应用层3.1.1 浏览器的开发者工具3.1.1.1 找到有问题的服务端IP3.1.1.2 辅助排查网页慢的问题3.1.1.3 解决失效…