Jdbc入门

Posted 小布丁value

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jdbc入门相关的知识,希望对你有一定的参考价值。

Jdbc入门

Jdbc本质(一套接口)

1.jdbc 是什么?

Java DataBase Connectivity(Java语言连接数据库)

2.jdbc的本质是什么?

jdbc是sun 公司指定的一套接口。 接口都有调用者和实现者。
面向接口调用、面向接口写实现类,这都属于面向接口编程。
接i都有调用者和实现者。 面向接口调用、面向接口写实现类,这都属于面向接口编程。

思考:为什么sun公司要制定一套jdbc接口呢?
因为每一个数据库的实现原理都不一样。
Oracle有自己的实现原理。
mysql也有自己的实现原理。
MysqlServer也有自己的实现原理。
。。
每一个数据库都有自己独特的实现原理

3. JDBC体系结构

JDBC接口(API)包括两个层次︰
1.面向应用的API : JavaAPI,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。

2.面向数据库的API: Java Driver API,供开发商开发数据库驱动程序用。

JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。
不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。

4.JDBC编程六步(需要背会)

第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示Java的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要)第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行sql语句(DQLDML…)
第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)
第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)

5.获取数据库连接的方法

方法一:

 @Test
    public void testConnection1() throws SQLException
        Driver driver=new com.mysql.cj.jdbc.Driver();
        //url:http://localhost:8080/gmall/keyboard.jpg
        //jdbc:mysql协议
        //localhost:ip地址
        //3306:默认mysql的端口号
        //mybatis:mybatis的数据库
      //注册驱动:告诉Java程序,即将要连接的是哪个品牌的数据库
        String url="jdbc:mysql://localhost:3306/mybatis";
        //获取连接:表示java进程和数据库进程之间的通道打开了,这属于进程之间的通信
        //将用户名和密码封装在Properties中
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","");
        Connection conn=driver.connect(url,info);
        System.out.println(conn);
    

方法二:

//方式二:对方式一的迭代
    @Test
    public void testConnection2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException 
       //获取Driver实现类对象,使用反射
        Class<?> aClass = Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver=(Driver)aClass.newInstance();
        String url="jdbc:mysql://localhost:3306/mybatis";
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","");
        Connection conn=driver.connect(url,info);
        System.out.println(conn);
    
 //方式三:使用DriverManage替换Driver
    @Test
    public void testConnection() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException 
        //1.获取Driver的实现类对象
        Class<?>  clazz = Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver=(Driver)clazz.newInstance();
        //2.提供另外三个连接的基本信息
        String url="jdbc:mysql://localhost:3306/mybatis";
        String user="root";
        String password="";

        //注册驱动
        DriverManager.registerDriver(driver);
        //获取连接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);

    
//方法四:可以只是加载驱动,不用显示的注册驱动
    @Test
    public void testConnection4() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException 
        //2.提供另外三个连接的基本信息
        String url="jdbc:mysql://localhost:3306/mybatis";
        String user="root";
        String password="";
        //1.获取Driver的实现类对象
        Class.forName("com.mysql.cj.jdbc.Driver");
//        Driver driver=(Driver)clazz.newInstance();
        //注册驱动
//        DriverManager.registerDriver(driver);
        //为什么可以省略上述操作呢?
        /*
        * 在mysql的Driver实现类中,声明了如下操作
        *  static 
        try 
            DriverManager.registerDriver(new Driver());
         catch (SQLException var1) 
            throw new RuntimeException("Can't register driver!");
        
      
        *
        *
        * */
        //获取连接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);

    

JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别?
复习反射的三种 类加载器
https://www.cnblogs.com/yjl49/archive/2012/08/08/2628502.html
Properties类总结https://blog.csdn.net/yelang0/article/details/76449165

方式五:(复习)

/方式五:将数据库连接需要的四个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接

    @Test
    public void testConnection5() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException, IOException 
       //1.读取配置文件的四个基本信息
        InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties pros = new Properties();
        pros.load(is);
        String user=pros.getProperty("user");
        String password=pros.getProperty("password");
        String url=pros.getProperty("url");
        String driver=pros.getProperty("driver");
        //2.加载驱动
        Class.forName(driver);
        //3.获取连接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);
        
    

如果出现空指针异常,有可能是properties的存放位置不对。

ser=root
password=
url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
driver=com.mysql.cj.jdbc.Driver

导入driver驱动

注意:每新建一个moudle建立数据库连接的时候都要执行这三步

5.1精简版(复习)

1.获取数据库连接核心代码两步:

1.注册驱动 注意Class.forName().newInstance()的使用

  //注册驱动
        DriverManager.registerDriver(driver);

2.获取连接

//获取连接
        Connection connection = DriverManager.getConnection(url, user, pwd);
        if(connection!=null)
            System.out.println("连接成功");
        

3.运行

import org.junit.Test;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @description:使用DriverManager获取数据库连接
 * @author: Ada
 * @time: 2022/3/14
 */
public class MyConnectionTest 
    @Test
    public void test() throws Exception 
        //com.mysql.cj.jdbc.Driver driver = new com.mysql.cj.jdbc.Driver();
        Driver driver = (Driver)Class.forName("com.mysql.cj.jdbc.Driver").newInstance();

        //注册驱动
        DriverManager.registerDriver(driver);

        String url="jdbc:mysql://localhost:3306/mybatis";
        String user="root";
        String pwd="";


        //获取连接
        Connection connection = DriverManager.getConnection(url, user, pwd);
        if(connection!=null)
            System.out.println("连接成功");
        
    


