海阔天空

当前时间为:
欢迎大家来到海阔天空https://www.9713job.com,广告合作以及淘宝商家推广请微信联系15357240395

2020Javaweb教程之JDBC应用

未分类
2020-10-15 15:06:03
1822677238@qq.com

手机扫码查看

2020Javaweb教程之JDBC应用

2020Javaweb教程之JDBC应用

封装工具类:

1.重用性方案

package Utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class DBUtils {



    private static Connection connection=null;
    private static String url="jdbc:mysql://localhost:3306/demo2";
    private static String username="root";
    private static String password="root";
    //类加载触发 注册驱动
    static{
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch (Exception e){}
    }
    //获取connection连接对象
    public static Connection getConnection(){
        try{
            connection= DriverManager.getConnection(url,username,password);
            return  connection;
        }catch (Exception e){}
        return null;
    }
    //释放资源
    public static void closeAll(ResultSet rs, Statement s,Connection c){
        try{
            if (rs != null) {
                rs.close();
            }
            if (s != null) {
                s.close();
            }
            if (c != null) {
                c.close();
            }
        }catch (Exception e){}
    }
}

2.跨平台方案

db.properties配置文件:

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf-8
username=root
password=1234
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=5000
工具类
package Utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

public class DBUtils {
    private static Connection connection=null;
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    //类加载触发 注册驱动
    static{
        try{
            Properties properties=new Properties();
            properties.load(DBUtils.class.getClassLoader().getResourceAsStream("database.properties"));
            driver=properties.getProperty("driver");
            url= properties.getProperty("url");
            username=properties.getProperty("username");
            password=properties.getProperty("password");
            Class.forName(driver);
        }catch (Exception e){}
    }
    //获取connection连接对象
    public static Connection getConnection(){
        try{
            connection= DriverManager.getConnection(url,username,password);
            return  connection;
        }catch (Exception e){}
        return null;
    }
    //释放资源
    public static void closeAll(ResultSet rs, Statement s,Connection c){
        try{
            if (rs != null) {
                rs.close();
            }
            if (s != null) {
                s.close();
            }
            if (c != null) {
                c.close();
            }
        }catch (Exception e){}
    }
}

ResultSet查询封装

ORM(Object Relational Mapping) 实体类(entity):零散数据的载体

从ResultSet中get相应的字段值后调用实体对象的对应的属性的set方法,把值保存在实体对象中。

实体类:包名entity,类名为表名且首字母大写,如类名user,类名为User
包含属性、构造方法和set/get方法以及toString()方法

import Utils.DBUtils;
import entity.Student;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class TestDql {
    public static void main(String[] args) {
        Connection connection=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        List<Student> list=new ArrayList<Student>();
        try{
            connection=DBUtils.getConnection();
            String sql="select*from student";
            ps=connection.prepareStatement(sql);
            rs=ps.executeQuery();
            while (rs.next()) {
                int sid = rs.getInt(1);
                String sname = rs.getString(2);
                int sage = rs.getInt(3);
                String ssex = rs.getString(4);
                Date birthday = rs.getDate(5);
                double score = rs.getDouble(6);
                Student s=new Student();
                s.setSid(sid);
                s.setSname(sname);
                s.setSage(sage);
                s.setSsex(ssex);
                s.setBirthday(birthday);
                s.setScore(score);
                list.add(s);
                System.out.println(s);
            }
        }catch (Exception e){}finally {
            DBUtils.closeAll(rs,ps,connection);
        }
    }
}

DAO模式

工具类封装:实现对表的增删改查

DAO设计模式

DAO(Database Access Object)数据库访问对象

为了降低耦合性,提出了DAO封装数据库操作的设计模式。实现业务逻辑与数据库访问相分离

DAO模式的组成部分

1.DAO接口:增删改查
2.DAO实现类
3.实体类:entity
4.数据库连接和关闭工具类

包名:
entity实体类、utils工具类、dao存放接口、dao.impl 存放实现类、service业务层接口、service.impl业务实现、view视图层

使用DAO设计模式实现对表的 增删改查

实体类entity:User
私有属性、构造方法、set/get方法、toString()方法

