我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MyBatis注解CRUD与执行流程深入探究

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MyBatis注解CRUD与执行流程深入探究

结果映射ResultMap

引入resultMap–MyBatis中最强大的元素

数据库字段名::

实体类字段名:

public class User {
    private int id;
    private String name;
    private String password;

如上所示,当sql的字段名与实体类冲突时测试结果:

User{id=1, name='张三', password='null'}
User{id=2, name='李四', password='null'}
User{id=3, name='王五', password='null'}

解决方案一:在sql语句中为字段起别名

select id,name,pwd as password from mybatis.user;

解决方案二:结果集映射ReaultMap

<resultMap id="UserMap" type="User" >
     <result column="pwd" property="password"/>
</resultMap>
<select id="getUserList" resultMap="UserMap">
     select * from mybatis.user;
</select>

resultMap中的id对应具体的sql操作的resultMap属性,在映射时只需设置子标签result的column(sql的列、字段名)映射到实体类的名称属性property便可以成功操作

概括来讲就是:将数据库中的列映射到实体类具体的某一字段

MyBatis 会在幕后自动创建一个 ResultMap,再根据属性名来映射列到 JavaBean 的属性上 。这就是上述示例代码中,因为字段名冲突无法正确查询到password的原因

日志工厂

MyBatis的配置当中settings设置了内置的日志工厂,但需要开发人员在使用时指定具体的日志实现。

MyBatis内置日志工厂: SLF4J | LOG4J(3.5.9 起废弃) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

STDOUT_LOGGING在settings中配置后直接就可以运行使用,不需要额外的properties等配置文件

STDOUT_LOGGING

配置信息:

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

打印出来一堆日志,我们只用看下面的具体执行信息即可

-- 表示正在创建连接
Created connection 1346201722.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@503d687a]
-- 当前执行的sql
==>  Preparing: select * from mybatis.user;
-- 参数
==> Parameters: 
-- sql中的字段名
<==    Columns: id, name, pwd
-- 所查询到的数据 三行数据
<==        Row: 1, 张三, 123
<==        Row: 2, 李四, 234
<==        Row: 3, 王五, 345
-- 数据总数
<==      Total: 3
-- 打印结果
User{id=1, name='张三', password='123'}
User{id=2, name='李四', password='234'}
User{id=3, name='王五', password='345'}
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@503d687a]
-- 关闭连接
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@503d687a]
-- 将连接回收
Returned connection 1346201722 to pool.

Process finished with exit code 0

LOG4J

配置文件:

<settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>

log4j.properties

# 将等级为DEBUG的日志信息输出到控制台(console)、文件(file)两个目的地
log4j.rootLogger=DEBUG,console,file

# 输出到控制台的相关设置
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.Target=System.out
log4j.appender.console.Encoding=UTF-8
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p]%d{yyyy-MM-dd HH:mm:ss} %l -  %m%n

# 输出到文件的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = ./log/test.log
log4j.appender.file.Threshold = DEBUG
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = [%c]-%m%n

# 设置日志的输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

注解开发CRUD

mybatis注解开发通常用于简单的sql执行,较复杂的sql还是需要用xml文件进行配置。

注解开发示例:

在接口中针对方法配置对应的sql注解

@Select("select * from user")
List<User> getUsers();

在mybatis-config.xml中配置

<!--  注册接口mapper  -->
<mappers>
    <mapper class="com.yuqu.dao.UserMapper"/>
</mappers>

CRUD:

// 增
@Insert("insert into user (id,name,pwd) values(#{id},#{name},#{password})")
int insertUser(User user);
// 删
@Delete("delete from user where id = #{nb}")
int deleteUser(@Param("nb") int id);
// 改
@Update("update user set name=#{name},pwd=#{password} where id = #{id}")
int updateUser(Map<String,Object> map);
// 查询全部
@Select("select id,name,pwd as password from user")
List<User> getUsers();

关于@Param注解:

基本数据类型或String类型需要加Param注解

引用类型不需要

只有一个基本数据类型可以不加,但建议加上

在sql中引用的变量名就是@Param中命名的参数

如:

@Delete("delete from user where id = #{nb}")
int deleteUser(@Param("nb") int id);

MyBatis执行流程

  • Resources加载全局配置文件–> mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
  • 实例化SqlSessionFactoryBuilder构造器
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  • build解析配置文件流
// 以下为SqlSessionFactoryBuilder源码
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);

可以看到,build方法将输入流、环境、属性一一解析到Cconfiguration中

  • 实例化SqlSessionFactory
  • transactionalCaches事务管理器

  • 创建executor执行器
  • 创建SqlSession实例
public static SqlSession getSqlSession(){
   return sqlSessionFactory.openSession();
}
  • 实现CRUD
  • 判断是否执行成功
  • 执行成功提交事务
  • 执行失败则跳转到事务管理器重新进行

到此这篇关于MyBatis注解CRUD与执行流程深入探究的文章就介绍到这了,更多相关MyBatis注解CRUD内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MyBatis注解CRUD与执行流程深入探究

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MyBatis注解CRUD与执行流程深入探究

这篇文章主要介绍了MyBatis注解CRUD与执行流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-02-21

MyBatis注解CRUD与执行流程是什么

这篇文章主要介绍了MyBatis注解CRUD与执行流程是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MyBatis注解CRUD与执行流程是什么文章都会有所收获,下面我们一起来看看吧。结果映射ResultM
2023-07-05

Spring@Bean注解深入分析源码执行过程

随着SpringBoot的流行,我们现在更多采用基于注解式的配置从而替换掉了基于XML的配置,所以本篇文章我们主要探讨基于注解的@Bean以及和其他注解的使用
2023-01-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录