【Java框架】Mybatis教程(一)——环境搭建及基本CRUD操作

目录

  • 持久化与ORM
    • ORM(Object Relational Mapping)
    • ORM解决方案包含下面四个部分
  • MyBatis简介
    • 特点
    • MyBatis框架优缺点
      • 优点
      • 缺点
  • 搭建MyBatis开发环境步骤
    • 1. 创建Maven工程,导入MyBatis依赖的组件
    • 2. 编写MyBatis核心配置文件(mybatis-config.xml)
      • 示例
      • properties
      • settings元素
      • typeAliases
      • environments
      • mappers
    • 3. 创建实体类-POJO
    • 4. 创建SQL映射文件(mapper.xml)
    • 5. 创建测试类
    • 6. 读取核心配置文件mybatis-config.xml
      • mybatis基本要素
        • MyBatis的核心对象
      • mybatis-config.xml 系统核心配置文件
      • mapper.xml SQL映射文件
    • 7. 创建SqlSessionFactory对象,读取配置文件
      • SqlSessionFactoryBuilder
      • SqlSessionFactory
    • 8. 创建SqlSession对象
    • 9. 调用mapper文件进行数据操作
      • SqlSession的两种使用方式
      • 日志配置文件
      • 测试代码
        • 通过SqlSession实例直接运行映射的SQL语句
      • 控制台输出结果
  • sqlSession常用方法
  • XXapper.xml
    • namespace:命名空间
    • 1.创建持久层Mapper接口
    • 2.修改UserMapper.xml
    • 3.测试(基于Mapper接口方式操作数据)
  • mapper.xml中的常用标签(本章先列举基本的CRUD)
    • select
    • insert
      • 代码案例
      • 主键回填
        • 方式一
        • 方式二
        • 测试
    • update
      • 代码案例
    • delete
      • 代码案例
    • 关于parameterType与resultType的值
  • mybatis工作原理
    • 步骤解析
  • Mybatis封装JDBC与解析XML的源码概览

框架:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。在框架的基础上进行软件开发更加高效、规范、通用、可拓展。

持久化与ORM

在这里插入图片描述

  • 持久化是程序数据在瞬时状态和持久状态间转换的过程

ORM(Object Relational Mapping)

  • 即对象/关系映射,是一种数据持久化技术。
  • 它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据。
  • 编写程序的时候,以面向对象的方式处理数据
  • 保存数据的时候,却以关系型数据库的方式存储

ORM解决方案包含下面四个部分

  1. 在持久化对象上执行基本的增、删、改、查操作
  2. 对持久化对象提供一种查询语言或者API
  3. 对象关系映射工具
  4. 提供与事务对象交互、执行检查、延迟加载以及其他优化功能

MyBatis简介

官方网站:http://mybatis.org

  • MyBatis 本是Apache的一个开源项目iBatis, 2010年项目由Apache迁移到了Google Code,并且改名为MyBatis 。2013年11月迁移到GitHub。
  • MyBatis通过实体类和SQL语句之间建立映射关系,是半自动化的ORM框架,是一款优秀的基于Java的数据持久层框架

特点

  1. 基于SQL语法,简单易学
  2. 能了解底层封装过程,内部通过JDBC访问数据库的操作
  3. SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
  4. 方便程序代码调试

MyBatis框架优缺点

优点

  • 与JDBC相比,减少了50%以上的代码量
  • 最简单的持久化框架,小巧并简单易学
  • SQL代码从程序代码中彻底分离,可重用
  • 提供XML标签,支持编写动态SQL
  • 提供映射标签,支持对象与数据库的ORM字段映射

缺点

  • SQL语句编写工作量大,对开发人员有一定要求
  • 数据库移植性差

MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,适用于性能要求较高或者需求多变的互联网项目

搭建MyBatis开发环境步骤

1. 创建Maven工程,导入MyBatis依赖的组件

	<dependency>
	    <groupId>mysql</groupId>
	    <artifactId>mysql-connector-java</artifactId>
	    <version>5.1.47</version>
	</dependency>
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.4.6</version>
	</dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <!--日志包-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>

