day09 MyBatis基础操作

news2025/1/12 20:44:00

为什么使用框架

框架的作用:可以直接调用写好的API,提高开发效率,框架是一种经过校验,有一定功能的半成品软件

为什么选择mybatis框架

它几乎避免了所有的JDBC的代码和手动设置参数及获取结果集.作用于持久层,支持定制化sql,存储过程及高级映射

项目所需要的jar包:

lombok-xxx.jar

mysql.connector-java-xxx.jar

mybatis-xxx.jar

mybatis-config.xml配置文件

作用:配置mybatis

1.在resources包中创建mybatis-config.xml文件

2.添加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-config.xml配置文件中各个标签的作用:

<properties resource="db.properties"/>    //关联db.propertise配置文件
<environment id="dev">   //当前使用哪一个环境,(开发环境,测试环境,生产环境)
 <!--type:指定用哪一种事务管理器
	 JDBC:是一种事务管理器的别名
-->
<transactionManager type="JDBC"/>
<!--
type:指定用哪一种连接池
POOLED;是一种连接池的别名
-->
<dataSource type="POOLED">
 //获取连接对象
<property name="driver" value="com.mysql.jdbc.Driver"/>
 <property name="url" value="jdbc:mysql:///mybatis"/>
 <property name="username" value="root"/>
 <property name="password" value="123456"/>	
//指定包中类的别名
<typeAliases>
    <package name="pmis.domain"/>
</typeAliases>

mybatis中必须关联mapper映射文件

配置xxxmapper.xml

mapper文件的作用:专门用于书写sql语句

在resources文件中新建目录格式为(使用/进行分割):resources/mybatis/mapper(与项目到路径相同),如果使用的’.'进行分割就会在mybat-config.xml文件中找不到该文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dZtT8Rr-1684854079311)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407200745128.png)]

1.添加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">
<!--namespace:命名空间:用于区分不同的mapper的sql语句
namespace+sqlid:sql语句的唯一表示,在impl类中进行使用
-->
<mapper namespace="mybatis/mapper/UserMapper">

2.添加用户的sql语句,所有的属性获取使用:**#{属性名}**进行代替

增删改的语法如下

<!--
 使用id来进行标识,在impl中执行的时候就可以直接指定地址了
    示例:session.insert("mybatis/mapper/UserMapper.insert",u);
#{name}:name是对象的属性名,底层使用的内省
-->
<insert id="insert">
    insert into user (id,name,age,salary,hiredate) values(null,#{name},#{age},#{salary},#{hiredate})
</insert>

查询的语法如下(必须使用resultType指定查询的结果封装成什么对象,使用的是相对路径):

<!--
resultType:指定查询的每行数据封装成什么类型的对象
查询的时候需要给一个对象,底层使用内省进行封装
路径就是实体类的路径,使用"."进行连接
-->
    <select id="selectById" resultType="mybatis.domain.User">
        select * from  user where id=#{id}
    </select>

DAO层实现类的操作方法及注意事项:

(增删改)

**1.**加载mybatis主配置文件,这是mybatis特有的加载文件的方式,只有使用mybatis配置文件的时候使用

InputStream in =Resource.getResourceAsStream("mybatis-config.xml")

**2.**创建sqlsessionFactory对象(连接池)

SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);

**3.**获取sqlsession对象(连接),使用openSession方法

SqlSession session = fac.openSession();

**4.**执行指定的sql语句

statement:sql语句

u:执行sql所需要的参数所在的对象,后面的参数2容易忘记传,否则添加的全是空数据

session.insert("mybatis/mapper/UserMapper.insert",u);

增删改这三种语句都可以使用:update方法,对结果没有任何影响

**5.**手动提交事务

session.commit()

**6.**释放资源

session.close();

(查询,不需要提交事务,同时需要关闭资源)

前面 的获取连接的方式与增删改相同

public User selectByID(Long id) throws IOException {
    InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);
    SqlSession sqlSession = fac.openSession();

1.查询返回有多种结果,最常使用的查询结果只返回一个对象和返回一个集合

只返回一个对象(selectOne):

User u = sqlSession.selectOne("mybatis/mapper/UserMapper.selectById", id);
sqlSession.close();
        return u;

返回一个集合(selectList)

List<User> list = sqlSession.selectList("mybatis/mapper/UserMapper.selectAll");
  sqlSession.close();
        return list;

如果statement中使用sql语句与查询使用的方法不能对应,就会报错:查询的结果大于想要的结果数量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4YuQ5PWL-1684854079313)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407194732327.png)]

