【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 configurationPUBLIC "-//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 mapperPUBLIC "-//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;@BeforeAllpublic 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();}}@Testpublic 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 mapperPUBLIC "-//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接口方式操作数据)

@Testpublic 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>
	@Testpublic 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>
测试
@Testpublic 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 SETuserCode=#{userCode},userName=#{userName},birthday=#{birthday}WHERE id=#{id}</update>
	@Testpublic 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 >
	@Testpublic 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 SETuserCode=#{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的源码概览

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu22安装snipaste

Ubuntu 22.04 一、Snipaste 介绍和下载 Snipaste 官网下载链接: Snipaste Downloads 二、安装并使用 Snipaste # 1、进入Snipaste-2.8.9-Beta-x86_64.AppImage 目录&#xff08;根据自己下载目录&#xff09; cd /home/jack/Downloads/softwares/AppImage# 2、Snipaste-2.8.9-…

Docker镜像,什么是Docker镜像,Docker基本常用命令

docker镜像 1.1什么是镜像&#xff0c;镜像基础 1.1.1 镜像的简介 镜像是一种轻量级&#xff0c;可执行的独立软件包&#xff0c;也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境&#xff0c;具体来说镜像包含运行某个软件所需的所有内容&#xff0c;…

html--烟花3

html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Canvas烟花粒子</title> <meta name"keywords" content"canvas烟花"/> <meta name"description" content"can…

代码学习记录42---动态规划

随想录日记part42 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.14 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;最长递增子序列 &#xff1b;最长连续递增序列 &#xff1b;最长重复子数组 ;最长公…

mac基础操作、快捷、软件快捷方式

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 mac基础操作、快捷、软件快捷方式 前言mac快捷操作快捷查找切换页面页面缩略访达和命令端切换创建文件夹创建文件删除文件/文件夹获取文件的路径移动文件或文件夹复制文件命令端常用命令 前言 主要是方…

B端:请说出你的设计依据,咋办?来吧,尼尔森法则告诉他。

在B端界面设计中&#xff0c;客户经常会问这样设计的依据是什么&#xff0c;许多设计师回答不上来&#xff0c;或者是答非所问&#xff0c;流于表面&#xff0c;这是时候就需要请出来尼尔森用户体验设计的十大法则&#xff0c;那么问题来了&#xff0c;如何让这10大法则和界面相…

Python学习笔记23 - 目录操作

os模块操作目录相关函数 os.path模块操作目录相关函数 案例1 —— 列出指定目录下的所有.py文件 案例2 —— walk()

论文笔记:NEFTune: Noisy Embeddings Improve Instruction Finetuning

iclr 2024 reviewer 评分 5666 1 论文思路 论文的原理很简单&#xff1a;在finetune过程的词向量中引入一些均匀分布的噪声即可明显地提升模型的表现 2 方法评估

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议&#xff08;CHHASD2024&#xff09;将在中国武汉举行&#xff0c;主题为“文化、历史&#xff0c;人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…

c++中常用库函数

大小写转换 islower/isupper函数 char ch1 A; char ch2 b;//使用islower函数判断字符是否为小写字母 if(islower(ch1)){cout << ch1 << "is a lowercase letter." << end1; } else{cout << ch1 << "is not a lowercase lette…

图形学基础:二维三维刚体的移动、缩放和旋转矩阵

一、二维 1.1 缩放矩阵 x&#xff0c;y分别表示在x轴&#xff0c;y轴缩放的倍数 示例&#xff1a; 点(2,1)在x&#xff0c;y轴上分别缩放x倍&#xff0c;y倍 1.2 平移矩阵 x&#xff0c;y分表表示在x轴&#xff0c;y轴上移动的距离 示例&#xff1a;点&#xff08;2,1&#xf…

AI天使汇联合150家顶级基金、战投,征集优秀AI创业项目

鉴于AI天使汇主办的2024年3月期优秀项目征集活动效果超出预期&#xff0c;3月活动最后TOP20路演者中已有多家快速拿到了TS。 路演活动质量受到了AI创业公司和基金/战投伙伴的高度评价&#xff0c;现在开始四月期活动报名! 本期征集活动联合的顶级基金和战投数量增加到了150家…

LabVIEW无线快速存取记录器(WQAR)测试平台

LabVIEW无线快速存取记录器&#xff08;WQAR&#xff09;测试平台 随着民用航空业的迅速发展&#xff0c;航空安全的保障日益成为公众和专业领域的关注焦点。无线快速存取记录器&#xff08;WirelessQuick Access Recorder, WQAR&#xff09;作为记录飞行数据、监控飞行品质的…

使用这几款插件,GitHub阅读代码效率噌噌噌

** octotree&#xff1a;生成仓库目录 ** 这可能是我用得最多的一款插件了&#xff0c;大家有没有遇到过这种情况。每次点击一个文件后&#xff0c;整个文件列表就会被隐藏&#xff0c;想查看其它文件只能回退后再次进入。别提有多蛋疼了…… 而这款插件就完美解决了这个问题…

Day101:漏洞发现-漏扫项目篇NucleiYakitGobyAfrogXrayAwvs联动中转被动

目录 特征类-三方Poc调用&模版Poc调用 案例1&#xff1a;单点对某特征点进行安全评估 Goby-综合类 Nuclei-较综合类 Afrog-特征类 Yakit-可特征可综合 案例2&#xff1a;新型对某特征点进行安全评估 综合类-主动漏扫&中转联动&被动联动 案例1&#xff1a;…

【学习笔记十四】EWM发货流程概述及相关配置

一、EWM发货流程与ERP集成配置 1.将凭证类型从 ERP 系统映射至 EWM ERP交货单凭证类型LF映射到EWM凭证类型OUTB 2.从 ERP 系统映射项目类型至 EWM ERP交货单凭证类型+ERP交货单项目类型TAN映射到EWM项目类型是ODLV 3.定义出库交货的参数文件 ①定义外向交货处理的凭证类型OUT…

Linux查看进程

Linux查看进程 引言查看进程1.快速查看运行中的进程列表2. 查看所有用户的所有进程3.显示所有进程的完整格式。4.动态显示进程的信息5.根据进程名查找进程ID6.以树状图的方式显示进程间的父子关系7.查找指定名字的进程id 引言 Linux查看进程在日常的使用中比较常见&#xff0c…

gcn代码处理出现的问题

README 版本不一致 python 2.7 PYTHON 3.7 切换 TensorFlow系统的学习使用 数据集下载

c++ - 类的默认成员函数

文章目录 前言一、构造函数二、析构函数三、拷贝构造函数四、重载赋值操作符五、取地址及const取地址操作符重载 前言 默认成员函数是编译器自动生成的&#xff0c;也可以自己重写&#xff0c;自己重写之后编译器就不再生成&#xff0c;下面是深入了解这些成员函数。 一、构造…