2. 编写MyBatis核心配置文件(mybatis-config.xml)

示例

database.properties

driverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/smbms?useSSL=false&characterEncoding=utf-8
username = root
password = 123456

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">
<!-- Mybatis核心配置文件 -->
<configuration>
    <properties resource="database.properties"></properties>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <typeAliases>
        <package name="com.zjl.pojo"/>
    </typeAliases>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driverClassName}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

在这里插入图片描述

properties

通过外部指定的方式(database.properties),实现动态配置

settings元素

是设置一些非常重要的设置选项,用来设置和改变MyBatis运行时的行为方式

设置参数描述有效值默认值
cacheEnabled该配置影响所有映射器中配置的缓存全局开关。true/falsetrue
lazyLoadingEnabled延迟加载的全局开关。开启时,所有关联对象都会延迟加载。特定关联关系中可以通过设置fetchType属性来覆盖该项的开关状态。true/falsefalse
aggressiveLazyLoading关联对象属性的延迟加载开关。当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性会按需加载。true/falsetrue
multipleResultSetsEnabled是否允许单一语句返回多结果集(需要兼容驱动)。true/falsetrue
useColumnLabel使用列标签代替列名。不同的驱动在这方面有不同的表现。具体可参考驱动文档或通过测试两种模式来观察所用驱动的行为。true/falsetrue
useGeneratedKeys允许JDBC支持自动生成主键,需要驱动兼容。如果设置为true,则这个设置强制使用自动生成主键,尽管一些驱动不兼容但仍可正常工作。true/falsefalse
autoMappingBehavior指定MyBatis应如何自动映射列到字段或属性。NONE表示取消自动映射; PARTIAL只会自动映射没有定义嵌套结果集映射的结果集; FULL会自动映射任意复杂的结果集(无论是否嵌套)。NONE、 PARTIAL、 FULLPARTIAL
defaultExecutorType配置默认的执行器。SIMPLE就是普通的执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新。SIMPLE、 REUSE、 BATCHSIMPLE
defaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数。当没有设置的时候,它取的就是驱动默认的时间。任何正整数没有设置
mapUnderscoreToCamelCase是否开启自动驼峰命名规则(camel case)映射true/falsefalse
jdbcTypeForNull当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,比如NULL、VARCHAR或OTHER。NULL、 VARCHAR、 OTHEROTHER

typeAliases

配置类型别名,通过与MyBatis的SQL映射文件相关联,减少输入 多余的完整类名,以简化操作。
在这里插入图片描述

environments

  • 表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上
  • 子元素节点:environment,但是必须指定其中一个为默认运行环境(通过default指定)
  • 每个SqlSessionFactory实例只能选择一个运行环境
    在这里插入图片描述

mappers

  • 映射器,定义SQL映射语句。须在配置中引用mapper映射文件
  • 使用类资源路径获取资源
<!-- 将mapper映射文件加入到系统核心配置文件中 -->
<mappers>
	<mapper  resource="mapper/UserMapper.xml"/>
</mappers>

3. 创建实体类-POJO

根据数据库表创建对应的实体类

package com.smbms.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * @author: zjl
 * @datetime: 2024/3/23
 * @desc:
 */
@Data
@ToString
@NoArgsConstructor
public class User implements Serializable {
    private long id;
    private String userCode;
    private String userName;
    private String userPassword;
    private int gender;
    private Date birthday;
    private String phone;
    private String address;
    private int userRole;
}

4. 创建SQL映射文件(mapper.xml)

<?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="userMapperSQlxml">
    <select id="getUserCount" resultType="int">
        SELECT COUNT(1) FROM SMBMS_USER
    </select>
</mapper>

5. 创建测试类

6. 读取核心配置文件mybatis-config.xml

mybatis基本要素

MyBatis的核心对象
  • SqlSessionFactoryBuilder
  • SqlSessionFactory
  • SqlSession

mybatis-config.xml 系统核心配置文件

mapper.xml SQL映射文件

