MySQL
局部工作流程:
之所以说局部,是因为还没有全部弄通MySQL的工作流程_(:з」∠)_,此部分理解主要来源于 参考资料1
客户端与MySQL进行连接的时候,双方沟通的桥梁是connection,是一个物理概念,建立,销毁connection需要消耗资源,并且其本身也占用资源,所以不宜随意创建与销毁
客户端与MySQL真正进行沟通是会发起一次次的会话,称为session,每次会话包含一个或多个事务,会话是建立在connection的基础上的
JDBC
基本介绍(摘录自百度百科):
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
JDBC 是个"低级"接口,也就是说,它用于直接调用 SQL 命令。在这方面它的功能极佳,并比其它的数据库连接 API 易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。高级接口是"对用户友好的"接口,它使用的是一种更易理解和更为方便的 API,这种API在幕后被转换为诸如 JDBC 这样的低级接口。
在关系数据库的"对象/关系"映射中,表中的每行对应于类的一个实例,而每列的值对应于该实例的一个属性。于是,程序员可直接对 Java 对象进行操作;存取数据所需的 SQL 调用将在"掩盖下"自动生成
通过JDBC可以建立与数据库的connection,在此基础上,我们可以将想要执行的SQL语句放入会话中,获取想要的数据后,将数据映射到我们提前写好的java对象中,进行下一步处理,并释放connection
JDBC使用过程中一些基本名词概念(个人理解):
1.connection:
在进行数据库操作之前,需要与数据库进行连接,此时我们用url,username,password等参数,获取一个可以执行sql操作的connection,对应上文中MySQL的connection
2.statement:
statement是通过connection对象的createStatement方法创建的,用于发送SQL语句
3.事务
因为JDBC默认把auto-commit打开了,所以每个statement都是一个事务 关闭auto-commit时, 一个connection接下来执行的statement都是一个处于事务中,直到执行connection.commit(),事务才会关闭 事务结束后,我们还应当重新打开auto-commit,如果不打开,此connection被其他线程重复利用时,线程中的所有操作还是会变成一整个事务,而我们往往只在需要的时候进行事务操作,大多数时候下都是一条SQL一次事务
4.close
connection.close与statement.close()释放资源,connection针对的是数据库资源,而statement是数据表资源
连接池:
MySQL简介中有说到,connection的建立也需要消耗资源,因此,用完即close的方式也不是很好的选择,用一种合理的方式管理已经建立的连接,在保证线程安全(同时刻只有一个线程持有某个connection)的前提下,重复利用connection,现在已经有很多现成的线程池的库,大体上的原理还是很容易理解的,有兴趣可以了解一下
Mybatis(对jdbc的封装)
配置文件:
// src/main/resources/mybatis/mybatis.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"> // environments标签,用于存放不同的生存环境的配置,default属性是在不指定环境的情况下默认使用id为“development”的环境配置 <environment id="development"> “development”环境下的配置 <transactionManager type="JDBC"/> // 事务管理器 <dataSource type="POOLED"> <property name="driver" value="${driver}"/>//用${}会读取application.yml/application.property下对应的配置 <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> >可以用resource来读取xml里的sql语句映射,也可以用class读取java的interface写的sql语句映射 </mappers> </configuration> 复制代码
那么问题来了,这个配置文件是给谁用,怎么用的呢?请看下面名词解释里的1.SqlSeessionFactoryBuilder
名词解释:
1.SqlSeessionFactoryBuilder
SqlSessionFactoryBuilder顾名思义,是用来建造SqlSessionFactory的,在建造SqlSessionFactory的时候,我们要指定与哪个地址的哪个数据库,用哪个用户身份来进行连接,因此,上文中的配置文件是在建造SqlSessionFactory时使用的
private static SqlSessionFactory getFactory() throws IOException { String resource = "mybatis/mybatis.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream,"development"); } 复制代码
可以用如上代码生成一个SqlSessionFactory,使用时我们指定了环境为“development”
2.SqlSessionFactory
有了Factory,我们就可以建造SqlSession了
public static SqlSession makeSqlSession() throws IOException{ return getFactory().openSession(true); } 复制代码
通过openSession()可以获得SqlSession,并且可以添加一些参数来获取不同的SqlSession,例如示例代码中的true,是用来改变sqlsession的auto-commit属性的
3.SqlSession
SqlSession们之前说过,它与jdbc的connection很像,使用时可以这样使用:
public Person getUser () throws Exception{ SqlSession sql = MySqlFactory.makeSqlSession(); Person p = new Person(); try { PersonMapper personMapper=sql.getMapper(PersonMapper.class);//PersonMapper在之前的配置文件中注册过方可使用,否则找不到,这很正常,你不提前告诉我在哪里,现在想用了我去哪给你找 Person person=personMapper.getPersonById(1);//getPersonById有两种写法,可以用interface还可以用xml映射 //Person person = sql.selectOne("com.example.demo.mapper.PersonMapper.getPersonById" ,1); p=person; // p.id:1,p.name:小伙伴 System.out.println(p.getName()); // 小伙伴 }finally { sql.close(); } return p; } 复制代码
mybatis-spring-boot DEMO
mybatis有官方的spring包和spring-boot包,可以让我们不用手动创建和销毁SqlSession,也不用每写一个mapper映射文件就要改动配置文件,可以用简易的注解代替,使代码更加简洁,让我们可以专注于业务代码
示例demo
mybatis包版本:mybatis-spring-boot-starter 1.3.2目录结构:
Controller:
Mapper:
User-Model:
User-SqlString
application.properties:
写在最后
以上内容大部分为个人理解,总体上是想以一种说的过去的概念模型来描述jdbc和mybatis的原理,经过代码实践感觉还算合理,但不能保证完全正确,如有错误希望大家能够指正