【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.hqwc.cn/news/619807.html

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

相关文章

UE5不打包启用像素流 ubuntu22.04

首先查找引擎中像素流的位置&#xff1a; zkzk-ubuntu2023:/media/zk/Data/Linux_Unreal_Engine_5.3.2$ sudo find ./ -name get_ps_servers.sh [sudo] zk 的密码&#xff1a; ./Engine/Plugins/Media/PixelStreaming/Resources/WebServers/get_ps_servers.sh然后在指定路径中…

matlab使用教程(44)—绘制带标记的二维曲线图

在线图中添加标记是区分多个线条或突出显示特定数据点的有用方法。使用下面的一种方式添加标记&#xff1a; • 在线条设定输入参数&#xff08;例如 plot(x,y,-s) &#xff09;中包含标记符号。 • 将 Marker 属性指定为一个名称-值对组&#xff0c;例如 plot(x,y,Marker,s…

(六)C++自制植物大战僵尸游戏关卡数据讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 游戏关卡数据文件定义了游戏中每一个关卡的数据&#xff0c;包括游戏类型、关卡通关奖励的金币数量、僵尸出现的波数、每一波出现僵尸数量、每一波僵尸出现的类型等。根据不同的游戏类型&#xff0c;定义了不同的通…

Windows远程桌面连接虚拟机Linux

Windows远程桌面连接虚拟机Linux 需要先打开虚拟机的启用VNC连接使用VNC客户端进行连接 yum install -y tigervnc-server #安装tigervnc-server vncserver #启动一个vnc进程 #第一次启动会要求设置密码 #如果需要更改密码可以使用vncpasswd进行更改密码 vncserver -list #查看…

【算法练习】30:快速排序学习笔记

一、快速排序的算法思想 原理&#xff1a;快速排序基于分治策略。它的基本思想是选择一个元素作为“基准”&#xff0c;将待排序序列划分为两个子序列&#xff0c;使得左边的子序列中的所有元素都小于基准&#xff0c;右边的子序列中的所有元素都大于基准。这个划分操作被称为分…

在k8s 中部署有状态服务MongoDB高可用集群详解(附带镜像)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s简介 2、MongoDB介绍 3、为什么要…

新手开抖店不出单?三种方法解决“没曝光,没流量”难题!

哈喽~我是电商月月 新手开抖店经常会这样做&#xff1a;开通后选品上架。然后傻傻的等待流量进来&#xff0c;然后每天就是刷新再刷新&#xff1f;最后还是没流量&#xff01; 我敢说这样做你两个月也出不了单&#xff0c;方法错误&#xff0c;再好的产品也卖不出去&#xff…

C++内存管理和模板

一、内存管理 关键字&#xff1a;new delete 我们知道&#xff0c;在C语言中内存的开辟和修改&#xff0c;要用到函数malloc/calloc等&#xff0c;而且要直自己判断内存开辟是否正确&#xff0c;所以在C中&#xff0c;提供了两函数&#xff1a;new/delete 由于malloc无法很…

【我的代码生成器】生成React页面类

有了数据表的结构信息&#xff0c;就能生成React 的页面类&#xff0c;快捷方便。 生成界面如下&#xff1a; 生成的React FrmUser.js页面如下&#xff1a; 只需再写里面的操作逻辑代码。

婴儿专用洗衣机有必要买吗?四大宝藏婴儿测评对比

幼龄时期的宝宝的衣物&#xff0c;是比较需要注意的时候。可能一不注意宝宝穿在身上就会有不适宜症状发生。所以宝妈们真的要随时观察&#xff0c;然后在宝宝洗衣服的这上面多下点功夫&#xff0c;不要让宝宝受到这种无谓的伤害。小婴儿的抵抗力比我们差很多。有些细菌、病毒可…

探索未来:智能客服产品架构的演进与创新

随着科技的迅猛发展和人工智能技术的不断成熟&#xff0c;智能客服已经成为了现代企业提供客户服务的重要方式。而智能客服产品的架构设计则直接影响着其在实际运营中的效果和用户体验。本文将探讨智能客服产品架构的演进历程以及未来的创新趋势。 1. 传统客服架构的局限性 传…

数据结构__顺序表

概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改 需要用到数组&#xff1a;数组的绝对优势&#xff1a;下标的随机访问&#xff08;因为物理空间连续&#xff09; a[i]等…