当前位置: 首页 > article >正文

MyBatis基础一

环境:

  • JDK18
  • Mysql:8.0.19
  • maven:3.8.1
  • IDEA

基础:

  • JDBC
  • Mysql
  • Java基础
  • Maven
  • Junit  单元测试,利用注释@test

SSM框架:配置文件

简介

什么是MyBatis

  •  MyBatis 是一款优秀的持久层框架
  • 它支持自定义 SQL、存储过程以及高级映射
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录
  • Mybatis本是Apache的一个开源项目Ibatis,2010年这个项目由Apache software foundation迁移到了Google Code,并改名为Mybatis。
  • 2013年11月迁移到Github

如何获得MyBatis

maven仓库

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

持久化

持久化是将程序数据在持久状态和瞬时状态间转换的机制。

  • 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
  • JDBC就是一种持久化机制。文件IO也是一种持久化机制。
  • 在生活中 : 将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。

为什么需要持久化服务呢?那是由于内存本身的缺陷引起的

  • 内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的是,人们还无法保证内存永不掉电。
  • 内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。

持久层

Dao层(完成持久化的代码块)、Service层(业务层,接收具体的业务)、Controller层(接收用户的请求,把用户的请求传发给业务层去做)

  • 持久层完成持久化工作的代码块
  • 层的界限十分明显

为什么需要MyBais

虽然JDBC也能处理数据,但是MyBatis更加方便

帮助程序员将数据存入到数据库中

不用MyBatis框架也可以,更容易上手。

编写MyBatis程序

搭建环境

1.搭建数据库

创建数据库mybatis,写入一个user表。

create database `mybatis`;
use `mybatis`;

CREATE TABLE `user`(
	`id` int(20) not null PRIMARY KEY,
	`name` varchar(30) default null,
	`pwd` varchar(30) DEFAULT null
)ENGINE=INNODB default charset=utf8;

insert into `user`(`id`,`name`,`pwd`) values
(1,'张三',123456),
(2,'李四',123456),
(3,'王五',123456)

2.新建一个普通的maven项目。

删除src文件,把该项目当作父工程。

3.导入依赖。可在官网查找https://mvnrepository.com/artifact

  • mysql驱动
  • mybatis
  • junit
  • 注意防止资源导入失败,配置resource
<dependencies>
    <!-- Mybatis依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>
    <!-- Mysql连接依赖-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<!--在build中配置resources, 来防止我们资源导出失败问题-->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

创建一个模块

1.编写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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/serenity/dao/UserMapper.xml"></mapper>
    </mappers>
</configuration>

解释:com.mysql.jdbc.Driver 是 MySQL 数据库连接器的一个类,用于通过 JDBC(Java Database Connectivity)接口连接 MySQL 数据库。这个类属于 MySQL Connector/J 驱动程序,它是一个用于在 Java 应用程序中连接 MySQL 数据库的库。

版本区别:

在 MySQL Connector/J 5.x 版本中,使用的是 com.mysql.jdbc.Driver 类。然而,从 MySQL Connector/J 6.x 版本开始,推荐使用 com.mysql.cj.jdbc.Driver 类。这是因为新版本的驱动程序在性能和功能上进行了改进,并且旧的 com.mysql.jdbc.Driver 类已经被弃用

每一个mapper.xml都需要在mybatis核心配置文件中注册。com/serenity/dao/UserMapper.xml是核心配置地址。

连接数据库,步骤在MySql基础四的JDBC中

2.编写mybatis工具类(MybatisUtils)

通过 SqlSessionFactory 获取 SqlSession 执行数据库操作

其中核心代码:

String resource = "mybatis-config.xml";

  • 作用:定义一个字符串变量,指向 MyBatis 的配置文件路径

  • 说明

    • mybatis-config.xml 是 MyBatis 的全局配置文件,包含数据库连接、事务管理、映射文件路径等配置。

    • 此文件一般放在项目的类路径下(如 src/main/resources 或 src/main/java 的某个包中)

InputStream inputStream = Resources.getResourceAsStream(resource);

  • 作用:将配置文件以输入流的形式加载到内存。

  • 涉及的类

    • Resources:MyBatis 提供的工具类,用于从类路径、文件系统或 URL 加载资源。

    • 方法 getResourceAsStream(String resource):从类路径加载资源并返回 InputStream

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

  • 作用:通过配置文件构建 SqlSessionFactory 对象。

  • 涉及的类:

    • SqlSessionFactoryBuilder:临时工具类,唯一用途是通过配置文件构建 SqlSessionFactory

    • SqlSessionFactory:MyBatis 的核心对象,用于创建 SqlSession(类似数据库连接)。

    • 方法 build(InputStream inputStream):解析配置文件的输入流,生成 SqlSessionFactory

  • 特性:

    • SqlSessionFactory 是线程安全的,整个应用只需一个实例。

    • 它负责管理数据库连接池、事务、映射文件等全局资源。

