-----------------------------多表查询------------------------------------------------------
INSERT INTO dept (id,dname) VALUES (50,'人事部');
SELECT
*
FROM
emp t1
RIGHT JOIN
dept t2
ON
t1.`dept_id` = t2.`id`;
-------------------------------------- 子查询--------------------------------------------
/*概念:1.一个查询的结果作为另一个人查询的条件
2.有查询的嵌套,内部的查询称为子查询
3.子查询要使用括号
*/
-- 子查询的结果是单列查询
-- select 查询字段 from 表 where 字段=(子查询)
-- 查询工资最高的员工
SELECT MAX(salary) FROM emp; -- 在emp表中找到最高的工资
SELECT * FROM emp WHERE emp.`salary`=(SELECT MAX(salary) FROM emp);
-- 子查询的结果是多行单列的时候
-- select 查询字段 from 表 where 字段 in (子查询)
-- 查询工资大于5000的员工,来自哪些部门
SELECT dept_id FROM emp WHERE salary > 5000
SELECT
emp.`ename`,emp.`salary`,dept.`dname`
FROM
dept,
emp
WHERE
emp.`dept_id`=dept.`id` AND
dept.`id`IN (SELECT emp.`dept_id` FROM emp WHERE salary > 5000);
SELECT dept.`dname` FROM dept WHERE id IN (SELECT dept_id FROM emp WHERE salary > 5000);
-- 子查询的结果是多行多列
-- 子查询的结果是多行多列,肯定在from后面作为表
-- select 查询字段 from (子查询) 表别名 where 条件;
-- 子查询你作为表需要取别名,否则这张表没有名称无法访问表中的字段
-- 查询出2011年以后入职的员工信息,包括部门名称
SELECT * FROM emp WHERE joindate >'2002-1-1';
SELECT
*
FROM
(SELECT * FROM emp WHERE joindate >'2002-1-1') t1,
dept t2
WHERE
t2.`id` = t1.dept_id;
----------------------------------------------事务--------------------------------------------------
事务的基本介绍
1.概念:如果包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
2.操作:
开启事务:start transaction
回滚:rollback
提交:commit
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
INSERT INTO account (NAME,balance) VALUES ('张三',1000),('李四',1000);
UPDATE account SET balance=1000 WHERE NAME IN('张三','李四');
START TRANSACTION; -- 开启事务功能
UPDATE account SET balance=balance-500 WHERE NAME='张三';
123
UPDATE account SET balance=balance+500 WHERE NAME='李四';
COMMIT; -- 提交事务
ROLLBACK; -- 回滚事务
SELECT * FROM account;
-- ----事务提交的两种方式-----------------------
SELECT @@autocommit;
SET @@autocommit=0;
SET @@autocommit=1;
MySQL数据库中事务默认自动提交
事务提交的两种方法:
*自动提交:
*mysql就是自动提交的
*一条MDL(增删改)语句会自动提交一次事务
*手动提交:
*Oracle数据库默认是手动提交
*需要先开启事务,再提交
*修改事务的默认提交方式
*查看事务的默认提交方式:select @@autocommit;--1代表自动提交 0代表手动提交
*修改默认提交方式:set @@autocommit=0;
3.事务的四大特征(****面试题****):
1.原子性:是不可分割的最小单位,要么同时成功,要么同时失败。
2.持久性:当事务提交或回滚后,数据库会持久化的保持数据。
3.隔离性:多个事务之间相互独立。
4.一致性:事务操作前后,数据总量不变。
事务的隔离级别(暂无笔记)
-------------------------------------------------------------------------------------------
--------------------------------------JDBC------------------------------------------------
1.概念:Java DataBase Connectivity Java数据库连接,Java语言操作数据库
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据驱动jar包(它把所有的数据库实后写了一个类,然后把这些类写入一个jar包),我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
2.快速入门:
步骤:
//1.导入驱动包jar包
//2.注册驱动(让程序知道用的是哪个版本,让他知道哪个驱动包需要注册驱动 )
*Class.ForName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象 Connection(本地的Java代码和数据库之间的桥梁对象)
* Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db6","root","root");
//4.定义sql语句(将来通过一些方式把sql语句发给数据库,让数据执行sql语句,从而达到Java代码操作数据库的作用 )
*String sql = "update account set balance = 1001 where id = 3";
//5.获取执行sql语句的对象Statement(因为connection不能直接执行)
*Statement stmt = conn.createStatement();
//6.执行sql,接受返回结果(方法调用的返回值)
*int i = stmt.executeUpdate(sql);
//7.处理结果
*System.out.println(i);
//8.释放资源 (避免内存泄漏)
*stmt.close();
*conn.close();
3.详解各个对象
1.DriverManager:驱动管理对象
2.Connection:数据库连接对象
3.Statement:执行sql的对象
4.ResultSet:结果集对象
5.PreparedStatement:执行sql的对象
DriverManager功能:
1)注册驱动:告诉程序该使用哪一个数据驱动jar
static voidregisterDriver(Driver driver):注册与给定的驱动程序DriverManager。
写代码使用:Class.ForName("com.mysql.jdbc.Driver");
2)获取数据库连接
connection:url:连接路径 user:用户名 password:密码
Statement:
Statement接口中的方法
in executeUpdate(String sql):用于DML增删改操作insert,update,delete。返回值:返回数据库影响的行数
ResultSet executeQuery(String sql):用于发送SQL语句,执行查询的操作 select。返回值:查询的结果集
---------------------------------------------------------------------------------------------
----------------------------数据库连接池---------------------------------------------------
#数据库连接池
#spring JDBC:JDBC Template
#数据库连接池
*概念:其实就是一个容器(集合),存放数据库连接的容器
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库的时候,从容其中获取连接对象,用户访问完之后,会将连接对象归还给容器。
*好处:
1.节约系统资源
2.用户访问高效
*实现:
*接口标准:DataSource javax.sql包下的(这个接口代表了连接池)
方法:
*获取连接 Connection getConnection( ) (该方法返回数据库连接对象 ,尝试建立与DataSource对象所代表的数据源的连接)
*归还连接 Connection.close( )如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会关闭连接,而是归还连接。
*由数据库厂商实现接口。
C3P0:数据库连接池技术
Druid:数据库连接池实现技术,由阿里巴巴提供
C3P0:数据库连接池技术
*步骤:
// 1.导入jar包(两个)c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar
// 2.定义配置文件:
*名称:c3p0.properties或者c3p0-config.xml
*路径:直接将文件放在src目录下即可
// 3.创建核心对象 数据池连接对象 ComboPooledDataSource
*DataSource da = new ComboPooledDataSource();
// 4.获取连接:getConnection
*for(int i=1 ; i<=10 ; i++){
Connection conn = ds.getConnection();
System.out.println(i+":"+conn);
}
//归还连接到连接池中
*if(i == 5){
conn.close;
}
Druid:数据库连接池实现技术,由阿里巴巴提供的
*步骤:
1.导入jar包 druid-1.0.9.jar
//2.定义配置文件:
*是properties形式的
*可以叫任意名称,可以放在任意目录下
//3.加载配置文件。Propertise()
Properties pro = new Propertise( )
InputStream is = DruidDemo.class.getClassLoader( ).getResourceAsStream("druid.properties")
//当前类的名称获取字节码文件:DruidDemo.class.getClassLoader( )
//获取字节输入流DruidDemo.ClassLoader( ).getResourceAsStream(/*name*/);
// getResource(String name)返回值为InputStream
//pro.load( );(需要一个字流或字符流)
pro.load(is);
//4.获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
//DruidDataSourceFactory.createDataSource(参数需要propertise对象)
DateSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接:getConnection
Connection conn = ds.getConnection( );
System.out.println(conn);
*定义工具类:
1.定义一个类 JDBCUtils
2.提供静态代码块加配置文件,初始化连接池对象。
3. 提供方法
1.获取连接方法:通过数据库连接池获取连接
2.释放资源
3.获取连接池的方法(有的工具类或有的小框架只需要一个连接池,不需要连接对象,他会自己调用连接池的获取连接方法)
|
|