mybatis基础语法

news2024/9/25 9:41:11

Mybatis快速入门

1.需求

使用MyBatis查询所有的用户, 封装到List集合

2.分析

  1. 创建maven工程(jar),添加坐标
  2. 创建pojo
  3. 创建UserDao接口
  4. 创建UserDao映射文件
  5. 创建Mybatis核心配置文件SqlMapConfig.xml
  6. 编写java代码测试

3.实现

准备工作:

• 数据库
CREATE TABLE t_user(
uid int PRIMARY KEY auto_increment,
username varchar(40),
sex varchar(10),
birthday date,
address varchar(40)
);

INSERT INTO t_user VALUES (null, ‘zs’, ‘男’, ‘2018-08-08’, ‘北京’);
INSERT INTO t_user VALUES (null, ‘ls’, ‘女’, ‘2018-08-30’, ‘武汉’);
INSERT INTO t_user VALUES (null, ‘ww’, ‘男’, ‘2018-08-08’, ‘北京’);

MyBatis快速入门

命名普遍规则:
类,接口名:两个大写字母。如:UserDao
方法名:中间的大写字母。如:findAll
Dao接口的名字:pojo+Dao。比如:UserDao

1. 创建Maven工程,添加坐标
<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
  <!--引入lombok的依赖-->
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
    <scope>provided</scope>
  </dependency>
  <!--mysql驱动-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
  </dependency>
  <!--mybatis的依赖-->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
  </dependency>
</dependencies>
2. 创建pojo



public class User implements Serializable {
    private Integer uid;            //用户id
    private String username;    //用户姓名
    private String sex;         //用户性别
    private Date birthday;      //用户生日
    private String address;     //用户地址
}
3. 创建UserDao接口

 UserDao接口就是我们持久层接口(也可以写成UserMapper)

public interface UserDao {

    /**
     * 执行一个查询所有用户的sql语句,并且将查询到的结果封装到List<User>
     * @return
     */
    public List<User> findAll();
}
4. 创建UserDao.xml映射文件

注意:

  1. 映射配置文件的路径在resources里面,要和对应的Dao接口的路径保持一致
  2. 映射配置文件的文件名必须和Dao接口名保持一致
  3. 一定要引入约束文件
  4. Sql语句不要有;号结尾。
    在这里插入图片描述
    注意在rosource下用/,用.的话不会分隔,会全部成一个包名。
<?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,一个映射配置文件,对应一个dao接口
    根标签的namespace属性的值就对应dao接口的权限定名
-->
<mapper namespace="com.gavin.dao.UserDao">
    <!--
        根标签的每一个子标签就对应dao接口的每一个方法:
            select标签对应了查询方法
            标签的id值对应方法的名字
            标签的resultType的值就对应封装结果类型,如果封装结果类型是List就对应其泛型的类型
            标签体的内容就是要执行的SQL语句
    -->
    <select id="findAll" resultType="com.gavin.pojo.User">
        select * from t_user//!!不要有;了!
    </select>
</mapper>
5. 创建mybatis核心配置文件SqlMapConfig.xml

注意:

  1. 存放的路径必须是resources的根路径
  2. 配置文件的名字,随便写
  3. 一定要引入约束文件
<?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
-->
<configuration>
    <!--
        配置数据库的环境信息:
        environments:表示里面可以配置多个环境,default使用哪个环境
            environment:每一个environment表示一种环境
        为什么要配置多个环境:因为我们有多个环境(开发环境、生产环境(真正项目之后运行的环境)、测试环境)
    -->
    <environments default="dev">
        <!--开发环境-->
        <environment id="dev">
            <!--事务管理者,type为JDBC表示使用JDBC的事务管理者(了解)-->
            <transactionManager type="JDBC"></transactionManager>
            <!--dataSource表示数据源,1.POOLED表示使用自带的连接池,2.UNPOOLED表示不使用连接池,3.JNDI表示使用JNDI连接池-->
            <dataSource type="POOLED">
                <!--连接池的配置信息-->
                <property name="username" value="root"/>
                <property name="password" value="asd"/>
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf8"/>
<!—两个斜杠后面localhost:3306/但是三个斜杠就可省略了这个,直接写数据库名。-->
            </dataSource>
        </environment>
        <!--生产环境-->
        <environment id="pro">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
        <!--测试环境-->
        <environment id="test">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
    </environments>

    <!--
        指定加载哪些映射配置文件:mappers
            mapper标签:每一个mapper标签负责加载一个配置文件;resource指定要加载的映射配置文件的路径
    -->
    <mappers>
        <mapper resource="com/gavin/dao/UserDao.xml"></mapper>//注意是斜线!
    </mappers>