在这里插入图片描述

7. 创建SqlSessionFactory对象,读取配置文件

SqlSessionFactoryBuilder

  • 用过即丢,其生命周期只存在于方法体内
  • 可重用其来创建多个 SqlSessionFactory 实例
  • 负责构建SqlSessionFactory,并提供多个build方法的重载

SqlSessionFactory

  • SqlSessionFactory是每个MyBatis应用的核心
  • 作用:创建SqlSession实例
  • 作用域:Application
  • 生命周期与应用的生命周期相同
  • 单例:存在于整个应用运行时,并且同时只存在一个对象实例
  • SqlSession session = sqlSessionFactory.openSession(boolean autoCommit);
    • autoCommit为true:关闭事务控制(默认)
    • autoCommit为false:开启事务控制

8. 创建SqlSession对象

SqlSession:

  • 包含了执行SQL所需的所有方法
  • 对应一次数据库会话,会话结束必须关闭
  • 线程级别,不能共享
  • 在SqlSession里可以执行多次SQL语句,但一旦关闭了SqlSession就需要重新创建

9. 调用mapper文件进行数据操作

SqlSession的两种使用方式

  • 通过SqlSession实例直接运行映射的SQL语句
  • 基于Mapper接口方式操作数据(推荐)

日志配置文件

log4j.rootLogger=DEBUG,CONSOLE,file
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.cn.smbms.dao=debug
log4j.logger.com.ibatis=debug 
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug 
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug 
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug 
log4j.logger.java.sql.Connection=debug 
log4j.logger.java.sql.Statement=debug 
log4j.logger.java.sql.PreparedStatement=debug 
log4j.logger.java.sql.ResultSet=debug 
log4j.logger.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter=debug

######################################################################################
# Console Appender  \u65e5\u5fd7\u5728\u63a7\u5236\u8f93\u51fa\u914d\u7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= [%p] %d %c - %m%n

######################################################################################
# DailyRolling File  \u6bcf\u5929\u4ea7\u751f\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u683c\u5f0f:log2009-09-11
######################################################################################
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=yyyy-MM-dd
log4j.appender.file.File=log.log
log4j.appender.file.Append=true
log4j.appender.file.Threshold=error
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
log4j.logger.com.opensymphony.xwork2=error  

测试代码

通过SqlSession实例直接运行映射的SQL语句
package com.zjl.test;

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.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author: zjl
 * @datetime: 2024/4/15
 * @desc:
 */

public class MybatisTest {
    private static SqlSessionFactory factory = null;
    @BeforeAll
    public static void init(){
        //1.定义mybatis核心配置文件的路径
        String path = "mybatis-config.xml";
        //2.转字节流接收
        try {
            InputStream is = Resources.getResourceAsStream(path);
            //3.创建SqlSessionFactory对象
            factory = new SqlSessionFactoryBuilder().build(is);
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test(){
        SqlSession session = factory.openSession();
        int count = session.selectOne("userMapperSQlxml.getUserCount");
        System.out.println(count);
        session.close();
    }
}

控制台输出结果

[DEBUG] 2024-04-15 10:58:26,978 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG] 2024-04-15 10:58:26,979 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG] 2024-04-15 10:58:26,979 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG] 2024-04-15 10:58:26,980 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[DEBUG] 2024-04-15 10:58:27,066 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
[DEBUG] 2024-04-15 10:58:27,308 org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1579132337.
[DEBUG] 2024-04-15 10:58:27,308 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@5e1fa5b1]
[DEBUG] 2024-04-15 10:58:27,312 userMapperSQlxml.getUserCount - ==>  Preparing: SELECT COUNT(1) FROM SMBMS_USER 
[DEBUG] 2024-04-15 10:58:27,332 userMapperSQlxml.getUserCount - ==> Parameters: 
[DEBUG] 2024-04-15 10:58:27,423 userMapperSQlxml.getUserCount - <==      Total: 1
14
[DEBUG] 2024-04-15 10:58:27,424 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@5e1fa5b1]
[DEBUG] 2024-04-15 10:58:27,424 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@5e1fa5b1]
[DEBUG] 2024-04-15 10:58:27,424 org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1579132337 to pool.

