mybatis官方文档之第一个mybatis程序实操

news2025/2/22 20:59:13

mysql数据库准备工作:

首先,我们需要在mysql数据库中,建立数据库和数据表:

//创建数据库
create database my_batis;
//创建表
create table students(id int not null,name varchar(30) default null,pwd varchar(30) default null);
//插入数据
insert into students(id,name,pwd) values(1,'小明','1234');
insert into students(id,name,pwd) values(2,'小红','1234121');
insert into students(id,name,pwd) values(3,'小黄','4354');

IDE准备工作:

新建工程项目:

在这里插入图片描述

创建完成后,请删除src:

在这里插入图片描述

右击父项目[mybatis3]:

在这里插入图片描述

建立子项目:

在这里插入图片描述

配置依赖:

在这里插入图片描述

注:MyBatis包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易

子项目pom.xml中代码如下:

<?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">
    <!--父工程-->
    <parent>
        <artifactId>mybatis1</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mybatis</artifactId>

    <properties>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <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>false</filtering>
            </resource>
        </resources>
    </build>

</project>

父项目pom.xml中代码如下:

<?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.example</groupId>
    <artifactId>mybatis1</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mybatis</module>
    </modules>

    <properties>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--使用Maven来构建项目-导入maven依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
    <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>false</filtering>
            </resource>
        </resources>
    </build>
</project>

mybatis_utils:
SqlSessionFactoryBuilder:这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了,因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量), 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情
SqlSessionFactory: 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。,使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”,因此 SqlSessionFactory 的最佳作用域是应用作用域, 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式

