• JDBC(一)


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

     
  • 相关阅读:
    Http接口安全设计
    RTMP服务器搭建(nginx+rtmp)
    OSI七层协议详解
    TCP协议的3次握手与4次挥手过程【深度详解】
    new和delete的深层次剖析(C++)
    大小端模式详解
    MP4文件格式分析及分割实现(附源码)
    使用HBuilder将H5的项目打包成手机可安装的webapp程序(.apk)
    Centos7 解决odoo10打印条形码显示方框乱码的问题
    linux 中运行Django项目
  • 原文地址:https://www.cnblogs.com/frhl/p/13438877.html
Copyright © 2020-2023  润新知