• 学习MyBatis过程中遇到的问题


    一. 问题一:
    JDBC和MyBatis都可以访问数据库,那它们的区别是什么?在具体运用过程中有什么不同?MyBatis是怎么实现对数据库的访问的?
    二. 学习过程
    我对MyBatis的认识是从JDBC引入的,那就先从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);
    
    • 1
    • 2
    • 3

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

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

    但是由于每次对同一数据库执行操作时,会建立多次连接,浪费了不必要的资源和代码,所以我们就引入了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;
    		}	
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    再从连接池中获取连接:

    Connection con = DBUtils1.getConnection()
    
    • 1

    最后记得关闭连接:

    con.close();
    
    • 1

    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文件加到配置文件)

    
    
    
    
        
        
        
        
        
        
        
            
                
                
                
                    
                    
                    
                    
                    
                    
                
            
        
      
        
        
           
           
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    第五:日志文件
    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;
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

    MyBatis与JDBC的区别:
    ①. 免费且开源。
    ②. 它将大量的SQL语句剥离出来,使用XML文件或注解的方式实现SQL的配置,可以在不修改程序代码的情况下,直接在配置文件中修改SQL语句,而JDBC需要手动设置参数,比JDBC减少了至少50%的代码量,并且很灵活,提高了代码的复用性。
    ③. MyBatis是最简单的持久化框架,体积小且学习门槛低。
    ④. 提供XML标签,支持编写动态SQL语句。
    ⑤. 提供映射标签,支持实体对象与数据库表的字段的映射关系。

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

    二. 问题二:
    在这里插入图片描述
    这是由于没有将映射文件加载到配置文件中。改正如下:
    在这里插入图片描述

  • 相关阅读:
    汇编语言之源程序
    rman 如何记录日志及如何对rman命令进行debug
    jvm总结
    基于多源数据融合方法的中国1公里土地覆盖图(2000)
    groovy 语言学习
    《The Rise and Potential of Large Language Model Based Agents: A Survey》全文翻译
    java计算机毕业设计springboot+vue学生宿舍管理系统 elementui
    mapreduce任务优化
    Insight h2database SQL like 查询
    【Python】简记操作:Centos安装、卸载、升级Python运行环境
  • 原文地址:https://blog.csdn.net/weixin_45939128/article/details/126373714