MyBatis的相关api

news2025/2/25 0:13:03

1. MyBatis的相关api

1.1 Resources

  • org.apache.ibatis.io.Resources:加载资源的工具类。

核心方法

返回值方法名说明
InputStreamgetResourceAsStream(String fileName)通过类加载器返回指定资源的字节流

1.2 构建器SqlSessionFactoryBuilder

建造者设计模式:

  • org.apache.ibatis.session.SqlSessionFactoryBuilder:获取 SqlSessionFactory 工厂对象的功能类

核心方法

返回值方法名说明
SqlSessionFactorybuild(InputStream is)通过指定资源字节输入流获取SqlSession工厂对象
  • 通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
String resource = "org/mybatis/builder/mybatis-config.xml"; 
InputStream inputStream = Resources.getResourceAsStream(resource); 
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 
SqlSessionFactory factory = builder.build(inputStream);

其中, Resources 工具类,这个类在 org.apache.ibatis.io 包中。
Resources 类帮助你从类路径下、文件系统或一个 web URL 中加载资源文件。

1.3 工厂对象SqlSessionFactory

工厂设计模式:

  • org.apache.ibatis.session.SqlSessionFactory:获取 SqlSession 构建者对象的工厂接口。

核心api

返回值方法名说明
SqlSessionopenSession()获取SqlSession构建者对象,并开启手动提交事务
SqlSessionopenSession(boolean autoCommit)获取SqlSession构建者对象,如果参数为true,则开启自动提交事务

1.4 SqlSession会话对象

  • org.apache.ibatis.session.SqlSession:构建者对象接口。

  • 用于执行 SQL、管理事务、接口代理。

  • 核心api

在这里插入图片描述

SqlSession 实例在 MyBatis 中是非常强大的一个类。
在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。

2. 接口代理方式实现Dao

2.1 代理开发方式介绍

采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。

Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

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

1) Mapper.xml文件中的namespace与mapper接口的全限定名相同

2) Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3) Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同

4) Mapper接口方法的返回值类型和mapper.xml中定义的每个sql的resultType的类型相同

总结:

接口开发的方式: 程序员只需定义接口,就可以对数据库进行操作,那么具体的对象怎么创建?

1.程序员负责定义接口

2.在操作数据库,mybatis框架根据接口,通过动态代理的方式生成代理对象,负责数据库的crud操作

3. MyBatis 映射配置文件

3.1 映射配置文件介绍

  • 映射配置文件包含了数据和对象之间的映射关系以及要执行的 SQL 语句

3.2 查询功能

<Select> 查询功能标签
  • 属性 id:唯一标识, 配合名称空间使用。

  • parameterType:指定参数映射的对象类型。

  • resultType:指定结果映射的对象类型。

  • SQL 获取参数: #{属性名} #表示方式sql注入的 $ 表示sql拼接 where id=1 1=1

  • 示例

<!--  java.lang.Integer-->
<select id="findById" parameterType="java.lang.String" resultType="cn.zxy.pojo.User">        
select * from user where id=#{id}
</select>

3.3 新增功能

<insert>:新增功能标签。
  • 属性 id:唯一标识, 配合名称空间使用。

    • parameterType:指定参数映射的对象类型。
  • SQL 获取参数: #{属性名}

  • 示例

操作步骤:

第一步、编写dao接口

public void save(User user);

第二步、编写映射文件

