任务一:JDBC
1. JDBC 概述
1.1 客户端操作数据库的方式
1) 方式1: 使用第三方客户端来访问 MySQL:SQLyog
2) 方式2: 使用命令行
3) 我们今天要学习的是通过 Java程序 来访问 MySQL 数据库
1.2 什么是JDBC
JDBC(
Java Data Base Connectivity) 是 Java 访问数据库的标准规范.是一种用于执行SQL语句的Java API,可以为
多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范.
1.3 JDBC 原理
JDBC
是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需
要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
总结:
JDBC就是由sun公司定义的一套操作所有关系型数据库的规则(接口),而数据库厂商需要实现这套接口,提供数据库
驱动jar包, 我们可以使用这套接口编程,真正执行的代码是对应驱动包中的实现类。
2. JDBC 开发
2.1 数据准备
-- ``创建 ``jdbc_user``表
CREATE TABLE ``jdbc_user (
id ``INT ``PRIMARY KEY AUTO_INCREMENT ``,
username ``VARCHAR``(``50``),
PASSWORD ``VARCHAR``(``50``),
birthday ``DATE
);
-- ``添加数据
INSERT INTO ``jdbc_user (username, ``PASSWORD``,birthday)
VALUES``(``'admin1'``, ``'123'``,``'1991/12/24'``),
(``'admin2'``,``'123'``,``'1995/12/24'``),
(``'test1'``, ``'123'``,``'1998/12/24'``),
(``'test2'``, ``'123'``,``'2000/12/24'``);
**
2.2 MySql驱动包
- 将MySQL驱动包添加到jar包库文件夹中,Myjar文件夹,用于存放当前项目需要的所有jar包
2.3 API使用: 1.注册驱动
JDBC规范定义驱动接口: java.sql.Driver
MySql驱动包提供了实现类: com.mysql.jdbc.Driver
加载注册驱动的方式 描述**Class.forName(**``**数据库驱动实现类)加载和注册数据库驱动**``**,**``**数据库驱动由数据库厂商**``**MySql**``**提供**
**"com.mysql.jdbc.Driver"**
1) 代码示例
public class ``JDBCDemo01 ``{
public static ``void ``main``(``String``[] ``args``) ``throws ``ClassNotFoundException ``{
//1.``注册驱动
// forName ``方法执行将类进行初始化
Class``.``forName``(``"com.mysql.jdbc.Driver"``);
}
}
2) 为什么这样可以注册驱动?
我们知道 Class类的forName方法 ,可以将一个类初始化, 现在我们一起Driver类的 看一下源码// Driver``类是``MySql``提供的数据库驱动类``, ``实现了``JDBC``的``Driver``接口 ``java.sql.Driver
public class ``Driver ``extends ``NonRegisteringDriver ``implements ``java``.``sql``.``Driver ``{
// ``空参构造
public ``Driver``() ``throws ``SQLException ``{
}
//``静态代码块``,Class``类的 ``forName()``方法将``Driver``类 加载到内存``, static``代码块会自动执行
static ``{
try ``{
/*
DriverManager ``驱动管理类
registerDriver(new Driver) ``注册驱动的方法
注册数据库驱动
*/
DriverManager``.``registerDriver``(``new ``Driver``());
} ``catch ``(``SQLException var1``) {
throw new ``RuntimeException``(``"Can't register driver!"``);
}
}
}
注:**从 JDBC3 开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。 Class.forName 这句话可以省
略。
2.4 API使用: 2.获得连接
Connection 接口,代表一个连接对象 ,具体的实现类由数据库的厂商实现
使用 DriverManager类的静态方法,getConnection可以获取数据库的连接
**
任务二:数据库连接池和DBUtils
任务三:XML
1. XML基本介绍
1.1 概述
XML即可扩展标记语言(Extensible Markup Language)
W3C在1998年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版
本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是
1.0版本 !
特点
可扩展的, 标签都是自定义的
语法十分严格
1.2 XML的作用
2. XML的语法
2.1 XML文档声明格式
文档声明必须为结束;
文档声明必写在第一行;
1) 语法格式:
2) 属性说明:
versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
encoding:指定当前文档的编码。可选属性,默认值是utf-8;
2.2 元素
Element 元素: 是XML文档中最重要的组成部分
元素的命名规则
<?xml version=”1.0” encoding=”UTF-8”?>
1. 不能使用空格,不能使用冒号
2. xml 标签名称区分大小写
3. XML 必须有且只有一个根元素
语法格式:<users> <users>
任务四:综合案例
模块作业
第一题 :转账操作
数据准备
1) 创建数据库
create database test01 character set utf8;
2) 创建表:account(账户表),有如下结构及数据:(复制以下SQL语句执行)
CREATE TABLE account (
id int(11) PRIMARY KEY AUTO_INCREMENT,
username varchar(100) , — 用户姓名
card varchar(100) , — 卡号
balance double, — 当前余额
) ;
— 插入数据
insert into account(id,username,card,balance) values (1,’tom’,’1122334455’,20000.00),(2,’lucy’,’55443332211’,10000.00);
2) 创建表:Transaction(交易记录表) (复制以下SQL语句执行)
CREATE TABLE TRANSACTION (
id INT PRIMARY KEY AUTO_INCREMENT,
cardid VARCHAR(100) , — 交易卡号
tratype VARCHAR(100) , — 交易类型: 转入 或者 转出
tramoney DOUBLE , — 交易金额
tradate DATETIME — 交易日期
) ;
代码编写
1) 创建项目 Test_01
2) 导入jar包
3) 创建包 包结构为
www.lagou.utils 存放工具类
www.lagou.entity 存放JavaBean类
www.lagou.app 创建测试类
4) 按照步骤 实现卡号:1122334455向55443332211转账5000元的操作;
步骤
a) 使用连接池创建QueryRunner对象;
b) 判断转出方是否有足够余额,如果不足,提示信息:”余额不足!”,并结束程序;
c) 通过卡号 进行转账的操作;
d) 转账结束后, 将转入、转出记录分别写入到Transaction表中。
// 测试类package ``com.lagou.app``;<br />``import ``com.lagou.entity.Account``;<br />``import ``com.lagou.utils.DateUtils``;<br />``import ``com.lagou.utils.DruidUtils``;<br />``import ``org.apache.commons.dbutils.QueryRunner``;<br />``import ``org.apache.commons.dbutils.handlers.BeanHandler``;<br />``import ``org.apache.commons.dbutils.handlers.ScalarHandler``;<br />``import ``java.sql.Connection``;<br />``import ``java.sql.SQLException``;<br />``import ``java.sql.Statement``;<br />``/*<br />``* a) ``使用连接池创建``QueryRunner``对象;``b) ``判断转出方是否有足够余额,如果不足,提示信息:``”``余额不足!``”``,并结束程序;``c) ``通过卡号 进行转账的操作;``d) ``转账结束后``, ``将转入、转出记录分别写入到``Transaction``表中。``*<br />``* ``实现卡号:``1122334455``向``55443332211``转账``5000``元的操作;``* */<br />``public class ``TestAccount {
``public static void ``main``(String[] args) {
``//1.``获取``QueryRunner<br />`` ``QueryRunner qr = ``new ``QueryRunner()``;<br />`` ``//2.``获取连接<br />`` ``try ``{
Connection connection = DruidUtils.``_getConnection_``()``;<br />`` ``//3. ``开启事务<br />`` ``connection.setAutoCommit(``false``)``;``// ``手动开启事务<br />`` ``//4.``编写``SQL<br />`` //4.1``查询余额<br />`` ``String sql = ``"select balance from accounts where card = ? "``;<br />`` ``Double balance = (Double) qr.query(connection``, ``sql``, new ``ScalarHandler<>()``, ``"1122334455"``)``;<br />`` ``//4.2``余额判断<br />`` ``if ``(balance >``5000``){
``// 1122334455 ``账户`` -5000<br />`` ``String sql1 = ``"update accounts set balance = balance - ? where card = ?"``;<br />`` int ``update = qr.update(connection``, ``sql1``, ``5000``, ``"1122334455"``)``;<br />`` ``System.``_out_``.println(update)``; ``//``返回受影响行数<br />`` ``//55443332211 ``账号``+5000<br />`` ``String sql2 = ``"update accounts set balance = balance + ? where card = ?"``;<br />`` int ``update1 = qr.update(connection``, ``sql2``, ``5000``, ``"55443332211"``)``;<br />`` ``System.``_out_``.println(update1)``; ``//``返回受影响行数<br />`` ``//5.``处理转账记录<br />`` ``//``转出记录<br />`` ``String sql3 = ``"insert into transaction values(?,?,?,?,?)"``;<br />`` ``Object[] param1 = {``null,``"1122334455"``,``"``转出``"``,``5000``, ``DateUtils.``_getDateFormart_``()}``;<br />`` ``qr.update(connection``,``sql3``,``param1)``;<br />`` ``//``转入记录<br />`` ``String sql4 = ``"insert into transaction values(?,?,?,?,?)"``;<br />`` ``Object[] param2 = {``null,``"55443332211"``,``"``转入``"``,``5000``,``DateUtils.``_getDateFormart_``()}``;<br />`` ``qr.update(connection``,``sql4``,``param2)``;<br />`` ``//6.``所有操作完成后,提交事务<br />`` ``connection.commit()``;<br />`` ``System.``_out_``.println(``"``转账成功``"``)``;<br />`` ``}``else ``{
connection.rollback()``;``//``发生异常 立刻回滚<br />`` ``System.``_out_``.println(``"``余额不足,无法转账``"``)``;<br />`` return;<br />`` ``}
} ``catch ``(SQLException throwables) {
Connection connection``;``//``发生异常 立刻回滚<br />`` ``throwables.printStackTrace()``;<br />`` ``}
}
}
第二题:查询操作
数据准备
CREATE TABLE phone (
id INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20),— 手机名称
price DOUBLE , — 手机单价
prodate DATE , — 生产日期
color VARCHAR(20) — 颜色
) ;
INSERT INTO phone(id,pname,price,prodate,color) VALUES
(1,’IPhone11’,7800.00,’2019-07-20’,’土豪金’),
(2,’荣耀6X’,5689.00,’2018-02-12’,’白色’),
(3,’诺基亚3’,5699.00,’2011-12-05’,’银白色’),
(4,’红米6’,599.00,’2017-01-18’,’香槟金’);
代码编写
1) 继续在项目 Test_01中编写代码即可
2) 需求1: 查询价格高于2000元,生产日期是2019年之前的所有手机
3) 需求2: 查询所有颜色是白色的手机信息
package ``com.lagou.app``;<br />``import ``com.lagou.utils.DruidUtils``;<br />``import ``org.apache.commons.dbutils.QueryRunner``;<br />``import ``org.apache.commons.dbutils.handlers.BeanHandler``;<br />``import ``org.apache.commons.dbutils.handlers.BeanListHandler``;<br />``import ``org.junit.``Test``;<br />``import ``java.sql.Connection``;<br />``import ``java.sql.ResultSet``;<br />``import ``java.sql.SQLException``;<br />``import ``java.sql.Statement``;<br />``import ``java.util.Date``;<br />``import ``java.util.List``;<br />``//``查询价格高于``2000``元,生产日期是``2019``年之前的所有手机<br />``//<br />``//3) ``需求``2: ``查询所有颜色是白色的手机信息<br />``public class ``TestPhone {
``//``查询价格高于``2000``元,生产日期是``2019``年之前的所有手机<br />`` ``@Test<br />`` ``public void ``testphoneFindByPrice``() ``throws ``SQLException {
``//1.``获取`` QueryRunner ``对象<br />`` ``QueryRunner qr = ``new ``QueryRunner()``;<br />`` ``//2.``获取工具类连接<br />`` ``Connection connection = DruidUtils.``_getConnection_``()``;<br />`` ``//3.``获取``sateam``对象<br />`` ``Statement statement = connection.createStatement()``;<br />`` ``//4.``编写``sql<br />`` ``ResultSet resultSet = statement.executeQuery(``"SELECT ``*`` FROM phone WHERE (price >2000) AND (prodate < '2019-00-00')"``)``;<br />`` ``//``处理结果集<br />`` ``while ``(resultSet.next()){
``int ``id = resultSet.getInt(``"id"``)``;<br />`` ``String pname = resultSet.getString(``"pname"``)``;<br />`` double ``price = resultSet.getDouble(``"price"``)``;<br />`` ``Date prodate = resultSet.getDate(``"prodate"``)``;<br />`` ``String color = resultSet.getString(``"color"``)``;<br />`` ``System.``_out_``.println(id+``" "``+pname+``" "``+price+``" "``+prodate+``" "``+color)``;<br />`` ``//5.``释放资源<br />`` ``DruidUtils.``_close_``(connection``,``statement``,``resultSet``,``qr)``;<br />`` ``}
<br />
}
<br />
``//3) ``需求``2: ``查询所有颜色是白色的手机信息<br />`` ``@Test<br />`` ``public void ``TestphoneFind``() ``throws ``SQLException {
QueryRunner qr1 = ``new ``QueryRunner()``;<br />`` ``Connection connection1 = DruidUtils.``_getConnection_``()``;<br />`` ``Statement statement = connection1.createStatement()``;<br />`` ``//String sql1 =" select * from phone where color = '``白色``' ";<br />`` ``ResultSet resultSet = statement.executeQuery(``" select ``*`` from phone where color = '``白色``' "``)``;<br />`` while ``(resultSet.next()){
``int ``id = resultSet.getInt(``"id"``)``;<br />`` ``String pname = resultSet.getString(``"pname"``)``;<br />`` double ``price = resultSet.getDouble(``"price"``)``;<br />`` ``Date prodate = resultSet.getDate(``"prodate"``)``;<br />`` ``String color = resultSet.getString(``"color"``)``;<br />`` ``System.``_out_``.println(id+``" "``+pname+``" "``+price+``" "``+prodate+``" "``+color)``;<br />`` ``DruidUtils.``_close_``(connection1``,``statement``,``resultSet``,``qr1)``;<br />`` ``}
`<br />
}<br />
}`