Mybatis执行流程:

img

工具类的抽取

项目中的获取连接的代码相同,可以抽成一个工具类,将读取文件的操作放在静态代码块中,直接调用方法就先执行没减少代码量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N62c0DrW-1684854079314)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407200347033.png)]

抽取db.properties到resources包中

作用:让用户更改信息更加方便,不用在众多环境变量中进行麻烦的寻找

如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d7zD5ywK-1684854079314)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407200817543.png)]

mybatis-config.xml的书写规范应修改为如下所示(使用${}进行代替):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2c567o8i-1684854079315)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407200937952.png)]

设置查询语句中的别名

在mybatis.xml文件中添加别名,和enviroments同级,在properties后面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BfsauK1k-1684854079316)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230408190936964.png)]

mapper文件进行的查询语句更改resoult中的路径,大小写都可以

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pATBTPH2-1684854079317)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230408191112139.png)]

获取生成的主键(只有个添加时才有用)

在sql的添加语句中加上 useGeneratedKeys,keyProperty, keyColumn

useGeneratedKeys:表示是否需要获取生成的主键
keyProperty:数据表中的主键列名,可省
keyColumn:主键列对应java中的属性名

<insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id">

    insert into user (id,name,age,salary,hiredate) values(null,#{name},#{age},#{salary},#{hiredate})
</insert>

日志管理

在resurces中添加名字为log4j.properties.里面的内容如下

# 全局日志配置
log4j.rootLogger=ERROR, stdout
# MyBatis 日志配置,只修改下方的配置,mapper文件
log4j.logger.mybatis=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

注意:只修改log4j.logger.mybatis=TRACE的内容

pper文件
log4j.logger.mybatis=TRACE

控制台输出

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n


**注意**:只修改log4j.logger.mybatis=TRACE的内容

**所有 的路径都是用"."进行连接,只有映射mapper文件的使用"/"连接,否则不能读取日志文件**

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

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

相关文章

PowerShell系列(四):PowerShell进入交互环境的三种方式

目录 1、Win键X 方式 2、使用微软自带的搜索功能 3、命令行运行方式 4、命令行窗口方式 5、使用第三方命令行软件&#xff08;Terminal&#xff09;开启PowerShell环境 6、PowerShell交互环境执行脚本的一些优势 7、小技巧 今天继续给大家讲解PowerShell相关的知识&…

IMX6ULL裸机篇之DDR3实验-更新 imxdownload.h

一. DDR实验 之前关于 IMX6ULL开发板&#xff0c;有关DDR实验。做了DDR内存芯片的初始化&#xff0c;校验与超频测试。 博文链接如下&#xff1a; IMX6ULL裸机篇之DDR3初始化_凌雪舞的博客-CSDN博客 IMX6ULL裸机篇之DDR3校验与超频测试_凌雪舞的博客-CSDN博客 经过了初始化…

C Primer Plus第二章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.编写一个程序&#xff0c;调用一次 …

【Linux系列P3】Linux的权限有什么重点?一文带你理清!

前言 大家好&#xff0c;这里是YY的Linux系列part3&#xff1b;本章主要内容面向能使用Linux的老铁&#xff0c;主要内容是【Linux的用户&用户指令】【文件属性】【权限&权限值的两者表达方式】【权限相关指令】【起始权限问题与掩码问题】【粘滞位的概念与特殊权限-t解…

[Ext JS3.9] 标签面板(TabPanel )介绍与开发

标签面板 标签面板是RIA 类应用使用较多的组件, 因为其可以显示的内容比较多。 标签面板的效果如下图: 标签面板开发也很简单, 配置式的开发代码类似: {xtype: tabpanel,items: [{title: 标签页1,html:标签页1内容}, {title: 标签页2,html:标签页2内容}, {title: 标签页…

【教学类-34-05】拼图(数字学号0X-长方块拼图-双色深灰浅灰)3*3格子(中班主题《个别化拼图》偏艺术-美术)

作品展示 背景需求 难点&#xff1a;如何让生成图片带两个颜色的数字&#xff1f; 上一次学习活动中&#xff0c;发现03、04、05、06、08、09 、 23、26、28拼图都有困境&#xff0c;教师帮助。这些数字都包含圆弧结构&#xff0c;幼儿对于大量的圆弧碎片图形的多重组合&…

【Java-Crawler】一文学会使用WebMagic爬虫框架

WebMagic 爬虫主要分为采集、处理、存储三个部分。 在学 WebMagic 框架之前&#xff0c;需要了解 HttpClient、Jsoup&#xff08;Java HTML Parse&#xff09; 库&#xff0c;或者说会他们的基本使用。因为 WebMagic 框架内部运用了他们&#xff0c;在你出现问题看源码去查错时…

MySQL主从复制配置

一、MySQL主从概念 MysSQL主从复制是一个异步的复制过程&#xff0c;底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台AysQL数据库(slave&#xff0c;即从库&#xff09;从另一台MysQL数据库(master&#xff0c;即主库&#xff09;进行日志的复制然后再解析日志并应…

一、尚医通排班管理

文章目录 一、排班管理1、页面效果2、接口分析3、实现分析 二、排班管理实现1、科室列表1.1 api接口1.1.1 添加service接口与实现1.1.2 添加controller接口 1.2 科室前端1.2.1 添加路由1.2.2 添加按钮1.2.3封装api请求1.2.4 部门展示 2、排班日期分页列表2.1 api接口2.1.1 添加…

Net跨平台UI框架Avalonia入门-DataGrid的使用

Avalonia中的DataGrid的使用 DataGrid 数据表格是客户端UI中很重要的一个控件&#xff0c;Avalonia中的DataGrid是单独一个包Avalonia.Controls.DataGrid&#xff0c;要使用DataGrid&#xff0c;需要另外在Nuget中按这个包&#xff0c;下面介绍一下DataGrid的安装和使用 Data…

android/ios 一键抽取硬编码字符串

由于老项目 做国际化困难,抽取繁琐 最终实在蛋疼 最终开放插件来解决 android studio 插件 一键抽取硬编码字符串 xcode 一键抽取硬编码字符串 环境配置android studio ,appcode idea 环境类似1.安装插件 插件下载点击 2. 配置生成文件路径 android 就是string.xml ios Loca…

搭建stm32电机控制代码框架(一)

也是挑战一下自己吧&#xff0c;看看多久能够把自己的代码框架搭建起来&#xff0c;今天是5月23日&#xff0c;看看最终搭建成功的时候是什么时候&#xff0c;目标其实这个阶段很简单&#xff0c;电机转一个双闭环FOC就行。 这次的任务是基于stm32f405芯片进行展开&#xff0c…

STM32单片机(一)STM32简介

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

国产FPGA选型指南:如何选择适合你的国产FPGA芯片?

FPGA自1985年由Xilinx的创始人之一Ross Freeman发明后&#xff0c;全球90%的FPGA市场一直被国外厂家所占有&#xff0c;主要是这四家公司&#xff1a;Xilinx、Altera、Lattice、Microsemi。 Xilinx 和Altera公司占据了全球近80%以上的市场份额&#xff0c;且拥有着FPGA领域绝大…

Java学习笔记20——内部类

内部类 内部类的访问特点内部类的形式成员内部类局部内部类匿名内部类匿名内部类在开发中使用 内部类是类中的类 内部类的访问特点 1.内部类可以直接访问外部类的成员&#xff0c;包括私有成员 2.外部要访问内部类的成员&#xff0c;必须创建对象 内部类的形式 成员内部类 …

java变量类型

文章目录 一、java变量类型一.java变量类型二、Java 参数变量三、Java 局部变量四、成员变量&#xff08;实例变量&#xff09;五、类变量&#xff08;静态变量&#xff09; 总结 一、java变量类型 一.java变量类型 在Java语言中&#xff0c;所有的变量在使用前必须声明。声明…

13. InnoDB引擎底层原理及Mysql 8.0 新增特性详解

MySQL性能调优 查看系统中的各种LSN值 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 01.redo日志的作用和格式 02.redo日志的写入过程 03.什么是Log Sequence Number? 04.innodb_flush_log_at_trx _c…

(学习日记)AD学习 #3

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

二叉树的学习

最近在复习数据结构和线性代数&#xff0c;先准备周六的线代考试&#xff0c;好好复习。 目录 树的概念 结点&#xff1a; 空树&#xff1a; 子树&#xff1a; 结点的度&#xff1a; 树的度&#xff1a; 层数&#xff1a; 结点的深度&#xff1a; 结点的高度&#xff…

matplotlib运用:电商广告投入及销量预测【数据集+完整代码】

前期准备 数据准备 数据集有两个表 销售数据表投放费用的广告费用表 文章源码获取方式 &#x1f449;&#x1f449; 点击文末名片 1. 分别按 日 和 月 分析销售收入 绘制子图 figure(numNone, figsizeNone, dpiNone, facecolorNone, edgecolorNone,frameonTrue)num:图像…