3.27~4.2——jdbc,Dao模式和多线程

目录

 1. jdbc

1.1 什么是jdbc

1.2 怎样使用jdbc和数据库建立连接

1.3 Statemen类

1.4 jdbc工具类

2. Dao模式

3.多线程

3.1 线程简介

3.2 如何创建线程

3.3 线程的常用方法

3.4 线程的状态

3.5 线程同步


 1. jdbc

1.1 什么是jdbc

JDBC( Java DataBase Connectivity ) 称为 Java数据库连接 ,它是一种用于数据库访问的应用程序 API ,由一组用Java语言编写的类和接口组成,有了JDBC就可以 用统一的语法对多种关系数据库进行访问,而不用担心其数据库操作语言的差异 。

jdbc本质其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。

1.2 怎样使用jdbc和数据库建立连接

首先需要了解建立连接的几个要素:

Driver接口,DriverManager类,url,用户名和密码,Connection类

        Driver接口是所有数据库驱动程序需要实现的接口,这个接口是提供给数据库厂商使用的,不同的数据库厂商提供不同的实现。

        DriverManager类是管理驱动的类,在程序中不需要去访问实现了Driver接口的类,而是由驱动程序管理器类DriverManager来调用这些类实现连接的。

        url是要要交互的数据库的地址

        用户名和密码是数据库的用户名和密码

        Connection是连接类,在java中万物皆对象,连接也可以是一个对象,通过连接对象,我们可以对数据库进行操作。

使用jdbc和数据库建立连接的步骤:

1.要加载驱动,其作用就是告诉该程序要使用哪个数据库驱动jar包(mysql5之后的驱动包可以省略该步骤)

2.获取连接对象:

        Connection connection = DriverManager.getConnection(url,用户名,密码);

1.3 Statemen类

建立连接后要通过Statement类来对数据库进行操作。

首先要获取一个Statement类对象,这里我们一般使用两种办法创建Statement对象:

1. Statement statement1 = connection.createStatement();

2, Statement statement2 = connection.preparedStatement();

statement1用于执行不带参数的的简单sql语句,每次执行sql语句,数据库都要执行sql语句的编译,仅执行一次查询并返回结果的情况建议使用这个,此时效率高于preparedStatement

        注:使用statement1执行sql语句可能会出现注入式攻击

statement2用于执行带参或者不带参数的sql语句,它是预编译执行的,在执行可变参数的一条 sql语句时,比 statement1 的效率高,安全性好,可以有效防止 SQL 注入等问题,对于多次重复执行的语句,效率会更高

Statement对象常用方法:

        executeQuery(String sql) 用于向数据发送查询语句。

                注:execuQuery()会返回一个ResultSet结果集

        executeUpdate(String sql) 用于向数据库发送insert、update或delete语句

        execute(String sql) 用于向数据库发送任意sql语句

        addBatch(String sql) 把多条sql语句放到一个批处理中。

        executeBatch() 向数据库发送一批sql语句执行。

        clearBatch() 将批处理中的sql语句清除;

PreparedStatement独有的方法:setObject()放置参数

1.4 jdbc工具类

因为我们需要经常对一个数据库进行操作,所以可以写一个jdbc工具类,用的时候调用即可。

jdbc工具类包括静态常量属性,静态代码块,静态方法

静态常量属性是经常要用到的常量属性:url,用户名和密码

静态代码块是加载配置文件Properties里的内容的。url,用户名密码都在配置文件中,配置文件Properties继承了Hashtable类,里面的内容都是以键值对形式存在的。

//    加载属性文件:只需要执行1次
    static {
//        Map接口的实现类,存储键值对
        Properties properties = new Properties();
        try {
//            类名.class.getClassLoader():获取到字节码对应的的类加载器
//            getResourceAsStream():将读取到的资源文件转换为字节流
            InputStream inputStream = DbHelper.class.getClassLoader().getResourceAsStream("db.properties");
            properties.load(inputStream);//加载文件
            url = properties.getProperty("url"); //根据属性名获取属性值
            user = properties.getProperty("user"); //根据属性名获取属性值
            pwd = properties.getProperty("pwd"); //根据属性名获取属性值
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

静态方法包括:

        获取连接对象, 关闭连接, 查询方法, 增删改方法

2. Dao模式

DAO (DataAccessobjects 数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。

一个经典的Dao模式由以下几部分组成:

1. DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。

2. DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。

3. 实体类:用于存放与传输对象数据。

4. 数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,方便修改。

3.多线程

3.1 线程简介

进程:进程是正在运行的程序,每个进程都有独立的内存空间

线程;线程是进程中最小的调度单元,一个进程有多个线程,他们共享cpu的计算资源

并发:在同一时间间隔内有多个线程运行

并行:在同一时刻同时有多个线程运行

        java的多线程指的是并发

3.2 如何创建线程

1. 继承Thread类,重写run方法

2. 实现Runable接口,实现run方法

3. 实现Callable接口

public class MyCall implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("线程在执行的任务");
        return Thread.currentThread().getName();
    }

    public static void main(String[] args) {
//        创建Callable接口的实例
        MyCall myCall=new MyCall();
//       FutureTask 实例
        FutureTask<String> task=new FutureTask<>(myCall);
        Thread thread=new Thread(task);
        thread.start();
    }
}

使用场景:

        如果有返回值:实现Callable接口

        实现Runable接口的线程,可以被共享

3.3 线程的常用方法

静态方法:

        sleep()线程阻塞一段时间, yield()线程从运行状态恢复为就绪状态

        join()将当前线程放入执行队列,当前线程优先执行,其他线程阻塞

实例方法:

        setName()给线程取名, getName()获取线程名字

        setPriority()给线程设置优先级, getPriority得到线程的优先级

3.4 线程的状态

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

阻塞的情况分三种:

         (一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁)

        (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

        (三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。(注意,sleep是不会释放持有的锁)

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期

3.5 线程同步

线程同步:当一个线程在对内存进行操作的时候,其他线程都不可以对这个内存地址进行操作,知道该线程的操作完成,其他线程才能对该内存进行操作。

线程同步的利弊:

好处:解决了多线程时的数据安全问题;

        多线程的数据安全问题:

弊端:当用同一个锁的线程很多的时候,每个线程都会去判断这个锁的状态,效率低

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值