package dao;
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;
public class mybatis_utils {
    private  static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            //使用mybatis获取SqlSessionFactory对象
  				String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession () {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}

SqlSession:每个线程都应该有它自己的 SqlSession 实例,SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。,绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行, 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession,如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中, 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它,这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

注:从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置,但也可以使用任意的输入流,以(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的,SqlSessionFactory的实例可以通过 SqlSessionFactoryBuilder 获得,而 SqlSessionFactoryBuilder则可以从XML配置文件或一个预先配置的 Configuration实例来构建出SqlSessionFactory实例

user_interface:

方法1:通过XML配置映射文件来进行映射:

package dao;
import pojo.user;
import java.util.List;
public interface user_interface {
    List<user> getUserList();
}

方法2:通过注解进行映射---->不推荐:

package dao;
import org.apache.ibatis.annotations.Select;
import pojo.user;
import java.util.List;
public interface user_interface {
    @Select("select * from students")
    List<user> findAll();
}

虽然使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让本就复杂的 SQL 语句更加混乱不堪。

因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句,选择何种方式来配置映射,以及是否应该要统一映射语句定义的形式,完全取决于你和你的团队,换句话说,永远不要拘泥于一种方式,你可以很轻松地在基于注解和 XML 的语句映射方式间自由移植和切换

user:

注意!实体类中的属性名一定要和数据库中表的字段名保持一致,否则会出现查询字段值为空的情况

package pojo;

public class user {
    private  int id;
    private String name;
    private  String pwd;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return pwd;
    }
    public void setPassword(String password) {
        this.pwd = password;
    }
    public user() {
    }
    public user(int id,String name,String password){
        this.id=id;
        this.name=name;
        this.pwd=password;
    }
    @Override
    public String toString() {
        return "user{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + pwd + '\'' +
                '}';
    }
}

通过注解进行映射的mybatis-condig.xml文件:

注意 :XML 头部的声明,它用来验证 XML 文档的正确性,environment 元素体中包含了事务管理和连接池的配置

mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息

XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://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?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="xxx"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="dao"/>
    </mappers>
</configuration>

通过XML配置映射文件来进行映射的mybatis.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://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?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="xxx"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="userMapper.xml"/>
    </mappers>
</configuration>

通过XML配置映射文件来进行映射的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="dao.user_interface" >
    <select id="getUserList" resultType="pojo.user">
        select * from mybatis.user
    </select>
</mapper>

在一个 XML映射文件中,可以定义无数个映射语句,这样一来,XML 头部和文档类型声明部分就显得微不足道了,它在命名空间 “dao.user_interface” 中定义了一个名为 “getUserList” 的映射语句,这样你就可以用全限定名 “dao.user_interface.getUserList” 来调用映射语句了

命名空间小tips:

在之前版本的 MyBatis 中,命名空间(Namespaces)的作用并不大,是可选的。,但现在,随着命名空间越发重要,你必须指定命名空间

命名空间的作用有两个:

是利用更长的全限定名来将不同的语句隔离开来,同时也实现了你上面见到的接口绑定,就算你觉得暂时用不到接口绑定,你也应该遵循这里的规定,以防哪天你改变了主意,长远来看,只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。

命名解析:为了减少输入量,MyBatis 对所有具有名称的配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则

全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用

短名称(比如 “selectAllThings”)如果全局唯一也可以作为一个单独的引用,如果不唯一,有两个或两个以上的相同名称:
(比如“com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用全限定名

通过注解进行映射的测试类:

package dao.user;
import dao.mybatis_utils;
import dao.user_interface;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.user;
import java.util.List;
public class test {
    @Test
    public void tests(){
        //获得sqlSession对象
        SqlSession sqlSession= mybatis_utils.getSqlSession();
        user_interface user_interface=sqlSession.getMapper(dao.user_interface.class);
        List<user> userList=user_interface.findAll();
        for(user user:userList){
            System.out.println(user);
        }
        //关闭sqlSession
        sqlSession.close();
    }
}

映射器是一些绑定映射语句的接口,映射器接口的实例是从 SqlSession 中获得的,虽然从技术层面上来讲,任何映射器实例的最大作用域与请求它们的 SqlSession 相同,但方法作用域才是映射器实例的最合适的作用域。,也就是说,映射器实例应该在调用它们的方法中被获取,使用完毕之后即可丢弃 ,映射器实例并不需要被显式地关闭,尽管在整个请求作用域保留映射器实例不会有什么问题,但是你很快会发现,在这个作用域上管理太多像 SqlSession 的资源会让你忙不过来,因此,最好将映射器放在方法作用域内,就像上述实例一样。

通过XML配置映射文件来进行映射的测试类:

package dao.user;
import dao.mybatis_utils;
import dao.user_interface;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.user;
import java.util.List;
public class test {
    @Test
    public void tests(){
        //获得sqlSession对象
      SqlSession sqlSession= mybatis_utils.getSqlSession();
      //方式1:
        user_interface user_interface=sqlSession.getMapper(dao.user_interface.class);
        List<user> userList=user_interface.getUserList();
        for(user user:userList){
            System.out.println(user);
        }
        //关闭sqlSession
        sqlSession.close();
    }
}

输出:

在这里插入图片描述

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

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

相关文章

用移动激光扫描来估计树干直径的分割和树干校准法

Paper题目&#xff1a;Mobile Laser Scanning for Estimating Tree Stem Diameter Using Segmentation and Tree Spine Calibration Abstract 移动激光扫描 (MLS) 可以通过使用自动推导出树干中心位置和树干直径的算法来提高森林清查效率。在这项工作中&#xff0c;我们提出了…

远程控制软件– 向日葵使用教程

新冠疫情的严峻形式下&#xff0c;各地都延期复工&#xff0c;一时间远程办公&#xff0c;在家办公可谓非常火爆。然而&#xff0c;家里毕竟不是公司&#xff0c;很多的资料都在办公室电脑&#xff0c;甚至一些比较专业系统或者专属网络限制无法完成在家办公&#xff0c;这时候…

从加(解)密角度讲栅栏密码

目录普通型栅栏加密原理解密原理W型栅栏加密原理实例解密原理这今天在做新生赛的一道“只有倒着翻过十八层的篱笆才能抵达北欧神话的终点”&#xff0c;研究了很长时间的栅栏原理&#xff0c;flag没出来&#xff0c;而且自己对于普通和W型的加密解密整的有的蒙… 原先一篇文章里…

sentinel-流量控制

github地址&#xff1a;主页 alibaba/Sentinel Wiki GitHub 目录 概述基于 QPS/并发数的流量控制基于调用关系的流量控制 概述 流量控制&#xff08;flow control&#xff09;&#xff0c;其原理是监控应用流量的 QPS 或并发线程数等指标&#xff0c;当达到指定的阈值时对…

免费安全的内网穿透实现——Tailscale

一、需求说明想要实现访问公司或家里的网络设备&#xff08;Windows电脑、NAS、安卓设备等&#xff09;;但是这些设备又没有对应的公网IP地址&#xff1b;且就算有公网 IP 地址&#xff0c;也不放心让这些网络设备直接公开暴露在网络环境中&#xff08;这样很容易被频繁的恶意扫…

【MySQL Tips】除了指定密码外 MySQL客户端更好的选择——登录路径

在实际项目中&#xff0c;我们在生产&#xff08;环境&#xff09;发布新版本或运维时&#xff0c;使用 mysql 、mysqladmin、mysqlimport、mysqldump、mysqlpump 等 MySQL 客户端程序时&#xff0c;每次都需要输入密码&#xff0c;一般都会采用更安全的互动输入密码模式&#…

UOS 22.0家庭版使用体验

1月4日这天我收到了UOS的22.0版本的推送&#xff0c;更新后新增了未成年人账户和学习中心&#xff0c;由于是虚拟机中所以无法新增未成年人账户&#xff0c;于是我制作了Linux to go&#xff08;LTG&#xff09;但是由于我的U盘不是固态U盘所以我用普通的更新就卡在了更新界面。…

Linux下第一个程序:进度条

一、前言 进度条程序曾经是百度的一道面试题。 这一期博客我们来介绍代码和原理究竟是怎样的。 二、知识点 1.回车和换行 通常意义上我们以为回车就是就是键盘的那个回车键。 其实不然。回车其实是不换行&#xff0c;回到本行开头。我们通常用符号表示为 \r 。 换行就是新…

Docker Compose安装

目录 前言 1. 二进制包在线安装 2. 二进制包离线安装 2.1 下载安装包。 2.2 上传到linux服务器 2.3 解压到/usr/local/bin/docker-compose目录。 2.4 将可执行权限应用于二进制文件 2.5 创接建软链&#xff08;可选&#xff09; 2.6 测试是否安装成功 3. 国内镜像二进…

Linux应用编程---3.wait()函数

Linux应用编程—3.wait()函数 ​ 首先引入三个函数&#xff0c;我们通过在Linux终端下查阅它的作用与使用方法。 ​ Linux终端命令下输入&#xff1a;man exit&#xff0c;敲击回车键即可打开exit函数详情页。 图1 exit编程手册​ exit函数的作用是终止一般进程&#xff0c;没…

12、Java基础之泛型的使用

一、泛型的理解1、泛型的概念所谓泛型&#xff0c;就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时&#xff08;例如&#xff0c; 继承或实现这个接口&#xff0c;用这个类型声明变量、创建对象时&#…

[游戏测试]基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; (*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &a…

关于idea中查看源码时的注释以及.class与.java文件的问题

文章目录问题描述解决方法问题描述 在使用idea编辑器学习java的时候发现有的人的idea将鼠标方法java自带的类方法上会出现解释注释&#xff0c;但是我的idea不可以&#xff0c;经过查询发现是idea中jdk选择的问题。 下图为能查看注释时的截图 按住ctrl点击方法名进入&#x…

分治和递归

目录 分治的概念&#xff1a; 递归的概念&#xff1a; 分治策略的特征&#xff1a; 分治法步骤&#xff1a; 例&#xff1a;阶乘&#xff01; 迭代 递归 关于递归使用栈 斐波拉切数列 迭代 递归 分治的概念&#xff1a; 将一个难以直接解决的大问题&#xff08;规模大…

【年终总结】我的前端之行,回顾2022,展望2023

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

Vivado综合属性之MAX_FANOUT

本文介绍了综合属性MAX_FANOUT对Schematic的影响&#xff0c;通过本文可以理解通过寄存器复制的方式可以降低扇出。 高扇出信号可能会因为布线拥塞而出现时序问题。常用的规避方法是通过寄存器复制的方式降低扇出&#xff0c;可通过MAX_FANOUT实现寄存器复制。 MAX_FANOUT既可…

为金融业保驾护航,浪潮存储容灾方案获得权威媒体认可

近日&#xff0c;在2022中国金融科技年会上&#xff0c;经权威IT专家多项严格评审&#xff0c;浪潮金融行业数据存储与容灾解决方案&#xff0c;凭借安全、可靠、经济、高效四大优势&#xff0c;能够满足金融业务服务永远在线、数据永不丢失、性能永远满足、容量永远充足的核心…

【Linux】Linux编译器 gcc 的使用 | 动静态库的初步认识

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、gcc 演示翻译环境1、预处理2、编译3、汇编4、链接5、总结三、动静态链接库1、库…

代码随想录算法训练营第6天 1.两数之和、242. 有效的字母异位词、349.两个数组的交集

代码随想录算法训练营第6天 1.两数之和、242. 有效的字母异位词、349.两个数组的交集 两数之和 力扣题目链接(opens new window) 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 首…

JS数字日期转中文日期(封装函数,dayjs转换时间格式)

JS数字日期转中文日期往期相关文章场景复现封装函数&#xff08;数字日期转中文日期&#xff09;实际应用往期相关文章 文章内容文章链接JS数组对象——根据日期进行排序&#xff0c;按照时间进行升序或降序排序https://blog.csdn.net/XSL_HR/article/details/128579840?spm1…