</configuration>
6. java代码测试

测试包里面绿色java包里面,建个和上面一样的包结构,com.gavin里面一个测试类名即可。
然后运行,点方法旁边的绿色箭头运行即可。

package com.gavin;

import com.gavin.dao.UserDao;
import com.gavin.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.apache.ibatis.io.Resources;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;


public class TestMybatis {
    
    public void testFindAll() throws IOException {
        //1.让mybatis框架去加载主配置文件
        //1.1 将主配置文件SqlMapConfig.xml转换成字节输入流
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //1.2创建一个SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
        //1.3使用factoryBuilder对象加载字节输入流,创建 SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = factoryBuilder.build(is);
        //1.4使用sqlSessionFactory对象创建处SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();//使用了工厂模式

最终目标://2.使用sqlSession对象创建出UserDao接口的代理对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);//使用了动态代理

        //3.调用userDao代理对象的findAll()方法进行查询
        List<User> userList = userDao.findAll();
        for (User user : userList) {
            System.out.println(user);
        }

        //4.关闭资源
        sqlSession.close();
        is.close();
    }
}
看错误日志

出错时从第一行看,发现告诉了错误位置,和提示可能,都在最前面几行。
就开头这些###的内容都是提示,看这个找就行。
在这里插入图片描述

Mapper动态代理方式规范

入门案例回顾

Mapper.xml(映射文件)
  1. 映射配置文件存储的路径在resources里面,要和对应的Dao接口的路径保持一致
  2. 映射配置文件的文件名必须和Dao接口名保持一致
  3. 一定要引入约束文件
  4. namespace属性的值和对应Dao接口的全限定名一致
  5. 每一个子标签,就对应Dao接口中的一个方法
    查询方法就对应select标签
    添加方法就对应insert标签
    删除方法就对应delete标签
    修改方法就对应update标签

标签的id就对应方法的名字

标签的parameterType就对应方法的参数类型

标签的resultType(只有select标签才有)就对应方法的返回值类型,如果返回值类型是List,那么resultType就是List的泛型类型

标签体中的内容就是要执行的sql语句

<?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.gavin.dao.UserDao"> 
    <select id="findAll" resultType="com.gavin.pojo.User">
        select * from t_user
    </select>
</mapper>
Mapper.java(dao接口)
public interface UserDao {

    /**
     * 执行一个查询所有用户的sql语句,并且将查询到的结果封装到List<User>
     * @return
     */
    public List<User> findAll();
}

规范

Mapper接口开发需要遵循一下规范:

  1. 存储路径建议和对应的Dao接口保持一致
  2. 文件名建议和对应的Dao接口的名字保持一致
  3. 配置文件的根标签的namespace属性必须和对应的Dao接口的全限定名保持一致
  4. 接口中的每一个方法,就对应映射配置文件中的一个标签
    a) 查询方法,对应select标签
    b) 添加方法,对应insert标签
    c) 删除方法,对应delete标签
    d) 修改方法,对应update标签
  5. 映射配置文件中的标签的id属性,就必须和对应的方法的方法名保持一致
  6. 映射配置文件中的标签的parameterType属性,就必须和对应的方法的参数类型(全限定名)保持一致
  7. 映射配置文件中的标签的resultType属性,就必须和对应的方法的返回值类型(全限定名)保持一致,但是如果返回值是list则和其泛型保持一致

3、核心配置文件详解

核心配置文件的顺序

标签顺序如图
在这里插入图片描述

properties(引入外部的properties文件)

.properties文件同样放在在根目录下。
jdbc.properties配置文件:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.user=root
jdbc.password=asd

SqlMapConfig.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>
    <!--
        使用properties标签引入外部的properties文件
        目的:也是为了配置文件解耦,专门的信息就放到专门的配置文件中
    -->
    <properties resource="jdbc.properties"></properties>

      <environments default="dev">
        <!--开发环境-->
        <environment id="dev">
            <!--事务管理者,type为JDBC表示使用JDBC的事务管理者(了解)-->
            <transactionManager type="JDBC"></transactionManager>
            <!--dataSource表示数据源,1.POOLED表示使用自带的连接池,2.UNPOOLED表示不使用连接池,3.JNDI表示使用JNDI连接池-->
            <dataSource type="POOLED">
                <!--连接池的配置信息-->
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
            </dataSource>
        </environment>
            </environments>
