学习MyBatis过程中遇到的问题

3476 篇文章 105 订阅

一. 问题一:

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语句在数据库中执行,映射文件和接口类在同一个包中,且要求他们的名字也相同,这也算对应。

二. 问题二:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值