首页 > 其他分享 >学习MyBatis过程中遇到的问题

学习MyBatis过程中遇到的问题

时间:2025-01-03 19:34:41浏览次数:3  
标签:JDBC 映射 遇到 创建 数据库 学习 SQL MyBatis

一. 问题一:

JDBC和MyBatis都可以访问数据库,那它们的区别是什么?在具体运用过程中有什么不同?MyBatis是怎么实现对数据库的访问的?

二. 学习过程

我对MyBatis的认识是从JDBC引入的,那就先从JDBC说起。

是程序访问数据库的接口,JDBC接口通过JDBC驱动对数据库进行访问。

第一:接口不能实例化,JDBC接口并不知道我们使用哪个数据库,那应该怎么让它明确知道你在使用哪个数据库?

我们可以用哪个数据库,就使用哪个数据库的实现类。(JDBC驱动:某个数据库实现了JDBC接口的jar包。)

第二:如何创建与数据库的连接?

需要用到Connection对象,每个Connection对象代表一个数据库连接。

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8", "用户名", "密码");
		System.out.println("连接成功!");
		System.out.println("连接对象:" + con);

第三:怎么操作?

通过创建数据库操作接口(Statement / PreparedStatement)的对象来执行数据库SQL语句

Statement st = con.createStatement();
		int row = st.executeUpdate("insert into bank(customerName,currentMoney) values('王一博',8000)");

但是由于每次对同一数据库执行操作时,会建立多次连接,浪费了不必要的资源和代码,所以我们就引入了JDBC连接池。我们可以提前创建一个数据库连接池(我就叫它为数据库工具类),在每次对数据库进行操作时,获取连接池中的连接对象,这样就避免了数据库连接的频繁创建,关闭的开销。

public class DBUtil {	// 数据库连接参数
	private static final String JDBC_URL = "jdbc:mysql://localhost:3306/数据库名?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8";	private static final String JDBC_USERNAME = "用户名";	private static final String JDBC_PWD = "密码";	// 创建连接池对象
	private static  ComboPooledDataSource dataSource = new ComboPooledDataSource();	
	// 连接池参数
	static {		// 必写
		dataSource.setJdbcUrl(JDBC_URL);
		dataSource.setUser(JDBC_USERNAME);
		dataSource.setPassword(JDBC_PWD);
	}	public static Connection getConnection() {		// 从连接池中返回一个空闲连接
		try  {
			Connection con = dataSource.getConnection();			return con;
		} catch (SQLException e) {
			e.printStackTrace();			return null;
		}	
	}
}

再从连接池中获取连接:

Connection con = DBUtils1.getConnection()

最后记得关闭连接:

con.close();

2.JDBC频繁的创建statement,加载驱动很麻烦,因此就有了MyBatis,MyBatis内部封装了JDBC,简化了加载驱动,创建连接等繁杂的过程,只需要关注语句本身。(小声说一句:不得不说创新真的很重要,还要计算机语言的使用发展到现在,那些前者真的太了!真的很厉害!)

MyBatis

MyBatis是一个开源的,轻量级的数据持久化框架,可以替代JDBC。

MyBatis支持定制SQL,存储过程以及高级映射,可以在实体类和SQL语句之间建立mapping映射关系,性能优秀,简单。(关注SQL语句和注重映射关系)

一. MyBatis的开始

首先导包:

第二,在src目录下创建实体类(实体类均在一个包中,比如我的包名为com.my.entity)。实体类中首先要有成员变量(和数据库的表相对应),还有getxxx(),setxxx(),toString(),构造方法。

第三,在src目录下创建映射文件(映射文件均在同一个包中,比如我的包名com.my.mapper)。映射文件包括映射接口类(包括方法)和映射文件(配置执行地SQL语句)。

第四,创建MyBatis核心配置文件(mybatis-config.xml),用于配置数据库连接和MyBatis运行时所需的各种属性。(如下:这个很重要!!千万不要忘记将mapper文件加到配置文件)

<?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>

    <!-- 日志文件 -->
    <settings>
    <setting name="logImpl" value="LOG4J"/>
    </settings>
    
    <!-- 配置mybatis运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用JDBC的事务管理 -->
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <!-- MySQL数据库驱动 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <!-- 连接数据库的URL -->
                <property name="url"
                    value="jdbc:mysql://localhost:3306/yibo?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8" />
                <property name="username" value="root" />
                <property name="password" value="zhangjin0801" />
            </dataSource>
        </environment>
    </environments>
  
    <!-- 将mapper文件加入到配置文件中 -->
    <mappers>
       <mapper resource="com/my/mapper/WebsiteMapper.xml"/>
       <mapper resource="com/my/mapper/CouponMapper.xml"/>
    </mappers></configuration>

第五:日志文件

MyBatis默认使用log4j输出日志信息,我们就可以看到控制台输出的SQL语句。

最后一步:测试类

为了在同一个数据库表中不重复创建SqlSession,我们会创建一个工具类,每次通过sqlSession来获取某个接口的实现类对象。