6.使用Statement的弊端

需要拼写sql语句,并且存在SQL注入的问题
三个判断,最后while 1=1是true.
//如歌避免sql注入,使用PrepareStatement(从Statement扩展而来)取代Statement

7.使用PrepareStatement实现增删改查

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.Channel;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

/*
*
* 使用PreparedStatement来替换Statement,实现对数据表的增删改查操作
*
* */
public class PreparedStatementUpdateTest 
    @Test
    public void testConnection5() throws Exception 
        PreparedStatement ps= null;
        Connection conn=null;

        try 
            //1.读取配置文件的四个基本信息
            InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
            Properties pros = new Properties();
            pros.load(is);
            String user=pros.getProperty("user");
            String password=pros.getProperty("password");
            String url=pros.getProperty("url");
            String driver=pros.getProperty("driver");
            //2.加载驱动
            Class.forName(driver);
            //3.获取连接
             conn = DriverManager.getConnection(url, user, password);
            //4.预编译sql语句,返回PreparedStatement实例
            String sql="insert into user(id,name,pwd)values(?,?,?)";
            ps = conn.prepareStatement(sql);
            //5.填充占位符
            ps.setInt(1,4);
            ps.setString(2,"王红");
            ps.setString(3,"345678");
            //6.执行sql
            ps.execute();
         catch (Exception e) 
            e.printStackTrace();
         finally
            //7.资源的关闭
            try 
                if(ps!=null)
                ps.close();
             catch (SQLException e) 
                e.printStackTrace();
            

            try 
                if(conn!=null)
                conn.close();
             catch (SQLException e) 
                e.printStackTrace();
            
        
    




补充知识点:idea设置类注释和方法注释
https://blog.csdn.net/weixin_39911998/article/details/114114030?
易错点:
1.如果出现乱码,在properties属性文件中的url后面添加
?characterEncoding=UTF-8设置一下字符集
实现通用的增删改查操作
为什么有些String需要加双引号而有些不需要

双引号表示字符串
比如
定义 int a(string s)
调用时可以 a(“asdas”)
“asdas”就表示一个字符串
当然也可以
string str=“asdasd”
a(str)这样使用

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.Channel;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

/*
*
* 使用PreparedStatement来替换Statement,实现对数据表的增删改查操作
*
* */
public class PreparedStatementUpdateTest 
    //修改customers表的一条记录
    @Test
    public void testUpdate() 
        PreparedStatement ps= null;
        Connection conn=null;

        //1.获取数据库的连接
        try 
            conn = JDBCutils.getConnection();
            //2.预编译sql语句,返回PreparedStatement的实例
             String sql ="update user set name = ? where id = ? ";
             ps = conn.prepareStatement(sql);
            //3.填充占位符
            ps.setString(1,"莫扎特");
            ps.setInt(2,2);
            //4.执行
            ps.execute();
            //5.资源的关闭
            JDBCutils.closeResource(ps,conn);
         catch (Exception e) 
            e.printStackTrace();
        finally 
            try 
                if(conn!=null)
                conn.close();
             catch (SQLException e) 
                e.printStackTrace();
            
            try 
                if(ps!=null)
                ps.close();
             catch (SQLException e) 
                e.printStackTrace();
            
        
    

    @Test
    public void testConnection5() throws Exception 
        PreparedStatement ps= null;
        Connection conn=null;

        try 
            //1.读取配置文件的四个基本信息
            InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
            Properties pros = new Properties();
            pros.load(is);
            String user=pros.getProperty("user");
            String password=pros.getProperty("password");
            String url=pros.getProperty("url");
            String driver=pros.getProperty("driver");
            //2.加载驱动
            Class.forName(driver);
            //3.获取连接
             conn = DriverManager.getConnection(url, user, password);
            //4.预编译sql语句,返回PreparedStatement实例
            String sql="insert into user(id,name,pwd)values(?,?,?)";
            ps = conn.prepareStatement(sql);
            //5.填充占位符
            ps.setInt(1,4);
            ps.setString(2,"王红");
            ps.setString(3,"345678");
            //6.执行sql
            ps.execute();
         catch (Exception e) 
            e.printStackTrace();
         finally
            //7.资源的关闭
            try 
                if(ps!=null)
                ps.close();
             catch (SQLException e) 
                e.printStackTrace();
            

            try 
                if(conn!=null)
                conn.close();
             catch (SQLException e) 
                e.printStackTrace();
            
        
    

实现通用的增删改查

public class PreparedStatementUpdateTest  
    @Test
    public void testCommonUpdate()
        String sql="delete from user where id=?";
        update(sql,4);
    
    //通用的增删改查操作
    public void update(String sql,Object ...args)
        Connection conn=null;
        PreparedStatement ps=null;
        //1.获取数据库连接
        try 
           conn = JDBCutils.getConnection();
            //2.预编译sql语句,返回PreparedStatement的实例
           ps = conn.prepareStatement(sql);
            //3.填充占位符
            for(int i=0;i<args.length;i++)
                ps.setObject(i+1,args[i]);
            
            //4.执行
            ps.execute();
         catch (Exception e) 
            e.printStackTrace();
         finally 
            //关闭资源
            JDBCutils.closeResource(ps,conn);
        
    

Java与SQL对应数据类型转换表

7.1查

以上是关于Jdbc入门的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis教程之一基本使用入门

javascript 中 - 反应“子组件” - 文章子组件已满

Spring JDBC入门

JDBC超详细入门教程

JDBC——入门知识

《Java从入门到放弃》入门篇:hibernate基本配置