……
 </configuration>

typeAliases(类型别名)

定义单个别名

• 核心配置文件

<typeAliases>
    <typeAlias type="com.gavin.pojo.User"  alias="user"></typeAlias>
还可以写很多个。<typeAlias>,一个<typeAlias>代表一个。
</typeAliases>

• 修改UserDao.xml:

<select id="findAll" resultType="user">//直接用自定义的别名
    select * from t_user
</select>
批量定义别名

因为有的时候pojo里面的类过多,一个一个写很麻烦。
因为所有要配置别名的类都写在一个包当中,所以我们可以使用包扫描去配置别名,通过package标签扫描整个包,就能给该包中所有类都配置别名,别名就是该类的类名,不区分大小写。

使用package定义的别名:就是pojo的类名,不区分大小写。

<typeAliases>
    <package name="com.gavin.pojo"/>//这里没有类名
</typeAliases>

修改UserDao.xml

<select id="findAll" resultType="User">//直接类名就可以
    select * from t_user
</select>

Mapper

方式一:引入映射文件路径
<mappers>
    <mapper resource="com/gavin/dao/UserDao.xml"></mapper>
</mappers>

在这里插入图片描述

方式二:扫描接口

• 配置单个接口

<mappers>
    <mapper resource="com.gavin.dao.UserDao "></mapper>
</mappers>

• 批量配置
当配置文件太多了,还有别的很多dao,还挨个配置很麻烦。
在这里插入图片描述

<mappers>
    <package name="com.gavin.dao"/>
</mappers>
注意!!!!

核心配置文件的顺序不能错
在这里插入图片描述

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

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

相关文章

《梦醒蝶飞:释放Excel函数与公式的力量》11.3 ISTEXT函数

第11章&#xff1a;信息函数 第三节 11.3 ISTEXT函数 11.3.1 简介 ISTEXT函数是Excel中的一个信息函数&#xff0c;用于检查指定单元格中的内容是否为文本。如果单元格内容是文本&#xff0c;则返回TRUE&#xff1b;否则返回FALSE。ISTEXT函数在数据验证、条件格式化和逻辑判…

【排序算法】插入排序(希尔排序)

目录 一.直接插入排序 1.基本思想 2.实现 3.特性 1.效率 2.时间复杂度&#xff1a;O(N^2) 3.空间复杂度&#xff1a;O(1) 4.稳定性&#xff1a;稳定 二.希尔排序 1.基本思想 2.实现 3.特性 1.效率 2.时间复杂度&#xff1a;O(N^1.3) ​编辑 3.空间复杂度&#xff…

AI在软件开发中的角色:辅助创新还是自动化取代?

文章目录 每日一句正能量前言&#xff1a;人工智能与软件开发的未来交汇点AI工具现状AI对开发者的影响工作方式的改变需要掌握的新技能保持竞争力的策略结论 AI开发的未来AI在软件开发领域的未来发展方向AI是否可能完全取代开发者如何在AI时代规划开发者的职业发展结论 后记&am…

【通过pnpm创建vite项目】

vue3最新项目技术构建后台管理系统 一、技术要求二、安装pnpm2.1 构建vite三、项目配置3.1 eslint 配置3.2 prettier配置3.3 stylelint配置3.4 配置husky3.5 配置commitlint3.6 pnpm 强制安装四、Element-plus 引入4.1 完整引入4.2 国际化配置4.3 配置别名4.4 Env环境配置4.5 s…

教育与社会的发展

生产力与教育的关系 政治经济制度与教育的关系 文化和人口与教育的关系

《梦醒蝶飞:释放Excel函数与公式的力量》11.4 ISERROR函数

第11章&#xff1a;信息函数 第四节 11.4 ISERROR函数 11.4.1 简介 ISERROR函数是Excel中的一个信息函数&#xff0c;用于检查指定单元格或表达式是否产生错误。如果单元格或表达式产生任何类型的错误&#xff08;如N/A、VALUE!、REF!等&#xff09;&#xff0c;则返回TRUE&…

子任务:IT运维的精细化管理之道

在当今的企业运营中&#xff0c;信息技术已成为支撑业务发展的核心力量。根据Gartner的报告&#xff0c;IT服务管理&#xff08;ITSM&#xff09;的有效实施可以显著提升企业的运营效率&#xff0c;降低成本高达15%&#xff0c;同时提高服务交付速度和质量。随着业务的复杂性和…