编写代码

  • 实体类
  • Dao接口
  • 接口实现类

实体类编写:

创建User类,该类对应数据库mybatis中的数据表users。

Dao接口相当于以后的Mapper

接口实现类(UserMapper.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.serenity.dao.UserDao">
    <select id="getUserList" resultType="com.serenity.pojo.User">
        select * from mybatis.user
    </select>
</mapper>

测试

测试查询操作

   @Test
    public void test(){
        //获取Sqlsession对像
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //执行sql,获取dao对象
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        //关闭Sqlsession
        sqlSession.close();

    }

CRUD

需注意:

  • namespace:命名空间,绑定的是对应的Dao/Mapper接口。如果命名空间错误,便无法找到接口。
  • select(选择):查询语句,
    • id是命名空间下的唯一标识符,接口中方法的名字
    • resultType:Sql语句执行的返回值,一般为类,如上面的User类,以及各种类型,如整型
    • parameterType:参数类型

编写一个查询语句

1.需要在Dao接口下定义一个方法

2.在接口实现类的配置文件中加上查询的配置文件

3.测试代码,在UserDaoTest测试类中编写测试代码,省略JDBC中的许多操作

insert

插入一个用户

1.需要在Dao接口下定义一个方法

2.在接口实现类的配置文件中加上查询的配置文件

3.测试代码,在UserDaoTest测试类中编写测试代码

update

编写接口

编写配置:

测试:

delete

接口:

/*删除一个用户*/
    int deleteUser(int id);

接口配置文件:

 <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id=#{id};
    </delete>

测试:

@Test
    public void deleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);//获得接口
        mapper.deleteUser(4);//调用接口中的方法,传入参数
        sqlSession.commit();//提交事务
        sqlSession.close();

    }

注意:增删改都需要提交事务

万能Map

假设我们的实体类,或者数据库中的表,字段或者参数越多,我们应当考虑使用Map。

添加

编写Userdao接口。

 /*添加用户,用map,不需要知道数据库有什么*/
    int addUser2(Map<String,Object> map);

编写配置文件UserMapper.xml

<insert id="addUser2" parameterType="map" >
        insert into mybatis.user(id,name,pwd) values (#{userid},#{username},#{password})
    </insert>

编写测试类

   public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("userid",5);
        map.put("username","小米");
        map.put("password",123456);
        mapper.addUser2(map);
        //插入数据需要提交事务
        sqlSession.commit();
        sqlSession.close();
    }

测试结果:

查询

编写Userdao接口

/*根据id查询,传入一个map*/
    User getUserByid2(Map<String,Object> map);

编写配置UserMapper.xml

测试:

Map传递参数,直接在sql中取出key即可【parameterType="map"】

对象传递参数,直接在sql中取对象的属性即可【parameterType="Object"】

只有一个基本类型参数的情况下,可以直接在sql中取到

多个参数用Map或者注解。

模糊查询

编写接口

编写配置文件

编写测试类


http://www.kler.cn/a/599178.html

相关文章:

  • 无人船 | 基于ROS的轻量级多无人艇自主导航仿真框架
  • Git 钩子:特定操作脚本
  • GithubPages+自定义域名+Cloudfare加速+浏览器收录(2025最新排坑)
  • unix网络编程
  • 【XPipe】一款好用的SSH工具
  • 丐版插入selectdb模拟
  • Debian,Ubuntu,设置/etc/vim/vimrc.tiny解决:上下左右变成ABCD,backspace退格键失效的问题
  • netplan是如何操控systemd-networkd的? 笔记250324
  • 常见框架漏洞攻略-ThinkPHP篇
  • 搜广推校招面经五十七
  • C语言入门教程100讲(40)文件定位
  • search_fields与filterset_fields的使用
  • 【参考资料 II】C 运算符大全:算术、关系、赋值、逻辑、条件、指针、符号、成员、按位、混合运算符
  • 多线程编程
  • 模糊数学 | 模型 / 集合 / 关系 / 矩阵
  • endnote相关资料记录
  • V8引擎源码编译踩坑实录
  • vue3 如何清空 let arr = reactive([])
  • React Native集成到现有原生Android应用
  • WebGPU实战:Three.js性能优化新纪元