1快速入门MyBatis

news2024/12/23 23:04:50

开发前的准备

准备数据库表:汽⻋表t_car

确定表中的字段以及字段的数据类型

  • guide_price是decimal类型,专⻔为财务数据准备的类型
  • produce_time可以用char类型 , 格式’2022-10-11’

在这里插入图片描述

使用navicat for mysql⼯具向t_car表中插⼊两条数据
在这里插入图片描述

配置IDEA中maven的相关设置
在这里插入图片描述

基于Maven开发一个MyBatis程序

编程步骤

第一步New Project: 如创建一个Empty Project,然后设置Project Structure(工程结构), 设置软件开发环境版本和Java的编译版本
在这里插入图片描述

第二步New Module: 创建普通的Maven工程,这样生成的目录更标准
在这里插入图片描述
第三步:配置Maven工程自动生成的pom.xml文件指定打包方式jar并引入相关依赖

<!--指定打包方式为jar的原因是mybatis封装的是JDBC不需要部署到服务器上即可运行-->
<groupId>com.powernode</groupId>
<artifactId>mybatis-001-introduction</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<!--mybatis核⼼依赖-->
<dependency>
 <groupId>org.mybatis</groupId>
 <artifactId>mybatis</artifactId>
 <version>3.5.10</version>
</dependency>

<!--mysql驱动依赖-->
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>8.0.30</version>
</dependency>

第四步:在resources根目录下新建mybatis核心配置文件mybatis-config.xml , 配置文件的模板可以参考mybatis中文手册

  • 这个文件名不是必须叫做mybatis-config.xml,只是大家都采用这个名字
  • 这个文件存放的位置可以随意,但为了项目的移植性和健壮性,最好将这个配置文件放到类的根路径下面
  • 放到resources目录下的资源文件和配置文件等同于放到了类的根路径下/src路径的一级目录下, 将来打包时都会放到target/classes目录下

resources/mybatis-config.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">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/"/>
                <property name="username" value=""/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <!--指定XxxMapper.xml文件的路径用来引入文件,resource属性自动会从类的根路径下开始查找并加载资源-->
        <mapper resource=""/>
    </mappers>
</configuration>

第五步:在resources目录下新建存放sql语句的配置文件XxxMapper.xml, 配置文件的模板可以参考mybatis中文⼿册

  • 在命令行中执行的sql语句以分号结尾 , 但配置文件中的SQL语句结尾的分号";"可以省略
  • 配置文件名和其存放的位置可以随意,一般命名规范XxxMapper.xml , 放在类的根路径下(resources目录下)

resources\CarMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN">
<!--namespace先随意写⼀个-->
<mapper namespace="fdsafdsa">  
<!--insert语句,id是这条SQL语句的唯一标识。这个id就代表了这条SQL语句-->
<insert id="insertCar">
  insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,'1003','丰田霸道',30.0,'2000-10-11','燃油车'); 
</insert> 
</mapper>

第六步:在mybatis-config.xml核心配置文件中指定XxxMapper.xml文件的路径用来引入文件

  • resource属性的方式引入:这种方式是从类路径当中加载资源
  • url属性的方式引入:这种方式是从绝对路径当中加载资源 , url需要指定file:/// + 文件的绝对路径的形式 (注意是三个斜杠)
<!--resource属性的方式引入-->
<mapper resource="CarMapper.xml"/> :这种方式是从类路径当中加载资源。
<!--url需要指定file:/// + 文件的绝对路径的形式-->
<mapper url="file:///d:/CarMapper.xml"/> 

第七步:使用ibatis的类库中的内置类连接数据库完成增删改查

package com.powernode.mybatis.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;

public class MyBatisCompleteTest {
    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            // 获取SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            
            // 获取SqlSessionFactory对象(一般情况下一个数据库对应一个SqlSessionFactory对象)
            // ibatis包下的工具类Resources.getResourceAsStream方法默认从类的根路径下开始查找资源,底层是使用ClassLoader类加载器加载资源
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
            
            // 获取执行sql语句的数据库操作对象SqlSession(开启会话)
            // mybatis默认采⽤的事务管理器是JDBC,默认会开启事务,需要我们手动提交事务, 底层实际上会执行:conn.setAutoCommit(false) 
            sqlSession = sqlSessionFactory.openSession();
            