<insert id="save" parameterType="com.by.pojo.User">
    insert into user values(#{id},#{username},#{sex},#{address},#{birthday})
</insert>

第三步、测试代码

@Test
public void saveTest() throws IOException {
    //读取配置文件
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取建造者对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sessionFactory = builder.build(is);
    SqlSession session = sessionFactory.openSession();
    UserDao mapper = session.getMapper(UserDao.class);
    User user=new User();
   // user.setId(1);
    user.setUsername("张三");
    user.setSex("男");
    user.setAddress("河南开封");
    user.setBirthday("2010-09-12");
    mapper.save(user);
    //提交数据
     session.commit();
    //释放资源
    is.close();
    session.close();}

3.4 修改功能

<update>:修改功能标签。
  • 属性 id:唯一标识, 配合名称空间使用。

    • parameterType:指定参数映射的对象类型。
  • SQL 获取参数: #{属性名}

  • 示例

1、编写dao接口

public void update(User user);

2、编写映射文件

<update id="update" parameterType="cn.zxy.pojo.User">
    update user set username=#{username},sex=#{sex} where id=#{id}
</update>

3、测试运行

@Test
public void update() throws IOException {
    //读取配置文件
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取建造者对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sessionFactory = builder.build(is);
    SqlSession session = sessionFactory.openSession();
    UserDao mapper = session.getMapper(UserDao.class);User user=new User();
    user.setId(1);
    user.setUsername("张三");
    user.setSex("女");
    mapper.update(user);
      //提交数据
     session.commit();
    //释放资源
    is.close();
    session.close();}

3.5 删除功能

<delete>:查询功能标签。
  • 属性 id:唯一标识, 配合名称空间使用。

    • parameterType:指定参数映射的对象类型。
  • SQL 获取参数: #{属性名}

1、编写dao接口

public void delete(int id);
  • 示例
<delete id="delete" parameterType="java.lang.Integer">
    delete from user where id=#{id}
</delete>

3、测试运行

@Test
public void delTest() throws IOException {
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取建造者对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sessionFactory = builder.build(is);
    SqlSession session = sessionFactory.openSession();
    UserDao mapper = session.getMapper(UserDao.class);
    mapper.delete(1);
     //提交数据
     session.commit();
    //释放资源
    is.close();
    session.close();
}
  • 总结: 大家可以发现crud操作,除了标签名称以及sql语句不一样之外,其他属性参数基本一致。

3.6 抽取工具类

public class MybatisUtils {
    //定义静态的session工厂对象
    static SqlSessionFactory sqlSessionFactory;
    static {
        //读取配置文件
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            sqlSessionFactory = builder.build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }}
    //提交
    public static SqlSession getSqlSession(boolean autocommit){
        return sqlSessionFactory.openSession(autocommit);
    }
    //关闭
    public static void closeSqlSession(SqlSession sqlSession){
        sqlSession.close();
    }
}

测试操作:

@Test
public void findTest() throws IOException {
    //调用utils里面的getsqlSession 包含提交操作
    SqlSession session = MybatisUtils.getSqlSession(true);
    UserDao mapper = session.getMapper(UserDao.class);
    List<User> all = mapper.findAll();
    for (User user : all) {
        System.out.println(user);
    }
    //释放资源
    MybatisUtils.closeSqlSession(session);
}

3.7 注解实现案例

@insert 添加操作

1、编写mapper接口

@Insert("insert into T_user values(#{id},#{username},#{sex},#{address},#{birthday})")
public void save(User user);

2、编写测试类

@Test
public void insertTest(){SqlSession sqlSession = MybatisUtils.getSqlSession(true);
    IUsermapper mapper = sqlSession.getMapper(IUsermapper.class);
    User user=new User();
    user.setUsername("胡二小");
    user.setSex("女");
    user.setAddress("郑州");
    user.setBirthday("2001-09-12");
    mapper.save(user);
    //释放资源
    MybatisUtils.closeSqlSession(sqlSession);}

@update修改操作

@Update("update T_user set username=#{username},sex=#{sex} where id=#{id}")
public void update(User user);

@Delete删除操作

@Delete("delete from T_user where id=#{id}")
public void delete(int id);

3.8 问题扩展:新增用户 id 的返回值

新增用户后, 同时还要返回当前新增用户的 id 值, 因为 id 是由数据库的自动增长来实现的,所以就相

当于我们要在新增后将自动增长 auto_increment 的值返回。

 <insert id="saveUser" parameterType="user">
 
        <!--配置保存时获取插入的id-->
        <!-- selectKey:是指要执行相关的sql
            order: selectKey中sql执行的顺序,after 代表之后,before代表之前
            keyProperty:指的是实体类中的属性
            keyColumn: 指定的是数据库表中的主键字段名
    -->
        <selectKey order="AFTER" keyProperty="id" keyColumn="id" resultType="int">
            select last_insert_id()
        </selectKey>
