jdbc:java database connection 提供接口和规范 供数据库厂商实现
jdbc的使用过程
1.Class.forname("com.mysql.jdbc.Driver")加载驱动
2.Connection con = ManagerDriver.getConnection(........................)返回一个连接对象
3.连接对象con调用 PrepareStstement ps =con.PrepareStatement(sql)方法获得执行sql的对象需要先传入sql
4.对sql中占位符进行赋值 ps .set类型(序号,值)
5.PrepareStatement对象ps调用增删改查方法 返回值 int ResultSet 等 方法:executeQuery()查询 executeUpdate()增删改
6.关闭资源
JDBC提供的接口:
1.DriverManger(类):驱动接口
2.Connection(接口): 连接数据库
3.Statement(接口): 执行sql-----------------------------》PrepareStatement
4.ResultSet(接口):查询结果的接口
1 . Class.forname("com.sql.jdbc.Driver ")加载驱动 2. DriverManager.getCollection(" ") 返回值为Collection 对象
连接数据库的基本步骤:
jdbc所有的类和接口都是sql包下
1.加载驱动:反射加载驱动
Class.forName("com.mysql.jdbc.Driver");
2.获得连接对象 :返回的是Connection接口对象(DriverManager驱动管理类)
url:jbdc:使用jdbc来连接 -(主协议)- mysql -(子协议) -连接数据库的ip地址- 数据库端口号- 数据库名称
-数据库编码格式 数据库用户名 密码 (jdbc:mysql:///day03_db):另一种写法
Collection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/
day08?characterEncoding=utf-8","root","root");
3.得到执行sql的对象:connection对象调用createStatement方法创建执行sql的对象
Statement sta = con.createStatement();
4.获取结果集:执行sql对象调用executeUpdate方法 只能增删改不能查 返回值int 是影响的行数
executeQuery方法用于查询 返回值为迭代器
1. 迭代器获取值 get~(列number)
2. get~(列名)
String str ="insert into student (sname) values ('占山')";
int a = sta.executeUpdate(str);
5.关闭资源
idea:
1.创建文件夹lib
2.将jar包拷入lib中
3.将jar包添加依赖
使用junit测试
创建测试类
创建方法 不能有返回值 必须public
@test
jdbc中sql语句拼接:··String str = "select * from student where sname= '"+uname+" ' "+ " and spwd='"+upwd+"'";
字符串拼接: sql注入问题
PrepareStatement extens Statment :解决
使用占位符?
1.反射加载驱动 2. DriverMaganer调用getConnection方法来获得数据库连接对象
3.数据库连接对象调用prepareStatement方法需要传入sql语句 返回一个PrepareStatement对象 ,该对象调用set+类型方法传入占位符的值
需要在执行sql语句前给占位符赋值 ,PrepareStatement对象调用增删改查方法 executeQuery executeUpdate 返回相应 类型的值。
Statemen和PrepareStatement
1.前者是后者的父类
2.后者解决父类sql注入问题 安全性高
3.后者封装前者 执行效率高
4.代码可读性高
//jdbc实现数据库的增删改查
package com.offcn.day08;
import org.junit.Test;
import java.sql.*;
public class Test05 {
//增加
@Test
public void add(){
int a = 0;
try {
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/day08?characterEncoding=utf-8",
"root","root");
String str = "insert into student(sname,spwd)values(?,?)";
PreparedStatement ps= con.prepareStatement(str);
ps.setString(1,"占山");
ps.setString(2,"123456");
a = ps.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(a);
}
//修改
@Test
public void update(){
int b = 0;
try {
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/day08?characterEncoding=utf-8",
"root","root");
String str = "update student set sname=? , spwd=? where sid=? ";
PreparedStatement ps = con.prepareStatement(str);
ps.setString(1,"刘备");
ps.setString(2,"11111");
ps.setInt(3,1);
b = ps.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(b);
}
//查询
@Test
public void select(){
try {
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/day08?characterEncoding=utf-8",
"root","root");
String str = "select * from student limit ?,? ";
PreparedStatement ps = con.prepareStatement(str);
ps.setInt(1,2);
ps.setInt(2,5);
ResultSet rs = ps.executeQuery();
while(rs.next()){
String sname = rs.getString("sname");
String spwd = rs.getString("spwd");
System.out.println( "用户名:"+sname +"密码:"+spwd);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
//删除
@Test
public void delete(){
int a = 0;
try {
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/day08?characterEncoding=utf-8",
"root","root");
String str = "delete from student where sid =? ";
PreparedStatement ps = con.prepareStatement(str);
ps.setInt(1,5);
a = ps.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
if(a>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
}
}
Perproites工具类:工具类使用单例模式 私有构造 私有属性 公有方法
public class PropertiesUtils {
private static PropertiesUtils propertiesUtils;
private Properties pro ;
//私有构造.....加载properities文件
private PropertiesUtils (){
try {
FileInputStream fis =new FileInputStream("database.properties");
pro = new Properties();
pro.load(fis);
} catch (IOException e) {
e.printStackTrace();
}
}
//提供对外方法 提供对象
public static synchronized PropertiesUtils getPropertiesUtils(){
if(propertiesUtils==null){
synchronized (PropertiesUtils.class) {
if(propertiesUtils==null){
propertiesUtils =new PropertiesUtils();
}
}
}
return propertiesUtils;
}
//通过键获得properites文件的键值对
public String getValue(String key){
return pro.getProperty(key);
}
}