首先创建这个工具类:通过创建SqlSessionFactoryBuilder对象来传入配置文件创建SqlSessionFactory的对象,再通过这个对象的openSession()方法来创建SqlSession。

public class MybatisUtils {
	private static SqlSessionFactory factory;	static{
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();		try {			factory = builder.build(Resources.getResourceAsStream("mybatis-config.xml"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static SqlSession getSqlSession() {
		SqlSession session  = null;		if(factory != null) {
			session = factory.openSession();
		}		return session;
	}
}

接下来就是具体操作:通过Mybatis来获取SqlSession对象,再通过这个对象的getMapper()方法来创建接口的实现类对象,然后通过这个实现类对象来调用接口中的方法

MyBatis与JDBC的区别:

①. 免费且开源。

②. 它将大量的SQL语句剥离出来,使用XML文件或注解的方式实现SQL的配置,可以在不修改程序代码的情况下,直接在配置文件中修改SQL语句,而JDBC需要手动设置参数,比JDBC减少了至少50%的代码量,并且很灵活,提高了代码的复用性。

③. MyBatis是最简单的持久化框架,体积小且学习门槛低。

④. 提供XML标签,支持编写动态SQL语句。

⑤. 提供映射标签,支持实体对象与数据库表的字段的映射关系。

【我对映射的理解:】

数据库字段和实体类中的属性在映射文件中要一一对应,在映射文件中,它的SQL语句在数据库中执行,映射文件和接口类在同一个包中,且要求他们的名字也相同,这也算对应。

二. 问题二:

这是由于没有将映射文件加载到配置文件中。改正如下:

标签:JDBC,映射,遇到,创建,数据库,学习,SQL,MyBatis
From: https://blog.csdn.net/weixin_74412978/article/details/144827498

相关文章

  • [学习笔记] 大学美育
    目录1.审美需要1.0.测试题1.1.审美主体1.2.审美需要2.审美能力2.0.测试题2.1.审美经验模式2.1.1.审美体验2.1.2.审美注意2.1.3.审美心理距离2.1.4.审美移情2.1.5.完形心理2.2.审美心理要素2.2.1.审美感觉2.2.2.审美知觉2.2.3.审美想象2.2.4.审美情感2.2.5.审美......
  • CSS学习记录22
    CSS按钮基本按钮样式.button{background-color:#4CAF50;/*Green*/border:none;color:white;padding:15px32px;text-align:center;text-decoration:none;display:inline-block;font-size:16px;} 按钮颜色使用background-color属性......
  • 【unity】学习制作类银河恶魔城游戏-6-
    碰撞检查控制面板定义变量射线功能创建射线实体分配射线实体调整射线编辑碰撞代码创建地面和墙面的层判断是否碰撞到了地面这行代码的作用是:从groundCheck的位置开始,向下(Vector2.down)投射一条射线,距离为groundCheckDistance,只检测whatIsGround指定的层上的物体。......
  • 《机器学习》--线性回归模型详解
    线性回归模型是机器学习中的一种重要算法,以下是对其的详细解释:一、定义与原理线性回归(LinearRegression)是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。线性回归利用称为线性回归方程的最小平方函数对一个或多个自变量和因变......
  • 计算机视觉设计开发与应用工程师报考学习计划
        为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求,深入实施人才强国战略和创新驱动发展战略,加强全国数字化人才队伍建设,持续推进人工智能从业人员能力培养和评价,工业和信息......
  • 【Java 温故而知新系列】基础知识-04 重点关键字(面试经常遇到的)
    1、final 在Java中,final关键字可以用于变量、方法和类,分别赋予它们不同的语义和行为。以下是final关键字的主要作用修饰变量当final修饰一个变量时,表示该变量的值一旦初始化后就不能再被改变。这适用于基本类型和引用类型。基本类型:对于基本类型(如 int, double 等......
  • 学习编程为何会遇到困难?
    胡言乱语编程是非常难的,不是说它的内涵有多么深奥,是因为操作门槛太低了(精通门槛不低),导致太多一知半解的人就可以传道授业播种了,反而使得这门学科变得越来越复杂,让人越学越费力。由于本人学识浅薄,只能举一些粗鄙的例子:网络教程泛滥成灾。举个例子:创造神创立了官方文档,但是凡人......
  • java字符串拼接遇到null你会处理吗
    现有一个场景,对于发票信息,需要把信息中的地址和电话进行拼接,开户号和账号进行拼接,那应该怎么做?最简单的方法是使用+拼接,但问题是如果有个字段为空,是null,那么拼接结果是什么样的?来个下面的示例publicstaticvoidmain(String[]args){Stringa=null;String......
  • 前端学习openLayers配合vue3(加载线上数据源)
    现在我们学习一下加载网上的线上数据再加上点矢量图层,紧接着上一步关键代码layers:[//瓦片图层source第三方,或者自带的,地图的底层newTileLayer({//source:newOSM(),//内置的国外地址,需要代理source:newXYZ({url......
  • springboot541党员学习交流平台(论文+源码)_kaic
     摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统党员学习交流平台信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个党员......