Python中对asyncio的实际使用

前言&#xff1a;一般涉及异步编程我都无脑用celery&#xff0c;但是最近在做一个项目&#xff0c;项目不大&#xff0c;也不涉及定时任务&#xff0c;所以就用了asyncio。 asyncio是python自带的模块&#xff0c;比celery轻量&#xff0c;使用起来也简单。以前学习过&#xf…

java中Error与Exception的区别

java中Error与Exception的区别 1、错误&#xff08;Error&#xff09;1.1 示例 2、 异常&#xff08;Exception&#xff09;2.1 示例 3、 区别总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 当我们谈论编程中的错误&#xff08;Error&…

【LeetCode】917:翻转字符串

方法&#xff1a;双指针 class Solution { public:bool isletter(char ch){if(ch>a&&ch<z)return true;if(ch>A&&ch<Z)return true;return false;}string reverseOnlyLetters(string s) {int lens.size();int left0,rightlen-1;string s1;while(le…

60、基于浅层神经网络的数据拟合(matlab)

1、基于浅层神经网络的数据拟合的简介、原理以及matlab实现 1&#xff09;内容说明 基于浅层神经网络的数据拟合是一种常见的机器学习方法&#xff0c;用于通过输入数据来拟合一个非线性函数。这种方法通常包括一个输入层、一个或多个隐藏层和一个输出层。神经网络通过学习权…

【HarmonyOS】获取通讯录信息

【HarmonyOS】获取通讯录信息 一、问题背景&#xff1a; 在Android和IOS中&#xff0c;获取手机通讯录信息的方式&#xff0c;一般是申请通讯录权限后&#xff0c;获得手机所有的通讯录列表信息。 在鸿蒙中&#xff0c;因为权限方式安全性提高的变更&#xff1a;将用户权限限…

南京邮电大学运筹学课程实验报告1 图与网络求解 指导

一、题目描述 实验四 图与网络问题求解    实验属性&#xff1a; 设计型    实验目的 1&#xff0e;理解图的基本概念&#xff1b; 2&#xff0e;掌握运筹学软件的使用方法&#xff1b; 3. 掌握图中Dijkstra算法Matlab求解原理和方法。 …

系统概括javaScript运算符

目录 一.前言 二.算术运算符 三.前置后置递增运算符 四.比较运算符 五.逻辑运算符 六.各类运算符的优先级 一.前言 运算符通常被称为操作符&#xff0c;是用于实现赋值&#xff0c;比较和执行算术运算等功能的符号。 主要包括算术运算符&#xff0c;比较运算符&#xff0…

Vue 3 中创建一个动态的组件实例

本文将介绍如何在 Vue 3 中实现一个动态 Toast 组件实例。我们将创建一个简单的 Toast 组件&#xff0c;并使用一个动态创建实例的脚本来显示 Toast 消息。在 Vue 3 中创建动态组件实例有许多好处&#xff0c;这些好处主要体现在灵活性、性能、可维护性和用户体验等方面。 创建…

备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点

距离接下来的AMC8、AMC10美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;…

【python】PyQt5顶层窗口相关操作API原理剖析,企业级应用实战分享

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

2023年全国大学生电子信息竞赛E题——自动追踪系统(stm32和openmv+普通舵机)完美解决第四问

当时做的时候&#xff0c;当时看别人开源的23年的题&#xff0c;感觉一头雾水。两个字没思路。确实只有做了才会有思路。我这里清晰的整理出来思路。 1.第一问的复位问题就是写一个函数&#xff0c;如果按键按下&#xff0c;就进入&#xff0c;再按下就退出 当然这个复位是写死…

VMware Workstation 虚拟机网络配置为与主机使用同一网络

要将 VMware Workstation 虚拟机网络配置为与主机使用同一网络&#xff0c;我们需要将虚拟机的网络适配器设置为桥接模式。具体步骤如下&#xff1a; 配置 VMware Workstation 虚拟机网络为桥接模式 打开 VMware Workstation&#xff1a; 启动 VMware Workstation。 选择虚拟机…

某企业数据治理总体解决方案(45页PPT)

引言&#xff1a;集团企业数据治理总体解决方案旨在构建一个高效、安全、合规且灵活的数据管理体系&#xff0c;以支持企业决策优化、业务创新、风险管理和运营效率提升。该方案通过整合数据资源、规范数据流程、强化数据质量和促进数据共享&#xff0c;实现数据资产的最大化价…