            // 这种方式实际上是不建议的,因为没有开启事务
			// sqlSession = sqlSessionFactory.openSession(true);
            
            // 通过sql语句的id执行对应的sql语句,处理相关业务
            int count = sqlSession.insert("insertCar");
            //返回值是影响数据库表当中的记录条数
            System.out.println(count);
            
            // 执行到这里,没有发生任何异常,提交事务并终止事务
            sqlSession.commit();
        } catch (Exception e) {
            // 最好回滚事务
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 关闭会话(释放资源)
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

封装MyBatis⼯具类SqlSessionUtil

每⼀次获取SqlSession对象代码太繁琐,封装⼀个⼯具类SqlSessionUtil用来返回一个SqlSession会话对象

  • 工具类中所有的方法都是静态的,不需要new对象直接采用类名即可调用(为了防止new对象构造方法可以私有化)
public class SqlSessionUtil {
    private SqlSessionUtil(){}
    // SqlSessionUtil工具类在进行第一次类加载的时候,解析mybatis-config.xml文件,创建SqlSessionFactory对象
    // 服务器启动时初始化一次sqlSessionFactory对象
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    //每调⽤⼀次openSession()可获取⼀个新的会话对象,该会话需手动提交事务
    public static SqlSession openSession(){
        return sqlSessionFactory.openSession();
        // 每调⽤⼀次openSession()可获取⼀个新的会话,该会话⽀持⾃动提交,一个数据库可以存在多个会话
        // return sqlSessionFactory.openSession(true);
    }
}

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

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

相关文章

【C++修炼之路】vector 模拟实现

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、读源码二、成员变量三、默认成员函数1、构造2、析构3、拷贝构造4、赋值重载 四、访问1、[ ] 重载2、迭代器 五、容量1、cap…

Profibus DP主站转Modbus TCP网关profibus从站地址范围

远创智控YC-DPM-TCP网关。这款产品在Profibus总线侧实现了主站功能&#xff0c;在以太网侧实现了ModbusTcp服务器功能&#xff0c;为我们的工业自动化网络带来了全新的可能。 远创智控YC-DPM-TCP网关是如何实现这些功能的呢&#xff1f;首先&#xff0c;让我们来看看它的Profib…

Oracle解析JSON字符串

Oracle解析JSON字符串 假设某个字段存储的JSON字符串&#xff0c;我们不想查出来后通过一些常见的编程语言处理&#xff08;JSON.parse()或者是JSONObject.parseObject()等&#xff09;&#xff0c;想直接在数据库上处理&#xff0c;又该如何书写呢&#xff1f; 其实在ORACLE中…

算法06-搜索算法-广度优先搜索

文章目录 参考&#xff1a;总结大纲要求搜索算法-广度优先搜索迷宫问题问题迷宫的存储迷宫的移动搜索方式代码实现 图的广度优先遍历题目描述用邻接矩阵表示图 搜索算法-广度优先搜索 参考&#xff1a; 【算法设计】用C类和队列实现图搜索的广度优先遍历算法 C/C 之 广度优先…

梯度下降(Gradient Descent)

基本思想 梯度下降是一个用来求函数最小值的算法&#xff0c;本次&#xff0c;我们将使用梯度下降算法来求出代价函数的最小值。 梯度下降背后的思想是&#xff1a;开始时我们随机选择一个参数的组合&#xff0c;计算代价函数&#xff0c;然后我们寻找下一个能让代价函数值下降…

Linux:squid透明代理

在传统代理上进行修改并添加网卡 这次不使用手动代理&#xff0c;而是把网关搞成代理 在下面这个链接里的文章实验下进行修改 Linux&#xff1a;squid传统代理_鲍海超-GNUBHCkalitarro的博客-CSDN博客 完成以后不用再win10上去配置&#xff0c;代理的那一步&#xff0c;然后…

Python(十二)常见的数据类型

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

TabLayout+ViewPager实现滚动页面

目录 一、TabLayout介绍 二、TabLayout的常用属性和方法 常用属性&#xff1a; 常用方法&#xff1a; 三、适配器介绍 &#xff08;一&#xff09;、PagerAdapter介绍&#xff1a; &#xff08;二&#xff09;、FragmentPagerAdapter介绍&#xff1a; &#xff08;三&am…

习题 1.26

我们先来看看题目要求&#xff0c;题目住说将 square 调用换成了&#xff08;* x x),结果导致执行时间变慢。 根据以前学过的内容&#xff0c;我们知道 在做显示乘法的时候&#xff0c;是直接进行计算的&#xff0c;而在做函数调用的时候&#xff0c;是先进行表达式展开的&…

【MySQL】常见函数使用(二)

&#x1f697;MySQL学习第二站~ &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ 就如同许多编程语言中的API一样&#xff0c;MySQL中的函数同样是官方给我们封装好的&#xff0c;可以直接调用的一段代码。…

ZooKeeper ZAB

文章首发地址 在接收到一个写请求操作后&#xff0c;追随者会将请求转发给群首&#xff0c;群首将探索性地执行该请求&#xff0c;并将执行结果以事务的方式对状态更新进行广播。一个事务中包含服务器需要执行变更的确切操作&#xff0c;当事务提交时&#xff0c;服务器就会将这…

dp算法篇Day7

"抱紧你的我&#xff0c;比国王富有~" 31、最长定差子序列 (1) 题目解析 从题目来看还是很容易理解的&#xff0c;就是找寻数组中构成差值相等的子序列。 (2) 算法原理 class Solution { public:int longestSubsequence(vector<int>& arr, int difference…

多模态系列论文--ALBEF 详细解析

ALBEF来自于Align before Fuse&#xff0c;作者团队全自来自于Salesforce Research。 论文地址&#xff1a;Align before Fuse: Vision and Language Representation Learning with Momentum Distillation 论文代码&#xff1a;ALBEF 1 摘要 最近图像文本的大规模的特征学习非…

AI Chat 设计模式:7. 单例模式

本文是该系列的第七篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的旁白和思考。 问题列表 Q.1 简单介绍一下单例模式A.1Q.2 详细说说饿汉式&#xff0c;并使用 c 举例A.2Q.3 好&#xff…

【半监督医学图像分割 2022 IJCAI】UGPCL

文章目录 【半监督医学图像分割 2022 IJCAI】UGPCL摘要1. 介绍2. 相关工作2.1 半监督医学图像分割2.2 对比学习2.3 不确定度估计 3. 方法3.1 解码器间的一致性学习3.2 不确定性引导的对比学习3.3 等变对比损失 4. 实验4.1 实验设置4.2 定量实验4.3 消融实验 5. 结论 【半监督医…

引爆用户流量,打造热门小红书创业项目

引爆用户流量&#xff0c;打造热门小红书创业项目 在当今互联网时代&#xff0c;创业者们不断寻求新的商机和盈利模式。而小红书作为一个以分享购物心得、美妆、旅行等内容为主的社交平台&#xff0c;成为了众多创业者关注的焦点。如何通过小红书引爆用户流量&#xff0c;并打造…

【框架篇】使用注解存储对象

使用注解存储对象 之前我们存储Bean时&#xff0c;需要在spring-config 中添加一行 bean注册内容才行&#xff0c;如下图所示&#xff1a; 问题引入&#xff1a;如果想在Spring 中能够更简单的进行对象的存储和读取&#xff0c;该怎么办呢&#xff1f; 问题解答&#xff1a;实…

Python应用实例(一)外星人入侵(十)

外星人入侵&#xff08;十&#xff09; 1.记分1.1 显示得分1.2 创建记分牌1.3 在外星人被消灭时更新得分1.4 重置得分1.5 将消灭的每个外星人都计入得分1.6 提高分数1.7 舍入得分1.8 最高得分1.9 显示等级1.10 显示余下的飞船数 1.记分 下面来实现一个记分系统&#xff0c;以实…

动态规划01背包之1049 最后一块石头的重量 II(第11道)

题目&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 。那么粉碎的可能结果如下&#xff1a; …

4029: 网格行走

题目内容 在一个 n n n \times n nn 的网格上行走&#xff0c;从 ( 1 , 1 ) (1, 1) (1,1) 走到 ( n , n ) (n, n) (n,n)。每次只能向下走一步或向右走一步。 每个点 ( i , j ) (i, j) (i,j) 有权值 a i , j a_{i, j} ai,j​&#xff0c;给定一个数 x x x&#xff0c;求…