接口dao:UserDao
查询所有:List<User> findAll();
查询单个:User getUser(int id);
新增数据:void add(User u);
删除数据:void delete(int id);
修改数据:void update(User u);

接口实现类:UserDaoImpl
实现UserDao接口,重写接口方法,执行DML语句以及DQL

业务层接口service:UserService
接口方法与DAO层一致

业务层实现类:UserServiceImpl
创建UserDao接口对象引用UserDaoImpl实现类对象:
private UserDao userdao=new UserDaoImpl();
方法返回值 是 userdao.方法名

视图层view:展示菜单

import DAO.StudentDao;
import DAO.impl.StudentDaoIimpl;
import entity.Student;
import java.text.*;
import java.util.*;

public class View {
    private static StudentDao sd=new StudentDaoIimpl();
    private static Scanner sc=new Scanner(System.in);
    public static void main(String[] args) {
        System.out.println("1.查看所有学生信息 2.查看指定学生信息 3.新增学生信息\n 4.删除指定学生信息 5.修改指定学生信息");
        System.out.println("请选择你要的操作");
        int n=sc.nextInt();
        switch (n){
            case 1:showAll();
            break;
            case 2:getId();
            break;
            case 3:add();
            break;
            case 4:delete();
            break;
            case 5:update();
            break;
            default:break;
        }
    }
    public static void showAll(){
        List<Student> all = sd.findAll();
        for (Student student : all) {
            System.out.println(student);
        }
    }
    public static void getId(){
        System.out.println("请输入你要查询的学生编号");
        int id=sc.nextInt();
        System.out.println(sd.getStudent(id));
    }
    public static void add(){
        Student s = info();
        int add = sd.add(s);
        if(add>0) System.out.println("新增成功");
        else System.out.println("新增失败");
    }
    public static void delete(){
        System.out.println("请输入学生编号");
        int n=sc.nextInt();
        int delete = sd.delete(n);
        if(delete>0) System.out.println("删除成功");
        else System.out.println("删除失败");
    }
    public static Student info() {
        Student s=null;
        System.out.println("请输入姓名");
        String sname=sc.next();
        System.out.println("请输入年龄");
        int sage=sc.nextInt();
        System.out.println("请输入性别");
        String ssex=sc.next();
        System.out.println("请输入生日,如19951113");
        String birthday=sc.next();
        System.out.println("请输入成绩");
        double score=sc.nextDouble();
        String s1 = birthday.substring(0,4);
        String s2 = birthday.substring(4, 6);
        String s3 = birthday.substring(6,8);
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        Date date= null;
        try {
            date = sdf.parse(s1+"-"+s2+"-"+s3);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        s=new Student();
        s.setSname(sname);
        s.setSage(sage);
        s.setSsex(ssex);
        s.setBirthday(date);
        s.setScore(score);
        return s;
    }
    public static void update(){
        Student s = info();
        System.out.println("请输入要更改的学生编号");
        int sid=sc.nextInt();
        s.setSid(sid);
        int update = sd.update(s);
        if(update>0) System.out.println("修改成功");
        else System.out.println("修改失败");
    }
}

Druid连接池

为什么要使用连接池?

用户每次请求都需要向数据库获得连接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、宕机。
现流行的有:DBCP、C3P0、Druid等

Druid连接池简介:

Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。

Druid连接池五大特点:

1.亚秒级查询
druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。

2.实时数据注入
druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性

3.可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性

4.多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,kafka,storm和samza等

5.丰富的社区
druid拥有丰富的社区,供大家学习

使用Druid连接池:

package Utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.sql.*;
import java.util.Properties;

public class DBUtils{
    private static DruidDataSource dataSource;
    static{
        Properties properties=new Properties();
        try {
            properties.load(DBUtils.class.getClassLoader().getResourceAsStream("database.properties"));
            dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static DruidDataSource getDataSource(){
        return dataSource;
    }
    public static void closeAll(ResultSet rs, Statement s, Connection c){
        try{
            if (rs != null) {
                rs.close();
            }
            if (s != null) {
                s.close();
            }
            if (c != null) {
                c.close();
            }
        }catch (Exception e){}
    }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注