一,JDBC的概念。
JDBC:java database connectivity java数据库连接。(通过java对数据库进行操作)
JDBC的本质:其实就是提供了一些方法与接口(规范),实现是由数据库的厂商来实现 (驱动包)
一,JDBC连接数据库的步骤
1.导入jar包
2.通过反射来加载驱动
3.得到连接对象 connection
4.得到发送sql 对象(交通工具)
5.得到返回的结果
6.关闭资源 从下往上进行关闭
注意点:所有的jar包都是导入的是 java.sql.*
二,JDBC的详细解释
1, Class.forName(“com.mysql.jdbc.Driver”); 通过反射来加载驱动 Driver =>驱动类
2,DriverManager 驱动管理对象来获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/user?characterEncoding=utf-8", "root", "root");
url : 表示连接数据库的地址 jdbc:mysql://localhost:3306/数据库的库名?characterEncoding=utf-8 || jdbc:mysql:///day03_db 只支持本地连接
jdbc : 表示主的协议=>也就是使用jdbc来连接数据库
mysql : 表示子协议=>也及时使用mysql数据库
localhost: : 表示本机的ip地址
3306 : 表示mysql数据库的端口号,端口号后是数据库的库ming
? : 后 都是表示设置的参数 characterEncoding=utf-8 ==>设置其编码格式
username :表示数据库的用户名
password :表示数据库 密码
3,conn.createStatement(); ==>表示通过连接对象来获取执行sql 的对象Statement(交通工具)
4,sta.executeQuery(sql) 发送sql语句,数据库返回一个结果集 ResultSet
5,关闭资源(从下往上关闭)
6,?表示占位符号
三,JDBC操作中出现的常见错误
1,nknown database ‘us’ :数据库不存在
2,Access denied for user ‘root’@‘localhost’ (using password: YES) :用户名与密码不正确
3,You have an error in your SQL syntax :sql 异常
四,unit 测试
主要是用于测试 使用的步骤
1.导包 添加依赖
2.编写一个测试方法(不是main) 注意点:1.需要使用public void 2.这个方法没有返回值 3.这个方法没有参数
3.在方法加注解 @Test
4.直接运行 绿色表示没有错误 红色表示产生了错误
五,jdbcUtils工具类的封装
1.加载驱动(只需要加载一次,写在静态代码块)
2.获取连接对象写成一个方法 (三个参数写成常量)
3.增删改
4.查询
5.关闭资源
一,区别
Statement 产生的问题:1.sql注入,不安全,每次直接拼
PreparedStatement
①,他是 Statement 对象的一个子类
②,可以防止sql注入,保证sql语句的安全
③,预编译检验sql是否正确 =>效率高 =>替换Statement
④,避免sql语句的拼写
封装数据库基类 BaseDao
用jdbc 增加一个宠物
根据 id修改宠物信息
删除 id为2的宠物
分页查询前五条信息
使用模糊查询 宠物名字为花的宠物
工具类代码:
package com.offic.day09homework;
import javax.xml.transform.Result;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class JDBCBase {
//定义常量
final static String DRIVER = "com.mysql.jdbc.Driver";
final static String URL = "jdbc:mysql://localhost:3306/user?characterEncoding=utf-8";
final static String UID = "root";
final static String UPWD = "root";
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//定义创建Connection对象的方法
public static Connection getCon() {
try {
Connection conn = DriverManager.getConnection(URL, UID, UPWD);
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//定义增删改的方法
public static int change(String sql, Object[] obj) {
Connection conn = null;
PreparedStatement ps = null;
int num = -1;
try {
conn = getCon();
ps = conn.prepareStatement(sql);
if (obj != null && obj.length > 0) {
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
}
num = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(null, ps, conn);
}
return num;
}
//定义查询的方法
public static List<Pet> search(String sql, Object[] obj) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Pet> list = new ArrayList<>();
try {
conn = getCon();
ps = conn.prepareStatement(sql);
if (obj != null && obj.length > 0) {
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
}
rs = ps.executeQuery();
while (rs.next()) {
Pet p = new Pet();
p.setHealth(rs.getInt("Health"));
p.setId(rs.getInt("Id"));
p.setLove(rs.getInt("Love"));
p.setName(rs.getString("Name"));
p.setStrain(rs.getString("Strain"));
list.add(p);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs, ps, conn);
}
return list;
}
//定义关闭流的方法
public static void close(ResultSet rs, PreparedStatement ps, Connection conn) {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
测试类代码:
package com.offic.day09homework;
import org.junit.Test;
import java.sql.Connection;
import java.util.List;
public class test {
public static void main(String[] args) {
// 用jdbc 增加一个宠物
String sql = "insert into pet(name,health,love,strain)values(?,?,?,?)";
Object[] obj = {
"小白",90,90,"泰迪"};
int num = JDBCBase.change(sql,obj);
if (num > 0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
}
@Test
public void bb() {
// 根据 id修改宠物信息
String sql = "update pet set name=?,health=?,love=?,strain=? where id=?";
Object[] obj = {
"小黑", 95, 95, "中华田园犬",3};
int num = JDBCBase.change(sql, obj);
if (num > 0) {
System.out.println("修改成功");
} else {
System.out.println("修改失败");
}
}
@Test
public void cc() {
// 删除 id为2的宠物
String sql = "delete from pet where id=?";
Object[] obj = {
2};
int num = JDBCBase.change(sql, obj);
if (num > 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
}
@Test
public void dd() {
// 分页查询前五条信息
String sql = "select * from pet limit ?,?";
Object[] obj = {
0,5};
List<Pet> list = JDBCBase.search(sql, obj);
for(Pet p : list){
System.out.print(p.getHealth());
System.out.print(p.getId());
System.out.print(p.getLove());
System.out.print(p.getName());
System.out.print(p.getStrain());
System.out.println();
}
}
@Test
public void ee(){
// 使用模糊查询 宠物名字为花的宠物
String sql = "select * from pet where name like ?";
Object[] obj = {
"%花%"};
List<Pet> list = JDBCBase.search(sql, obj);
for(Pet p : list){
System.out.print(p.getHealth());
System.out.print(p.getId());
System.out.print(p.getLove());
System.out.print(p.getName());
System.out.print(p.getStrain());
System.out.println();
}
}
}
Pet类代码:
package com.offic.day09homework;
import java.io.Serializable;
public class Pet implements Serializable {
private int id;
private String name;
private int health;
private int love;
private String strain;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
}