Mybatis (1)

news2024/11/25 13:44:49

mybatis

  • 1、入门
  • 2、事务管理机制
  • 3、日志和junit配置
  • 3、mybatis工具类
  • 4、CRUD
    • 4.1 insert
      • 4.1.1 map方式
      • 4.1.2 对象方式
    • 4.2 delete
    • 4.3 update
    • 4.4 select(Retrieve)
      • 4.4.1 查询一个结果
      • 4.4.2 查询多个结果
    • 4.5 命名空间

1、入门

①创建一个空项目:添加上maven和jdk
②创建一个maven module
③编写pom.xml 导入mybatis和mysql依赖
④在resouece目录下编写mybatis-config.xml文件,其实就是编写连接数据库信息的文件。
⑤编写一个pojo,就是一个实体类,对应数据库中的一张表.这里时ORM对象关系映射思想,不懂得可以去补一下
⑥编写xxxmapping.xml文件,就是编写sql语句的。
⑦获得sqlSessionFactoryBuilder 对象
⑧获得 SqlSessionFactory 一般一个数据库对应一个SqlSessionFactory
⑨获得 SqlSession 来执行sql语句
⑩默认没有自动开启事务 要添加commit

注意
①mybatis-config配置文件不一定要叫这个名字,也不一定非要在resource目录下,但是大多数都这么做。
在resource目录下,我们可以采用
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
来获得一个流对象,可移植性强。
底层其实是ClassLoader.getSystemClassLoader().getResourceAsStream()类加载器。
如果不在resource目录下,我们可以使用 new FileInputStream()来获得一个流对象。
②mapping.xml文件也不一定要放在resource目录下, 但大多数都这么做。如果没有在该资源下,我们在config配置文件中可以采用
<mapper url="">
而不是
<mapper resource="CarMapping.xml"/>

2、事务管理机制

对于事务mybatis有两种机制:

①JDBC,即mybatis自己管理事务,但底层还是调用的jdbc原生代码。即不会自动提交sql语句了,需要我们自己手动提交管理事务。即默认把Autocommit设置为了false。如果我们不想要管理事务,想要让其自动提交,可以在下边图片这里填上true,默认不填是false(不建议填。)
在这里插入图片描述

在这里插入图片描述
②也可以是MANAGE,即mybatis不管理事务,把事务管理交给别的容器,如果没有别的接管,那就没有事务,即默认提交。

3、日志和junit配置

首先导入依赖

      <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
        </dependency>
        <!-- junit依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

之后要配置日志的配置文件 一定要放在resouce目录下 且名字一定要是logback.xml或者logbcak-test.xml

<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="false">
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>100MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!--mybatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>

    <!-- 日志输出级别,logback日志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>

</configuration>

同时要在mybatis-config.xml文件中配置 日志即我们使用的接口。

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

logback 继承自slf4j接口。
mybatis实现了标准接口,使用如下接口时没必要导入依赖。

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

3、mybatis工具类

我们想要像jdbc一样,每次获取工具类的获取连接方式就可。

package com.cky.utils;

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 java.io.IOException;