sqlSession常用方法

方法说明
int insert(String statement)。插入方法,参数statement是在配置文件中定义的<insert…/>元素的id,返回执行SQL语句所影响的行数。
int insert(String statement,Object parameter)。插入方法,参数statement是在配置文件中定义的<insert…/>元素的id,parameter是插入所需的参数,通常是对象或者Map,返回执行SQL语句所影响的行数。
int update(String statement) 。更新方法,参数statement是在配置文件中定义的<update…/>元素的id,返回执行SQL语句所影响的行数。
int update(String statement,Object parameter)。更新方法,参数statement是在配置文件中定义的<update…/>元素的id,parameter是插入所需的参数,通常是对象或者Map,返回执行SQL语句所影响的行数。
int delete(String statement) 。删除方法,参数statement是在配置文件中定义的<delete…/>元素的id。返回执行SQL语句所影响的行数。
int delete(String statement,Object parameter)。删除方法,参数statement 是在配置文件中定义的<delete…/>元素的id,parameter是插入所需的参数,通常是对象或者Map,返回执行SQL语句所影响的行数。
T selectOne(String slatement)。查询方法,参数statement是在配置文件中定义的<select…/>元素的id,返回执行SQL语句查询结果的泛型对象,通常查询结果只有一条数据时才使用。
T selectOne(String statement,Object parameter)。查询方法,参数statement是在配置文件中定义的<select…/>元素的id,parameter是查询所需的参数,通常是对象或者Map,返回执行SQL语句查询结果的泛型对象,通常查询结具只有一条数据时才使用。
List selectList(String statemenl)。查询方法,参数是在配置文件中定义的<select…/>素的id,返回执行SQL话句查询结果的泛型对象的集合。
List selectList(String statement,Object parameter)。查询方法,参数statement是在配置文件中定义的<select…/>元素的id,parameter是查询所需的参数,通常是对象或者Map,返回执行SQL语句查询结果的泛型对象的集合。
List selectList(String statement,Object parameter,RowBounds rowBounds)。查询方法,参数statement是在配置文件中定义的<select…/>元素的id,parameter是查询所需的参数,通常是对象或者Map,RowBounds对象用于分页,它的两个属性: offset指查询的当前页数; limit指当前页显示多少条数据。返回执行SQL语句查询结果的泛型对象的集合。
<K,V> Map<K,V> selectMap(String statement,String mapKey) 。查询方法,参数statement是在配置文件中定义的<select…/>元素的id,mapKey是返回数据的其中一个列名,执行SQL语句查询结果将会被封装成一个Map集合返回,key就是参数mapKey传入的列名,value是封装的对象。
<K,V> Map<K,V> selectMap(String statement,0bject parameler,Sting mapKey)。查询方法,参数statement是在配置文件中定义的<select…/>元素的id,parameter是查询所需的参数,通常是对象或者Map,mapKey 是返回数据的其中一个列名,执行SQL语句查询结果将会被封装成一个Map集合返回,key就是参数mapKey传入的列名,value是封装的对象。
<K,V> Map<K,V>selectMap(Sting statement,Object parameter,Sting mapKey,RowBounds rowBounds)。查询方法,参数statement 是在配置文件中定义的<select…/>元素的id,parameter 是否询所需的参数,通常是对象或者Map,mapKey 是返回数据的其中一个列名,RowBounds 对象用于分页。执行SQL 语句查询结果将会被封装成一个Map集合返回,key就是参数mapKey传入的列名,value是封装的对象。
void select(String statement,ResultHandler handler)。查询方法,参数statement是在配置文件中定义的<select…/>元素的id,ResultHandler对象用来处理查询返回的复杂结果集,通常用于多表查询。
void select(String statement,Object parameter,ResultHander handler)。查询方法,参数statement是在配置文件中定义的<select…/>元素的id,parameter 是查询所需的参数,通常是对象或者Map, ResultHandler对象用来处理查询返回的复杂结果集,通常用于多表查询。
void select(String statement,Object parameter,RowBounds rowBounds,ResultHandr handler)。查询方法,参数statement是在配置文件中定义的<select…/>元素的id,是查询所需的参数,通常是对象或者Map,RowBounds 对象用于分页,ResultHandr对象用来处理查询返回的复杂结果集,通常用于多表查询。
void commit()。提交事务。
void rollback()。回滚事务。
void close()。关闭SqlSession对象。
Connection getConnection()。获得JDBC的数据库连接对象。
T getMapper(Class type)。返回mapper接口的代理对象,该对象关联了SqlSession对象,开发者可以通过该对象直接调用方法操作数据库,参数type是Mapper的接口类型。Mybatis官方手册建议通过mapper对象访问MyBatis。

