Java 数据库连接的那些事

/

2018-8-12

MySQL

局部工作流程:

之所以说局部,是因为还没有全部弄通MySQL的工作流程(:з」∠),此部分理解主要来源于参考资料1

客户端与MySQL进行连接的时候,双方沟通的桥梁是connection,是一个物理概念,建立,销毁connection需要消耗资源,并且其本身也占用资源,所以不宜随意创建与销毁

客户端与MySQL真正进行沟通是会发起一次次的会话,称为session,每次会话包含一个或多个事务,会话是建立在connection的基础上的

JDBC

基本介绍(摘录自百度百科):

  1. JDBCJava DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
  2. JDBC 是个"低级"接口,也就是说,它用于直接调用 SQL 命令。在这方面它的功能极佳,并比其它的数据库连接 API 易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。高级接口是"对用户友好的"接口,它使用的是一种更易理解和更为方便的 API,这种API在幕后被转换为诸如 JDBC 这样的低级接口。

在关系数据库的”对象/关系”映射中,表中的每行对应于类的一个实例,而每列的值对应于该实例的一个属性。于是,程序员可直接对 Java 对象进行操作;存取数据所需的 SQL 调用将在”掩盖下”自动生成

  1. 通过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的封装)

配置文件:

  1. // src/main/resources/mybatis/mybatis.xml
  2. <?xml version="1.0" encoding="UTF-8" ?>
  3. <!DOCTYPE configuration
  4. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  5. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  6. <configuration>
  7. <environments default="development"> // environments标签,用于存放不同的生存环境的配置,default属性是在不指定环境的情况下默认使用id为“development”的环境配置
  8. <environment id="development"> “development”环境下的配置
  9. <transactionManager type="JDBC"/> // 事务管理器
  10. <dataSource type="POOLED">
  11. <property name="driver" value="${driver}"/>//用${}会读取application.yml/application.property下对应的配置
  12. <property name="url" value="${url}"/>
  13. <property name="username" value="${username}"/>
  14. <property name="password" value="${password}"/>
  15. </dataSource>
  16. </environment>
  17. </environments>
  18. <mappers>
  19. <mapper resource="org/mybatis/example/BlogMapper.xml"/> >可以用resource来读取xml里的sql语句映射,也可以用class读取java的interface写的sql语句映射
  20. </mappers>
  21. </configuration>

那么问题来了,这个配置文件是给谁用,怎么用的呢?请看下面名词解释里的1.SqlSeessionFactoryBuilder

名词解释:

1.SqlSeessionFactoryBuilder

SqlSessionFactoryBuilder顾名思义,是用来建造SqlSessionFactory的,在建造SqlSessionFactory的时候,我们要指定与哪个地址的哪个数据库,用哪个用户身份来进行连接,因此,上文中的配置文件是在建造SqlSessionFactory时使用的

  1. private static SqlSessionFactory getFactory() throws IOException {
  2. String resource = "mybatis/mybatis.xml";
  3. InputStream inputStream = Resources.getResourceAsStream(resource);
  4. return new SqlSessionFactoryBuilder().build(inputStream,"development");
  5. }

可以用如上代码生成一个SqlSessionFactory,使用时我们指定了环境为“development”

2.SqlSessionFactory

有了Factory,我们就可以建造SqlSession了

  1. public static SqlSession makeSqlSession() throws IOException{
  2. return getFactory().openSession(true);
  3. }

通过openSession()可以获得SqlSession,并且可以添加一些参数来获取不同的SqlSession,例如示例代码中的true,是用来改变sqlsession的auto-commit属性的

3.SqlSession

SqlSession们之前说过,它与jdbc的connection很像,使用时可以这样使用:

  1. public Person getUser () throws Exception{
  2. SqlSession sql = MySqlFactory.makeSqlSession();
  3. Person p = new Person();
  4. try {
  5. PersonMapper personMapper=sql.getMapper(PersonMapper.class);//PersonMapper在之前的配置文件中注册过方可使用,否则找不到,这很正常,你不提前告诉我在哪里,现在想用了我去哪给你找
  6. Person person=personMapper.getPersonById(1);//getPersonById有两种写法,可以用interface还可以用xml映射
  7. //Person person = sql.selectOne("com.example.demo.mapper.PersonMapper.getPersonById" ,1);
  8. p=person; // p.id:1,p.name:小伙伴
  9. System.out.println(p.getName()); // 小伙伴
  10. }finally {
  11. sql.close();
  12. }
  13. return p;
  14. }

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的原理,经过代码实践感觉还算合理,但不能保证完全正确,如有错误希望大家能够指正

参考资料

  1. MySQL中实例,数据库关系简介
  2. MySql数据库连接池专题
  3. jdbc源码详解(二):获取connection
  4. MySQL AutoCommit带来的问题
  5. jdbc百度百科
  6. mybatis3官方文档

Reproduced please indicate the author and the source, and error a link to this page.
text link: //sealbaby.cn/java-db

Say something...

Website
Username
Email