MySql教程

MySQL

本文主要是介绍MySQL,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

数据库

1、为什么需要设计

当数据库比较复杂的时候,我们就需要设计了

糟糕的数据库设计:

  • 数据冗余,浪费空间

  • 数据库插入和删除都会麻烦、异常【屏蔽使用物理外键】

  • 程序的性能差

良好的数据库设计:

  • 节省内存空间
  • 保证数据库的完整性
  • 方便我们开发系统

软件开发中,关于数据库的设计

  • 分析需求:分析业务和需要处理的数据库的需求
  • 概要设计:设计关系图E-R图

设计数据库的步骤:(个人博客)

  • 收集信息,分析需求

    • 用户表(用户登录注销,用户的个人信息,写博客,创建分类)
    • 分类表(文章分类,谁创建的)
    • 文章表(文章的信息)
    • 友链表(友链信息)
    • 自定义表(系统信息,某个关键的字,或者- -些主字段) key : value
    • 说说表(发表心情.. id... content...create_time)
  • 标识实体(把需求落地到每个字段)

  • 标识实体之间的关系

    • 写博客:user --> blog
    • 创建分类:user -> category
    • 关注:user ->user
    • 友链: links
    • 评论: user-user-blog

2、三大范式

为什么需要数据规范化?

  • 信息重复
  • 更新异常
  • 插入异常
    • 无法正常显示信息
  • 删除异常
    • 丢失有效信息

三大范式

第一范式(1NF)

原子性:保证每一 列不可再分

第二范式(2NF)

前提:满足第一范式

每张表只描述一件事情

第三范式(3NF)

前提:满足第一范式和第二范式

第三范式需要确保数据表中的每一列数据都和主键直接相关, 而不能间接相关。

(规范数据库的设计)

规范性和性能的问题

关联查询的表不得超过三张表

  • 考虑商业化的需求和目标,(成本,用户体验! )数据库的性能更加重要
  • 在规范性能的问题的时候,需要适当的考虑一下规范性!
  • 故意给某些表增加一-些冗余的字段。(从多表查询中变为单表查询)
  • 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)

3、JDBC

image
image

步骤总结:

1、加载驱动

2、连接数据库DriverManager

3、获得执行sql的对象Statement

4、获得返回的结果集

5、释放连接

4、数据库C3P0连接池

数据库连接--执行完毕--释放

连接--释放十分浪费系统资源

池化技术:准备-些预先的资源,过来就连接预先准备好的

最小连接数:10

最大连接数:15

等待超时: 100 ms

编写连接池,实现-一个接口DataSource

开源数据库连接

DBCP

C3P0

Druid:阿里巴巴

使用这些数据库连接池之后,我们在项目开发中就不需要比那些数据库的代码了!

DBCP配置文件

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=root

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED

C3P0

依赖两个

<c3p0-config> 
  <default-config> 
  <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> 
  <property name="acquireIncrement">3</property> 

  <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> 
  <property name="acquireRetryAttempts">30</property>

  <!--两次连接中间隔时间,单位毫秒。Default: 1000 --> 
  <property name="acquireRetryDelay">1000</property> 

  <!--连接关闭时默认将所有未提交的操作回滚。Default: false --> 
  <property name="autoCommitOnClose">false</property> 

  <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么 属性 preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。Default: 
null--> 
  <property name="automaticTestTable">Test</property> 

  <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()
 的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false--> 
  <property name="breakAfterAcquireFailure">false</property> 

  <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。efault: 0 --> 
  <property name="checkoutTimeout">100</property> 

  <!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。Default:com.mchange.v2.c3p0.impl.DefaultConnectionTester--> 
<property name="connectionTesterClassName"></property> 

  <!--指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可 Default: null--> 
  <property name="factoryClassLocation">null</property> 

  <!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. 文档原文)作者强烈建议不使用的一个属性--> 
  <property name="forceIgnoreUnresolvedTransactions">false</property> 

  <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> 
  <property name="idleConnectionTestPeriod">60</property> 

  <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 
  <property name="initialPoolSize">3</property> 

  <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> 
  <property name="maxIdleTime">60</property> 

  <!--连接池中保留的最大连接数。Default: 15 --> 
  <property name="maxPoolSize">15</property> 

  <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个
 connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与 
maxStatementsPerConnection均为0,则缓存被关闭。Default: 0--> 
  <property name="maxStatements">100</property> 

  <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 --> 
  <property name="maxStatementsPerConnection"></property> 

  <!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能 通过多线程实现多个操作同时被执行。Default: 3--> 
  <property name="numHelperThreads">3</property> 

  <!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0 的数据源时。Default: null--> 
  <property name="overrideDefaultUser">root</property> 

  <!--与overrideDefaultUser参数对应使用的一个参数。Default: null--> 
  <property name="overrideDefaultPassword">password</property> 

  <!--密码。Default: null--> 
  <property name="password"></property> 

  <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:测试的表必须在初始数据源的时候就存在。Default: null--> 
  <property name="preferredTestQuery">select id from test where id=1</property> 

  <!--用户修改系统配置参数执行前最多等待300秒。Default: 300 --> 
  <property name="propertyCycle">300</property> 

  <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用 
idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。Default: false
 --> 
  <property name="testConnectionOnCheckout">false</property> 

  <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --> 
  <property name="testConnectionOnCheckin">true</property> 

  <!--用户名。Default: null--> 
  <property name="user">root</property>
  </default-config> <!-- This app is massive! -->
</c3p0-config> 
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config>
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/database?useSSL=false&amp;serverTimezone=Hongkong&amp;characterEncoding=utf-8&amp;autoReconnect=true</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">10</property>
        <property name="maxPoolSize">20</property>
    </default-config>
 
</c3p0-config>
这篇关于MySQL的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!