XXapper.xml

namespace:命名空间

  • namespace和子元素的id联合保证唯一,区别不同的mapper
  • 绑定DAO接口
    • namespace的命名必须跟某个接口同名
    • 接口中的方法与映射文件中SQL语句id一一对应

1.创建持久层Mapper接口

package com.zjl.mapper;

public interface UserMapper {
    int getUserCount();
}

2.修改UserMapper.xml

<?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.zjl.mapper.UserMapper">
    <select id="getUserCount" resultType="int">
        SELECT COUNT(1) FROM SMBMS_USER
    </select>
</mapper>

3.测试(基于Mapper接口方式操作数据)

@Test
    public void getUserCountForMapper(){
        SqlSession session = factory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        int count = userMapper.getUserCount();
        System.out.println(count);
        session.close();
    }

mapper.xml中的常用标签(本章先列举基本的CRUD)

select

  • select是MyBatis中最常用的元素之一
  • select语句有很多属性可以详细配置每一条语句
    • id
      • 命名空间中唯一的标识符
      • 接口中的方法与映射文件中的SQL语句id一一对应
    • parameterType
      • 表示sql语句传入参数的类型的完全限定名和别名
      • 支持基础数据类型和复杂数据类型
    • resultType
      • SQL语句返回值类型的完整限定名或别名

insert

  • Mybatis中执行添加操作SQL的标签
  • id属性:同select
  • parameterType同select
  • 没有resultType属性
  • 返回结果表示影响行数
  • useGeneratedKeys属性, 设置添加操作是否需要回填生成的主键
  • keyProperty属性,指定回填的id设置到参数对象中的哪个属性
  • timeout属性,设置此操作的超时时间,如果不设置则一直等待

