声微饭否

博客园 首页 新随笔 联系 订阅 管理

  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);
}
}

 
posted on 2020-08-05 11:51  声微饭否  阅读(111)  评论(0编辑  收藏  举报