​
insert into T_user(id,username,sex,address,birthday) values(#{id},#{username},#{sex},#{address},#{birthday})
    </insert>

编写步骤:

1、在dao中添加一个方法

public void saveUser(User user);

2、编写映射

3、编写测试

@Test
public void saveTest() throws IOException {
    SqlSession sqlSession = MybatisUtils.getSqlSession(true);
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    User user=new User();
   // user.setId(1);
    user.setUsername("小李子");
    user.setSex("男");
    user.setAddress("郑州");
    user.setBirthday(Date.valueOf("2011-09-12"));
    //mapper.save(user);
    mapper.saveUser(user);
    //打印id的值
    System.out.println("userId="+user.getId());
   MybatisUtils.closeSqlSession(sqlSession);
}

总体解释:将插入数据的主键返回到 user 对象中。

  • 具体解释:

  • SELECT LAST_INSERT_ID():得到刚 insert 进去记录的主键值,只适用与自增主键

  • keyProperty:将查询到主键值设置到 parameterType 指定的对象的那个属性

  • keyColumn 指定的是表中的主键字段名

  • resultType:指定 SELECTLAST_INSERT_ID() 的结果类型

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

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

相关文章

思维决定发展,测试人也不例外

最近特别懒&#xff0c;不想码字&#xff0c;原本写作就很差&#xff0c;更是退化严重。社招和校招面试过很多人&#xff0c;从十年前自己还很弱的时候学着面试&#xff0c;到数百次面试积累之后&#xff0c;面对候选人的时候&#xff0c;我的内心依然有些许紧张&#xff0c;非…

MySQL原理探索——31 误删数据后除了跑路,还能怎么办

在前面几篇文章中&#xff0c;介绍了 MySQL 的高可用架构。当然&#xff0c;传统的高可用架构是不能预防误删数据的&#xff0c;因为主库的一个 drop table 命令&#xff0c;会通过 binlog 传给所有从库和级联从库&#xff0c;进而导致整个集群的实例都会执行这个命令。 虽然我…

文件IO 文件属性获取,目录操作

文件属性获取 int stat(const char *path, struct stat *buf); 功能&#xff1a;获取文件属性参数&#xff1a; path&#xff1a;文件路径名 buf&#xff1a;保存文件属性信息的结构体返回值&#xff1a; 成功&#xff1a;0 失败&#xff1a;-1struct stat {ino_t st_ino;…

springboot项目创建整个完成过程和注意事项

1&#xff1a;application.yml文件配置 server:port: 8088servlet:context-path: /test spring:datasource:name: text #????url: jdbc:mysql://localhost:3306/dsdd?serverTimezoneGMT&useUnicodetrue&characterEncodingutf-8&useSSLtrueusername: root #…

java模拟MQTT客户端发送消息及EMQX配置

EMQX配置 登录地址 首先打开EMQX的管理界面&#xff0c;界面的地址如下&#xff0c; http://192.168.1.110:18083/ 规则是IP就是MQTT的IP&#xff0c;端口是固定的18083&#xff0c;输入该地址后&#xff0c;展示界面如下&#xff1a; 然后输入用户名和密码&#xff0c;用户…

0132 数据的表示和运算1

目录 2.数据的表示和运算 2.1数制与编码 2.1部分习题 2.数据的表示和运算 2.1数制与编码 2.1部分习题 1.若定点整数为64位&#xff0c;含1位符号位&#xff0c;则采用补码表示的最大值最大的负数为&#xff08;&#xff09; A. B. C. D. 2.若x的补…

戴佩妮《随风所遇》世界巡回演唱会内地首站八月启动,乘风归来,相遇之约!

今日&#xff0c;戴佩妮(Penny)《随风所遇2023 Drift World Tour》世界巡回演唱会正式官宣内地首站&#xff0c;8月26日登陆南京太阳宫剧场。自2016年《贼》世界巡回演唱会之后&#xff0c;华语乐坛唱作人戴佩妮乘著所有粉丝期待的“风”回来&#xff0c;并带来曲目、造型等方面…

如何理解操作系统?(Operator System)

文章目录 一.什么是操作系统二.操作系统的层状结构三.操作系统如何管理 一.什么是操作系统 先入为主&#xff0c;操作系统是一款管理软件 操作系统分为两部分 操作系统本身&#xff0c;主要做一些进程管理、内存管理、文件管理、驱动管理等工作&#xff0c;这种核心部分叫做…

归并排序递归与非递归

基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&a…

Jenkins (二)

Jenkins (二) 使用pipeline script 简单编译 发布war工程到远程tomcat中 配置所需 下载 apache-maven-3.9.3.tar.gz 解压 apache-maven-3.9.3-bin.tar.gz 拷贝到 docker jenkins 镜像里 $ docker cp apache-maven-3.9.3 37259c708ca1:/home/下载apache-tomcat-8.5.91.tar.gz …

压测工具之JMeter使用

文章目录 前言压测工具如何使用启动JMeter工具开始创建测试环境1、创建线程组2、配置元件3、构造HTTP请求4、添加HTTP请求头信息 5、添加断言6、添加查看结果树7、添加聚合报告信息8、测试计划创建完成了 执行测试计划 前言 最近公司项目需要进行压测&#xff0c;查验S A A S …

7.18训练总结

考场错误&#xff1a; 今天是一套neerc的题&#xff0c;难度相对较大&#xff0c;我犯的低级错误比较少&#xff0c;但是对于题目顺序的把握能力&#xff0c;应该提高&#xff0c;尝试去做自己擅长的题目&#xff0c;而不是跟着别人的开题顺序&#xff0c;这样能够更顺畅吧。 …

实验室LIMS系统检测工作流程

LIMS系统检测工作流程 检测工作流程是LIMS核心内容&#xff0c;通过检测工作管理可加强协同工作能力、进一步强化质量控制环节、提高数据报出速度&#xff0c;提高工作效率、减低数据出错率&#xff0c;保证质量记录的完整、监控规范的执行&#xff1b;检测流程以样品检测为主…

Jenkins | 获取凭证密码

目录 方法一&#xff1a;查看所有账号及密码 方法二&#xff1a;查看指定账号密码 方法一&#xff1a;查看所有账号及密码 Jenkins > 系统管理 > 脚本命令行 com.cloudbees.plugins.credentials.SystemCredentialsProvider.getInstance().getCredentials().forEach{i…

element-ui message消息提示组件 ①延长提示消息在页面停留时间②提示消息换行

以实现下面的效果为示例 完整代码&#xff1a; let msgList ["数据1被引用", "数据2被引用"];// 使用html的换行标签拼接信息&#xff0c;默认行距太小&#xff0c;此处用两个<br/><br/>let message 以下数据不能删除&#xff0c;原因是&…

【Spring core学习四】Bean作用域和生命周期

目录 一、Bean的作用域 &#x1f308;1、被修改的Bean值现象 &#x1f308;2、 Bean 的 6 种作⽤域 &#x1f308;3、设置作用域 二、Spring的执行流程 三、Bean的生命周期 &#x1f308;1、Bean生命周期的过程 &#x1f308;2、演示生命周期 一、Bean的作用域 &…

[MySql]JDBC编程

JDBC&#xff0c;即Java Database Connectivity&#xff0c;java数据库连接。是一种用于执行SQL语句的Java API&#xff0c;它是Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成&#xff0c;它为Java开发人员操作数据库提供了一个标准的API&…

全域Serverless化,华为云引领下一代云计算新范式

近日&#xff0c;华为开发者大会2023&#xff08;Cloud&#xff09;在东莞成功举办&#xff0c;期间“全域Serverless化&#xff0c;引领下一代云计算新范式”专题论坛人气满满。华为云首席产品官方国伟携手业界专家、客户、伙伴&#xff0c;面向广大开发者&#xff0c;分享了在…

Authing 身份云上线数据对象管理(元数据),助力企业构建唯一身份源

在身份管理领域&#xff0c;元数据具有重要的作用和价值。元数据有助于理解数据的结构和意义&#xff0c;提升数据处理效率&#xff1b;促进跨部门、跨组织的数据共享和协作&#xff1b;以及支持数据分析&#xff0c;为业务决策提供支持等。当前&#xff0c;Authing 身份云已经…

在ICC/ICC2/FC中运行Calibre

1. which calibre找到calibre的安装目录 > which calibre > /eda/mentor/ixl_cal_version/bin/calibre 2. 在 /eda/mentor/ixl_cal_version目录下使用find ./* -name "icc_calibre.tcl",找到icc_calibre.tcl 3. 打开icc_calibre.tcl里面有不同工具(ICC2/FC/…