Java数据库连接:JDBC
简介
Java数据库连接:Java DataBase Connectivity(JDBC)
JDBC是一套标准,是Java与各大数据库厂商共同定制的一套接口,这套接口由各大数据库厂商进行了实现。
注意:不止能操作MySQL数据库,还能操作其他的数据库。
使用步骤
1.引入jar文件
在project里新建一个叫做lib的文件夹,将jar包放到lib文件夹里。
打开Project Structure,选择Libraries。
点击加号+,选择Java,然后选择当前project,点击OK。
点击加号+(不是上一步的加号),选择jar包,点击OK。
可以看到,多了mysql的jar包。
选择Modules,点击加号+,选择Java,选择当前project,点击OK。
jar包引入成功过后,就可以看到jar包底下的文件。
2. 加载数据库驱动
(JavaSE项目中可以省略 , JavaWeb项目必须编写此步骤)
Class.forName(“com.mysql.jdbc.Driver”);
3. 通过驱动管理器, 获取JDBC连接对象
Connection conn = DriverManager.getConnection(“数据库连接地址”,“帐号”,“密码”);
mysql的连接地址:
主协议:子协议://ip地址:端口号/数据库名称
jdbc:mysql://localhost:3306/java35
oracle的连接地址:
jdbc:oracle:thin:@localhost:1521:ORCL
4. 通过连接对象, 创建SQL执行对象 (SQL执行环境)
Statement state = conn.createStatement();
5. 通过SQL执行对象 ,执行SQL语句
state.execute(String sql语句);
注意:execute函数返回的true/false,不是执行成功/失败的意思。sql语句返回结果集(比如select语句),execute函数返回true;如果sql语句不返回结果集(比如update语句),execute函数返回false。
也可以使用其他函数,如:
int executeUpdate(String sql);
执行DML语句(INSERT UPDATE DELETE) 和 DDL语句(create alter drop)
(返回int值, 表示语句对数据库表格的影响行数!)
(通常我们认为 返回值>0 表示执行成功。)
ResultSet executeQuery(String sql);
执行DQL语句 (select)
6. 释放资源
state.close();
conn.close();
注意:一定要释放资源!很重要!不释放的话,就会一直占着一个连接。
JDBC中常用的类型与方法
1. DriverManager-驱动管理器
常用方法:
- 获取数据库连接:
static Connection getConnection(String 数据库地址,String 账号 ,String 密码)
2. Connection-数据库连接对象
常用方法:
- 创建SQL执行对象: Statement createStatement();
3. Statement-SQL执行对象
常用方法:
- 执行SQL语句(查询语句返回true, 其它语句返回false)
boolean execute(String sql); - 执行DML语句(INSERT UPDATE DELETE) 和 DDL语句(create alter drop)
(返回int值, 表示语句对数据库表格的影响行数 !)
(通常我们认为 返回值>0 表示执行成功)
int executeUpdate(String sql); - 执行DQL语句 (select)
ResultSet executeQuery(String sql);
4.ResultSet : 结果集对象 (指的是一个select语句的查询结果)
常用方法:
- 控制游标移动的常用方法:
- boolean next() 重点
作用: 控制游标向下一行移动.
返回值: 移动成功返回true , 下一行不存在移动失败, 返回
false - boolean privious() 了解
作用: 控制游标向上一行移动.
返回值: 移动成功返回true , 上一行不存在移动失败, 返回
false - boolean absolute(int 行号) 了解
作用: 控制游标向指定行移动
返回值: 移动成功返回true , 行不存在移动失败, 返回false - boolean beforeFirst() 了解
作用: 控制游标移动到第一行
返回值: 移动成功返回true, 没有第一行数据返回false - boolean afterLast() 了解
作用: 控制游标移动到最后一行
返回值: 移动成功返回true, 没有最后一行数据返回false
- 获取游标指向行的字段值的常用方法:
- XXX getXXX(String 列名) 重点
根据字段名, 得到此字段的值 - XXX getXXX(int 字段的索引)
根据字段的索引, 得到字段的值 , 索引从1开始
案例:创建表,增删改查
案例1:创建表
public static void createTable() throws ClassNotFoundException, SQLException {
//1. 加载数据库驱动 (可以省略的. 在JavaEE的web项目中,jar包不可以省略.)
// mysql6以下驱动:com.mysql.jdbc.Driver
// mysql6和6以上驱动:com.mysql.cj.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
//2. 通过驱动管理器, 获取JDBC的连接对象
// 连接地址格式:
// 主协议:子协议://ip地址:端口号/数据库名称
// mysql: jdbc:mysql://localhost:3306/test
// oracle: jdbc:oracle:thin:@ip地址:1521/ORCL
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123");
//3. 通过连接对象,创建SQL执行对象 (SQL执行环境)
Statement state = conn.createStatement();
//4. 通过SQL执行对象 执行SQL
state.execute("create table person(id int,nickname varchar(32))");
//5. 释放连接
state.close();
conn.close();
案例2:增
public static void insertData() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8", "root", "123");
Statement state = conn.createStatement();
state.execute("insert into person values(1,'张三')");
state.close();
conn.close();
}
public static void insertPerson() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8", "root", "123");
Statement state = conn.createStatement();
int flag = state.executeUpdate("insert into person values(1,'张三'),(2,'李四'),(3,'王二麻子')");
state.close();
conn.close();
System.out.println("返回:"+flag);
}
案例3:删
public static void deletePerson() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8", "root", "123");
Statement state = conn.createStatement();
int flag = state.executeUpdate("delete from person where id=1");
state.close();
conn.close();
System.out.println("返回:"+flag);
}
案例4:改
public static void updatePerson() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8", "root", "123");
Statement state = conn.createStatement();
int flag = state.executeUpdate("update person set nickname='haha' where id=2");
state.close();
conn.close();
System.out.println("返回:"+flag);
}
案例5:查
public static void selectPerson() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8", "root", "123");
Statement state = conn.createStatement();
ResultSet rs = state.executeQuery("select * from person");
while(rs.next()){
int id = rs.getInt("id");
String nickname = rs.getString("nickname");
System.out.println("id="+id+"\tnickname="+nickname);
}
//结果集也得关闭
rs.close();
state.close();
conn.close();
}
工厂方法模式与DAO
工厂方法设计模式 ( 静态工厂方法模式 )
工厂方法模式是一种创建对象的模式。
工厂方法模式基于"输入",应用在超类和多个子类之间的情况,这种模式将创建对象的责任转移到工厂类。
工厂设计模式的优点:
- 面向接口编程,体现了面向对象的思想
- 降低了耦合, 将创建对象的工作转移到了工厂类
代码案例:
1. 水果接口
public interface Fruit {
void eat();
}
2. 苹果 (水果的一种)
public class Apple implements Fruit{
@Override
public void eat() {
System.out.println("苹果吃起来甜甜的脆脆的.");
}
}
3. 香蕉 (水果的一种)
public class Banana implements Fruit{
@Override
public void eat() {
System.out.println("香蕉吃起来软软的甜甜的");
}
}
4. 静态工厂类
public class FruitFactory {
public static Fruit get(){
//return new Apple();
return new Banana();
}
}
在main方法里,使用如下代码,就可以制造一个水果,并调用它的方法。
Fruit f = FruitFactory.get();
f.eat();
DAO
DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。
为了建立一个健壮的Java应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个
特定的数据存储。
DAO模式是标准的JavaEE设计模式之一,开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开,一个典型的DAO实现有下列几个组件:
- 一个DAO工厂类;
- 一个DAO接口;
- 至少一个实现DAO接口的具体类;
- 数据传递对象(有些时候叫做Bean对象)
案例
创建5个类:
Main
UserDaoFactory
Ba