public class MybatisUtils {
    private  static SqlSessionFactory sqlSessionFactory;
    /**
     * 类加载时初始化sqlSessionFactory对象
     */
    static {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
        try {
            sqlSessionFactory=sqlSessionFactoryBuilder.build(Resources.getResourceAsReader("mybatis-config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 每调用一次openSession()可获取一个新的会话,该会话支持自动提交。
     *
     * @return 新的会话对象
     */
    public static SqlSession openSession(){
        return sqlSessionFactory.openSession(true);
    }
}

4、CRUD

4.1 insert

我们不能把sql语句的内容写固定,而应该通过外部传入的方式

4.1.1 map方式

package com.cky.test;

import com.cky.utils.MybatisUtils;
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 java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class Test {
    @org.junit.Test
    public void test1() throws  Exception{
        Map<String,Object> map=new HashMap<>();
        map.put("carNum","1010");
        map.put("brand","比亚迪");
        map.put("guidePrice",100);
        map.put("produceTime","2023-03-28");
        map.put("carType","电车");

        SqlSession sqlSession = MybatisUtils.openSession();
        int insertCar = sqlSession.insert("insertCar",map);
        System.out.println(insertCar);
        sqlSession.close();
    }
}

<?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 namespace="aaa">
    <!--insert sql:保存一个汽车信息-->
    <insert id="insertCar">
        insert into t_car
            (id,car_num,brand,guide_price,produce_time,car_type)
        values
            (null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>
</mapper>

注意 我们都是#{}来代替原来sql语句?这个占位符。
{}中写的时map的key值,如果key值不存在,就会填入null。

4.1.2 对象方式

我们可以创建一个pojo,来代表数据库中的一张表。

package com.cky.bean;

import java.math.BigDecimal;

public class Car {
    private Integer id;
    private String carNum;
    private String brand;
    private Double guidePrice;
    private  String produceTime;
    private String carType;

    public Car(Integer id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {
        this.id = id;
        this.carNum = carNum;
        this.brand = brand;
        this.guidePrice = guidePrice;
        this.produceTime = produceTime;
        this.carType = carType;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCarNum() {
        return carNum;
    }

    public void setCarNum(String carNum) {
        this.carNum = carNum;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Double getGuidePrice() {
        return guidePrice;
    }

    public void setGuidePrice(Double guidePrice) {
        this.guidePrice = guidePrice;
    }

    public String getProduceTime() {
        return produceTime;
    }

    public void setProduceTime(String produceTime) {
        this.produceTime = produceTime;
    }

    public String getCarType() {
        return carType;
    }

    public void setCarType(String carType) {
        this.carType = carType;
    }
}

    @org.junit.Test
    public void test2() throws  Exception{
        Car car=new Car(null,"1002","五菱",100.00,"2023-03-28","电车");

        SqlSession sqlSession = MybatisUtils.openSession();
        int insertCar = sqlSession.insert("insertCar",car);
        System.out.println(insertCar);
        sqlSession.close();
    }
<?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 namespace="aaa">
    <!--insert sql:保存一个汽车信息-->
    <insert id="insertCar">
        insert into t_car
            (id,car_num,brand,guide_price,produce_time,car_type)
        values
            (null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>
</mapper>

注意:如果我们使用的是一个对象传值,则#{},{}里填写的是getXxx,去掉get第一个字母变小写后的名字,而不是说就是属性名。

4.2 delete

    <delete id="deletecar">
        delete from t_car where car_num = #{id}
    </delete>
  @org.junit.Test
    public void test3() throws  Exception{
//        Car car=new Car(null,"1002","五菱",100.00,"2023-03-28","电车");

        SqlSession sqlSession = MybatisUtils.openSession();
        int insertCar = sqlSession.insert("deletecar","1010");
        System.out.println(insertCar);
        sqlSession.close();
    }

注意 如果只传入一个值的时候 {}里的内容可以随便写,但是要见明知意。

4.3 update

  <update id="updatecar">
        pdate t_car set
    car_num = #{carNum}, brand = #{brand},
        guide_price = #{guidePrice}, produce_time = #{produceTime},
        car_type = #{carType}
        where id = #{id}
    </update>
  @org.junit.Test
    public void test4() throws  Exception{
        Car car=new Car(null,"1002","五菱11",100.00,"2023-03-28","电车");

        SqlSession sqlSession = MybatisUtils.openSession();
        int insertCar = sqlSession.insert("insertCar",car);
        System.out.println(insertCar);
        sqlSession.close();
    }

跟insert一样,都是getXxx后边的名字,当然也可以使用map传值。

4.4 select(Retrieve)

4.4.1 查询一个结果

  <select id="selectCar" resultType="com.cky.bean.Car">
        select id,car_num,brand,guide_price,produce_time,car_type from t_car where id=#{id};
    </select>
    @org.junit.Test
    public void test5() throws  Exception{
        SqlSession sqlSession = MybatisUtils.openSession();

        Object selectCar = sqlSession.selectOne("selectCar",1);
        System.out.println(selectCar);
        sqlSession.close();
    }

注意:我们需要指定返回的类型,因为selectone会帮我们封装成一个对象,我们指定了返回的类型之后,mybatis才能帮我们封装。

我配置文件也没有开启驼峰式映射,不知道为什么我没有起别名,但是也是对的,他自动帮我匹配到了我的类属性名,好像是会自动开启驼峰式映射?
在这里插入图片描述

4.4.2 查询多个结果

    <select id="selectAllCar" resultType="com.cky.bean.Car">
        select id,car_num,brand,guide_price,produce_time,car_type from t_car ;
    </select>
 @org.junit.Test
    public void test6() throws  Exception{
        SqlSession sqlSession = MybatisUtils.openSession();

        List<Object> selectCars = sqlSession.selectList("selectAllCar");
        selectCars.forEach(car-> System.out.println(car));
        sqlSession.close();
    }

在这里插入图片描述
注意返回集合时,返回类型写的是集合里对象的类型!!!

4.5 命名空间

如果我们有多个mapping.xml文件,且sql语句的id是一致的,此时命名空间就很重要了,因为我们将这个xml文件都配置到mybatis-config.xml文件中,此时如果我们只写id名来找该sql语句的话,就会出错,因为不知道是哪一个。
比如
CarMapping.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 namespace="aaa">
  

    <select id="selectAllCar" resultType="com.cky.bean.Car">
        select id,car_num,brand,guide_price,produce_time,car_type from t_car ;
    </select>
</mapper>

Car1Mapping.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 namespace="bbb">


    <select id="selectAllCar" resultType="com.cky.bean.Car">
        select id,car_num,brand,guide_price,produce_time,car_type from t_car ;
    </select>
</mapper>

测试

 @org.junit.Test
    public void test6() throws  Exception{
        SqlSession sqlSession = MybatisUtils.openSession();

        List<Object> selectCars = sqlSession.selectList("selectAllCar");
        selectCars.forEach(car-> System.out.println(car));
        sqlSession.close();
    }

在这里插入图片描述
应该指定命名空间。

 @org.junit.Test
    public void test6() throws  Exception{
        SqlSession sqlSession = MybatisUtils.openSession();

        List<Object> selectCars = sqlSession.selectList("aaa.selectAllCar");
        selectCars.forEach(car-> System.out.println(car));
        sqlSession.close();
    }

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

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

相关文章

java电话号码的字母组合(力扣Leetcode17)

电话号码的字母组合 力扣原题链接 问题描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 示例 1&#xff1a;…

理解游戏服务器架构-部署架构

目录 前言 我所理解的服务器架构 什么是否部署架构 部署架构的职责 进程业务职责 网络链接及通讯方式 与客户端的连接方式 服务器之间连接关系 数据落地以及一致性 数据库的选择 数据访问三级缓存 数据分片 读写分离 分布式数据处理 负载均衡 热更新 配置更新 …

flowable-ui后台显式非中文

把flowable-ui的war包发布后&#xff0c;后台界面显示的是非中文 用的是6.7.2版本&#xff0c;经过了解该版本是有国际化配置文件的&#xff0c;支持中文 猜测可能是浏览器语言导致未显示中文&#xff0c;在控制台输入navigator.language&#xff0c;查看到果然是英文 解决方案…

[项目实践]---RSTP生成树

[项目实践] 目录 [项目实践] 一、项目环境 二、项目规划 三、项目实施 四、项目测试 |验证 ---RSTP生成树 一、项目环境 Jan16 公司为提高网络的可靠性&#xff0c;使用了两台高性能交换机作为核心交换机&#xff0c;接入层交 换机与核心层交换机互联&#xff0c;形成冗…

【Linux】生产者消费者模型{基于BlockingQueue的PC模型/RAII风格的加锁方式/串行,并行,并发}

文章目录 1.认识PC模型2.基于BlockingQueue的PC模型2.1串行&#xff0c;并行&#xff0c;并发2.2理解linux下的并发2.2RAII风格的加锁方式2.3阻塞队列2.4深入理解pthread_cond_wait2.5整体代码1.Task.hpp2.lockGuard.hpp3.BlockQueue.hpp4.pcModel.cc 3.总结PC模型 1.认识PC模型…

蓝桥杯第十三届电子类单片机组程序设计

目录 前言 单片机资源数据包_2023 一、第十三届比赛省赛 1.比赛题目 2.赛题解读 二、部分功能实现 1.继电器的开启与关闭 2.长按切换显示状态功能的实现 3.对于温度传感器小数部分的处理 4.其他处理 1&#xff09;关于数码管显示小数的处理 2&#xff09;关于5s后继…

(完结)Java项目实战笔记--基于SpringBoot3.0开发仿12306高并发售票系统--(三)项目优化

本文参考自 Springboot3微服务实战12306高性能售票系统 - 慕课网 (imooc.com) 本文是仿12306项目实战第&#xff08;三&#xff09;章——项目优化&#xff0c;本篇将讲解该项目最后的优化部分以及一些压测知识点 本章目录 一、压力测试-高并发优化前后的性能对比1.压力测试相关…

系统需求分析报告(原件获取)

第1章 序言 第2章 引言 2.1 项目概述 2.2 编写目的 2.3 文档约定 2.4 预期读者及阅读建议 第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 …

Android 自定义EditText

文章目录 Android 自定义EditText概述源码可清空内容的EditText可显示密码的EditText 使用源码下载 Android 自定义EditText 概述 定义一款可清空内容的 ClearEditText 和可显示密码的 PasswordEditText&#xff0c;支持修改提示图标和大小、背景图片等。 源码 基类&#xf…

相机标定学习记录

相机标定是计算机视觉和机器视觉领域中的一项基本技术&#xff0c;它的主要目的是通过获取相机的内部参数&#xff08;内参&#xff09;和外部参数&#xff08;外参&#xff09;&#xff0c;以及镜头畸变参数&#xff0c;建立起现实世界中的点与相机成像平面上对应像素点之间准…

枚举--enum和动态内存管理(malloc和free)

枚举---enum&#xff1a;它的本意就是列举事物&#xff0c;比如&#xff0c;颜色和性别&#xff0c;则代码为&#xff1a; #include<stdio.h> //枚举的示例&#xff1a;性别&#xff0c;颜色 enum sex//性别 {MALE,FEMALE,SECRTY }; enum clore//颜色 {ROW,BLUS,GREEN …

查找某数据在单链表中出现的次数

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct LinkNode {ElemType data;LinkNode* next; }LinkNode, * LinkList; //尾插法建立单链表 void creatLinkList(LinkList& L) {L (LinkNode*)mallo…

Vue系列——数据对象

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>el:挂载点</title> </head> <body&g…

本地项目上传到GitHub

本文档因使用实际项目提交做为案例&#xff0c;故使用xxx等字符进行脱敏&#xff0c;同时隐藏了部分输出&#xff0c;已实际项目和命令行输出为准 0、 Git 安装与GitHub注册 1&#xff09; 在下述地址下载Git&#xff0c;安装一路默认下一步即可。安装完成后&#xff0c;随便…

【面试经典150 | 动态规划】零钱兑换

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 322. 零钱兑换 解题思路 方法一&#xff1a;动态规划 定义状态 dp[i] 表示凑成总金额的最少硬币个数。 状态转移 从小到大枚举要凑成的金额 i&#xff0c;如果当前…

电动车“锂”改“铅”屡被查?新国标或疏于考虑用户真实需求

最近几个月&#xff0c;电动自行车又走到了舆论中心。 “315期间”&#xff0c;不少媒体集中报道了超标电动自行车改装上牌事件。3月18日至20日&#xff0c;新华社推出电动自行车安全隐患系列调查&#xff0c;聚焦点之一就是改装超标问题。而在近段时间&#xff0c;综合媒体报…

MarTech调研总结整理

整体介绍 概念解释&#xff1a; Martech是一种智慧营销的概念&#xff0c;将割裂的营销&#xff08;Marketing&#xff09;、技术&#xff08;Technology&#xff09;与管理&#xff08;Management&#xff09;联系在一起&#xff0c;Martech将技术溶于全营销流程中&#xff0…

基于Java实验室预约管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

《操作系统导论》第14章读书笔记:插叙:内存操作API

《操作系统导论》第14章读书笔记&#xff1a;插叙&#xff1a;内存操作API —— 杭州 2024-03-30 夜 文章目录 《操作系统导论》第14章读书笔记&#xff1a;插叙&#xff1a;内存操作API1.内存类型1.1.栈内存&#xff1a;它的申请和释放操作是编译器来隐式管理的&#xff0c;所…

FebHost:意大利.IT域名一张意大利网络名片

.IT域名是意大利的国家顶级域名&#xff0c;对于意大利企业和个人而言,拥有一个属于自己的”.IT”域名无疑是件令人自豪的事。这个被誉为意大利互联网标志性代表的域名,不仅隐含着浓厚的意大利文化特色,还为使用者在当地市场的推广铺平了道路。 对于那些希望在意大利市场建立强…