代码案例

    //返回结果表示影响行数
    int insertUser(User user);
    <insert id="insertUser" parameterType="com.zjl.pojo.User">
        INSERT INTO SMBMS_USER(id,userCode,userName,birthday)
        VALUES(default,#{userCode},#{userName},#{birthday})
    </insert>
	@Test
    public void insertUser(){
        SqlSession session = factory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        User user = new User("zjl","周杰伦",new Date());
        int lint = userMapper.insertUser(user);
        System.out.println(lint > 0 ? "添加成功" : "添加失败");
        //factory.openSession();创建的sqlSession默认不自动提交,因此需要commit
        //但是我这里只是测试,因此就不提交了
        //session.commit();
        session.close();
    }

主键回填

主键回填:对于自增主键的表,插入数据后返回该记录自动生成的主键

方式一
	<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO SMBMS_USER(id,userCode,userName,birthday)
        VALUES(default,#{userCode},#{userName},#{birthday})
    </insert>
方式二
    <insert id="insertUser" >
        <selectKey keyProperty="id" resultType="int">
            select last_insert_id()
        </selectKey>
        INSERT INTO SMBMS_USER(id,userCode,userName,birthday)
        VALUES(default,#{userCode},#{userName},#{birthday})
    </insert>
测试
@Test
    public void insertUser(){
        SqlSession session = factory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        User user = new User("zjl","周杰伦",new Date());
        int lint = userMapper.insertUser(user);
        System.out.println(lint > 0 ? "添加成功" : "添加失败");
        System.out.println("新纪录的主键是:" + user.getId());
        session.commit();
        session.close();
    }

update

  • Mybatis中执行添加修改SQL的标签
  • id属性:同select
  • parameterType同select
  • 没有resultType属性
  • 返回结果表示影响行数

代码案例

int updateUser(User user);
	<update id="updateUser" parameterType="com.zjl.pojo.User">
        UPDATE SMBMS_USER SET
               userCode=#{userCode},
               userName=#{userName},
               birthday=#{birthday}
        WHERE id=#{id}
    </update>
	@Test
    public void updateUser(){
        SqlSession session = factory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        User user = new User("zjl","周杰伦",new Date());
        int lint = userMapper.insertUser(user);
        System.out.println(lint > 0 ? "修改成功" : "修改失败");
        //session.commit();
        session.close();
    }

delete

  • Mybatis中执行添加删除SQL的标签
  • id属性:同select
  • parameterType同select
  • 没有resultType属性
  • 返回结果表示影响行数

代码案例

int deleteUserById(int id);
	<delte id="deleteUserById" parameterType="int">
        DELETE FROM SMBMS_USER WHERE id=#{id}
    </delte >
	@Test
    public void deleteUser(){
        SqlSession session = factory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        int lint = userMapper.deleteUserById(66);
        System.out.println(lint > 0 ? "删除成功" : "删除失败");
        //session.commit();
        session.close();
    }

关于parameterType与resultType的值

别名映射的类型
stringString
byteByte
longLong
shortShort
doubleDouble
floatFloat
booleanBoolean
dateDate
intInteger
integerInteger
arraylistArrayList
mapMap
hashmapHashMap
listList
collectionCollection
iteratorIterator
decimalBigDecimal
bigdecimalBigDecimal
objectObject
…………

如果maybatis-config.xml中配置了实体类别名,那么mapper.xml中就也可以简写了,比如:
mybatis-config.xml

    <typeAliases>
        <package name="com.zjl.pojo"/>
    </typeAliases>

UserMapper.xml

    <update id="updateUser" parameterType="User">
        UPDATE SMBMS_USER SET
               userCode=#{userCode},
               userName=#{userName},
               birthday=#{birthday}
        WHERE id=#{id}
    </update>

mybatis工作原理

在这里插入图片描述

步骤解析

  1. 读取 Mybatis 配置文件 mybatis-config.xml,该配置文件作为 Mybatis 的全局配置文件,配置了 Mybatis 的运行环境和数据库连接等信息。
  2. 加载映射文件 mapper.xml,该文件中配置了操作数据库的 sql 语句,需要在mybatis-config.xml中加载才能执行。mybatis-config.xml 可以加载多个配置文件,每个配置文件对应数据库中的一张表。
  3. 通过 SqlSessionFactoryBuilder 对象的 build() 方法构建会话工厂,且 build() 方法参数为 mybatis-config.xml 配置文件的输入流,通过 Mybatis 的环境等配置信息构建会话工厂 SqlSessionFactory - 工厂设计模式。
//build方法源码:将mybatis-config.xml 配置文件输入流解析成xml配置对象
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
  1. 创建 SqlSession 对象,由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 的所有方法。
  2. Mybatis 的底层定义了一个 Executor 接口来操作数据库,它会根据 SqlSession 传递的参数动态的生成需要执行的 SQL 语句,同时负责查询缓存的维护。
  3. 在 Executor 接口的方法中,包含一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等。Mapper.xml 文件中的一个SQL对应一个 MappedStatement 对象,SQL 的 id 即是 MappedStatement 的 id。
  4. 输入映射参数,在执行方法时 MappedStatement 对象会对用户执行 SQL 语句的输入参数进行定义(可以定义为 Map、List 类型、基本类型和 POJO 类型),Executor 执行器会通过 MappedStatement 对象在执行 SQL 前,将输入的 java 对象映射到 SQL 语句中。这里对输入参数的映射过程就类似于 JDBC 编程中对 preparedStatement 对象设置参数的过程。
  5. 输出结果映射,在数据库中执行完SQL语句后 MappedStatement 对象会对 SQL 执行输出的结果进行定义(可以定义为 Map、List 类型、基本类型、POJO类型),Executor 执行器会通过 MappedStatement 对象在执行 SQL 语句后,将输出结果映射到 java 对象中。这种将输出结果映射到 java 对象的过程就类似于 JDBC 编程中对结果的解析处理过程。

Mybatis封装JDBC与解析XML的源码概览

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C 数据结构】静态链表

文章目录 【 1. 基本原理 】1.1 静态链表中的节点1.2 备用链表 【 2. 静态链表的创建 】2.1 实例1 - 创建静态链表&#xff0c;指定值2.2 实例2 - 创建静态链表&#xff0c;默认值 【 3. 静态链表 添加元素 】【 4. 静态链表 删除元素 】【 5. 静态链表 查找元素 】【 6. 静态链…

腾讯EdgeOne产品测评体验—基于EO新特性与传统CDN的对比以凸显EO绝对优势【以导航站为例】

精益求精&#xff0c;卓越非凡。 ——《论语集注》 EdgeOne 作为腾讯云下一代的 CDN &#xff0c;提供域名解析、动静态智能加速、TCP/UDP 四层加速、DDoS/CC/Web/Bot 防护、边缘函数计算等一体化服务&#xff0c;也支持用户按业务需求&#xff0c;配置自定义复杂访问控制规…

Qt配置外部库(Windows平台)

这里以C的外部库nlopt为例子来示范&#xff0c;右键工程选择添加库&#xff0c;然后选择库文件的目录&#xff08;dll.a&#xff09;&#xff0c;会自动设置好包含路径&#xff08;一般是include的目录&#xff09;&#xff0c;添加库&#xff08;最下面一行&#xff09; &…

【Java】maven传递依赖冲突解决

传递依赖的概念&#xff1a; 传递依赖:&#xff1a; A.jar 依赖 B.jar, B.jar 依赖 C.jar, 这个时候我们就说B是A的直接依赖, C是A传递依赖; 传递依赖可能会产生冲突: 联系着上面, 新导入一个jar包D.jar, D依赖C.jar, 但是B依赖的1.1版本, 而D依赖的是1.2版本, 这时候C这个j…

ROS2从入门到精通1-3:详解ROS2动作通信机制与自定义动作

目录 0 专栏介绍1 动作通信模型2 动作模型实现(C)3 动作模型实现(Python)4 自定义动作 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 &#x1f680;详情&a…

设计模式——观察者模式17

观察者模式指多个对象间存在一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式。 中介者模式是N对N的双向关系。观察者模式是1对N的单向关系。 设计模式&#xff0c;一定要敲代码…

【Linux网络编程】UDP协议

UDP协议 1.再谈端口号端口号划分认识知名端口号(Well-Know Port Number)两个问题netstatpidof 2.UDP协议2.1UDP的特点2.2面向数据报2.3UDP的缓冲区2.4UDP使用注意事项2.5基于UDP的应用层协议 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&#xff01; 1.再谈端口号 端口…

如何选择适用于Mac的文件恢复软件?适用于 Mac 的最佳数据恢复软件清单

有人会说&#xff0c;我们的数字生活正变得几乎和我们的物理生活一样重要。我们在线工作&#xff0c;将记忆保存在数码照片库中&#xff0c;在信使中交流&#xff0c;并保留各种文档的数字扫描。 每个人都知道备份是必不可少的。建议每天至少同步一个数字备份&#xff08;例如…

Spring Boot 学习(3)——Spring Initializr 创建项目问题解决

产生问题的原因&#xff0c;各种的版本都较老&#xff0c;所以导致出现问题。目前暂未打到合适的教程&#xff0c;按老教程学起来先。 小白瞎学&#xff0c;大神勿喷&#xff01; 再次强调环境&#xff1a;maven 3.3.9、jdk 1.8、idea 2017、Spring 4.3.13、Spring Boot 1.5.…

C/C++基础----指针

指针的定义 在c/c中&#xff0c;有一个特殊的变量指向我们电脑中某个内存地址&#xff0c;进而可以让我们操作这段内存&#xff0c;指的就是指针类型 语法&#xff1a; int a 10; int* p &a;&符号是取出某个变量的内存地址 把这个内存地址赋值给一个变量p&#xff…

数据适配器对象(DataAdapter)

一、DataAdapter对象概述 1、 DataAdapter是一个特殊的类&#xff0c;其作用是数据源与DataSet对象之间沟通的桥梁。 2、 DataAdapter提供了双向的数据传输机制 &#xff08;1&#xff09; 在数据源上执行Select语句&#xff0c;把查询结果集传送到DataSet对象的…

基于Spring Boot的入职匹配推荐系统设计与实现

基于Spring Boot的入职匹配推荐系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录界面&#xff0c;登录成功后进入到系统操…

STC89C52学习笔记(九)

STC89C52学习笔记&#xff08;九&#xff09; 综述&#xff1a;本文主要介绍了蜂鸣器、蜂鸣器如何使用以及如何利用蜂鸣器播放不同频率声音。 一、蜂鸣器 1.定义和作用 电信号→声音信号&#xff0c;常用来产生按键音和报警音。 2.分类 有源&#xff1a;自带振荡器&#…

设计模式面试题

概述 设计模式分类 创建型模式 用于描述“怎样创建对象”&#xff0c;主要特点是“将对象的创建与使用分离”。使用者不需要官族对象创建的细节。结构型模式 用于描述如何将类或对象按照某种布局组成更大的结构。行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象…

面试经典150题——二叉树的最大深度

1. 题目描述 ​ 2. 题目分析与解析 这个题目有过一定基础的都应该知道&#xff0c;采用递归解决问题&#xff0c;因为要求一个二叉树的深度&#xff08;也就是高度&#xff09;&#xff0c;其实上就是根节点的左子树和右子树中高度最高的那个。因此这个问题就可以拆解为&…

微服务之OpenFeign服务接口调用

一、概述 1.1简介 OpenFeign客户端是一个web声明式http远程调用工具&#xff0c;直接可以根据服务名称去注册中心拿到指定的服务IP集合&#xff0c;提供了接口和注解方式进行调用&#xff0c;内嵌集成了Ribbon本地负载均衡器。 Feign是一个声明性web服务客户端。它使编写web服…

BackTrader 中文文档(二十三)

原文&#xff1a;www.backtrader.com/ 基准测试 原文&#xff1a;www.backtrader.com/blog/posts/2016-07-22-benchmarking/benchmarking/ backtrader包括两种不同类型的对象&#xff0c;可以帮助跟踪&#xff1a; 观察者 分析器 问题 #89是关于添加针对资产的基准测试。这是…

[阅读笔记12][LLaVA-1.5]Improved Baselines with Visual Instruction Tuning

1.5版本是llava作者在23年10月提交的。 作者对原始的llava进行了四个很小的改进&#xff0c;之后就刷了11个数据集的sota。而且可以看到llava用于训练的数据量很小&#xff0c;与instructBLIP和通义千问比少多了。 然后这里就是llava1.5进行的四个小改进。 第一点是prompt明确短…

【Excel如何在表格中筛选重复的值之条件格式】

在使用excel进行统计时经常会遇到&#xff0c;数据统计出现重复的现象&#xff0c;为了确保数据的唯一性&#xff0c;可以用到条件格式筛选出重复值&#xff0c;以确保数据的正确性。 筛选重复值&#xff1a; 选中要筛选的范围&#xff0c;行或列或整个表选中【开始】-【条件…

vue快速入门(二十三)侦听器的简单写法与完整写法

注释很详细&#xff0c;直接上代码 上一篇 新增内容 侦听器简单写法侦听对象或属性侦听器完整写法侦听对象&#xff08;可选深度侦听&#xff09; 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name…