一、JDBC编程六步骤(重点)

整个项目只需做一次

  1. 项目中新增一个lib目录
  2. 在lib目录中添加mysql对应版本的jar包
  3. 将jar包作为仓库添加到当前项目中

每个类中需要做的操作

1. Class.forName();注册驱动- mysql5:com.mysql.jdbc.Driver- mysql8:com.mysql.cj.jdbc.Driver
2. Connection conn = DriverManager.getConnection(url, user, pass);//使用DriverManager对象的getConnection()方法获取数据库的连接对象1. url代表连接的是哪台主机的哪个端口的哪个数据库2. user以哪个用户来访问3. pass是user的密码
3. String sql = "insert/update/delete   or select";  //创建SQL语句
4. Statement stmt = conn.createStatement();      //使用sql语句作为参数放在conn的createStatement()方法中创建Statement对象
5. 执行sql语句,- stmt.executeUpdate(sql);执行增删改的dml语句,返回的结果为受影响的行数int值- stmt.executeQuery(sql);执行查询操作dql语句,返回的是结果集对象ResultSet
6. 关闭资源1. 关闭ResultSet(如果有的话)2. 关闭Statement对象3. 关闭Connection对象

二、JDBC代码块

 * Created by .*/
public class TestJDBC {public static void main(String[] args) {Connection conn = null;Statement stmt = null;ResultSet rs = null;try {//  注册驱动,mysql5与mysql8的区别Class.forName("com.mysql.jdbc.Driver");//  使用DriverManager的静态方法getConnection(url, username, password)创建一个连接对象,//  使用该连接对象就可以用java来访问数据库conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/school?serverTimezone=UTC&characterEncoding=UTF-8","school", "123456");//  编写sql语句String sql = "select * from tb_group";//  使用Connnection对象的createStatement()方法创建一个Statement对象stmt = conn.createStatement();//  使用Statement对象的executeQuery(sql)将sql语句作为参数放入执行方法中进行sql语句的执行//      如果sql语句是查询,则返回的是结果集ResultSet//      如果sql预计是增删改,则返回的是受影响的行数int值rs = stmt.executeQuery(sql);//  对于结果集进行遍历,next()方法可以实现游标的下移while (rs.next()){//  通过结果集对象的getXXX()方法来获取结果集中每一行的数据//      getXxx(index),int类型的索引,下标从1开始,代码简单//      getXxx(columnLable), 字符串类型的类别,可读性更高System.out.println(rs.getInt(1) + "\t" + rs.getString(2)+ "\t" + rs.getString(3));}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();} finally {//  资源的管理//  先开的后关,后开的先关try {if(rs != null){rs.close();rs = null;}if(stmt != null){stmt.close();stmt = null;}if(conn != null){conn.close();conn = null;}} catch (SQLException throwables) {throwables.printStackTrace();}}}
}

三、DBUtil将代码块分层

包的层次划分:

**

dao:数据访问对象,跟数据库相关的操作都可以放在此包下。 dao.impl:dao的实现类,完成对dao接口的所有方法的实现。 entity:实体类所在的包,包中的类要与数据库中的表对应,包括属性名和字段名。 util:工具包,里面放置各种工具。 test:对应各个类进行测试。

util.DButil

package util;import java.sql.*;public class DButil {private static Connection conn = null;//将注册驱动放入静态代码中以提高连接的速度static {try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}//获取连接的对象public static Connection getConnection(){try {conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/school?useSSL=true&serverTimezone=UTC&characterEncoding=UTF-8","school","123456");} catch (SQLException e) {e.printStackTrace();}return conn;}//关闭连接资源public static void closeConnection(ResultSet rs,Statement stmt,Connection conn) throws SQLException {if(rs!=null){rs.close();rs=null;}if(stmt!=null){stmt.close();stmt=null;}if(conn!=null){conn.close();conn=null;}}
}

entity.Student

package entity;public class Student {private int sno;private String sname;private String ssex;private String sbirthday;private int cls;public Student(int sno, String sname, String ssex, String sbirthday, int cls) {this.sno = sno;this.sname = sname;this.ssex = ssex;this.sbirthday = sbirthday;this.cls = cls;}public Student() {}public int getSno() {return sno;}public void setSno(int sno) {this.sno = sno;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getSsex() {return ssex;}public void setSsex(String ssex) {this.ssex = ssex;}public String getSbirthday() {return sbirthday;}public void setSbirthday(String sbirthday) {this.sbirthday = sbirthday;}public int getCls() {return cls;}public void setCls(int cls) {this.cls = cls;}@Overridepublic String toString() {return "student{" +"sno=" + sno +", sname='" + sname + '\'' +", ssex='" + ssex + '\'' +", sbirthday='" + sbirthday + '\'' +", cls=" + cls +'}';}
}

**

dao.IStudentDao

package dao;import entity.Student;import java.sql.SQLException;
import java.util.List;public interface IStudentDao {//分页查询,满足所有规则的student对象所组成的List集合List<Student> getStudentByPage(int cp,int ps);//查询所有的student对象封装到一个list集合中List<Student> getAllStudents() throws SQLException;//根据Sno得到一个student对象Student getStudentBySno(int sno) throws SQLException;//向数据库中添加一个新的student对象int addStudent(Student student) throws SQLException;//在数据库中修改某条记录int updateStudent(Student student) throws SQLException;//根据sno删除某条记录void delStudent(int sno) throws SQLException;}

**

dao.impl.StudentDaoImpl

package dao.impl;import dao.IStudentDao;
import entity.Student;
import util.DButil;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;public class StudentDaoImpl implements IStudentDao {Connection conn = null;Statement stmt = null;ResultSet rs = null;@Overridepublic List<Student> getStudentByPage(int cp, int ps) {List<Student> list = null;conn = DButil.getConnection();int si = (cp-1)*ps;String sql = String.format("select * from student limit %d,%d",si,cp);//创建statement对象try {stmt = conn.createStatement();//执行sql语句rs = stmt.executeQuery(sql);if(rs!=null){list = new ArrayList<>();Student student = null;while (rs.next()){//获取student对象student = new Student(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getInt(5));//将student对象放入集合中list.add(student);}}} catch (SQLException e) {e.printStackTrace();}finally {try {DButil.closeConnection(rs,stmt,conn);} catch (SQLException e) {e.printStackTrace();}}return list;}@Overridepublic List<Student> getAllStudents() throws SQLException {List<Student> list = null;//创建连接对象conn = DButil.getConnection();//创建sql语句String sql = " select * from student";try {//创建Statement对象stmt = conn.createStatement();//执行sql语句rs = stmt.executeQuery(sql);if(rs!=null){list = new ArrayList<>();Student student = null;while (rs.next()){student = new Student(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getInt(5));list.add(student);}}} catch (SQLException e) {e.printStackTrace();}finally {DButil.closeConnection(rs,stmt,conn);}return list;}@Overridepublic Student getStudentBySno(int sno) throws SQLException {Student student = null;conn = DButil.getConnection();String sql = String.format(" select * from student where sno = %d",sno);//创建statement对象try {stmt = conn.createStatement();//执行sql语句rs = stmt.executeQuery(sql);while (rs.next()){student = new Student(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4), rs.getInt(5));}} catch (SQLException e) {e.printStackTrace();}finally {DButil.closeConnection(rs,stmt,conn);}return student;}@Overridepublic int addStudent(Student student) throws SQLException {int i = 0;conn = DButil.getConnection();String sql = String.format("insert into student (sno,sname,ssex,sbirthday,cls) " ,"values (%d,%s,%s,%s,%d)",student.getSno(),student.getSname(),student.getSsex(),student.getSbirthday(),student.getCls());try {stmt = conn.createStatement();i = stmt.executeUpdate(sql);} catch (SQLException e) {e.printStackTrace();}finally {DButil.closeConnection(rs,stmt,conn);}return i;}@Overridepublic int updateStudent(Student student) throws SQLException {int i = 0;conn = DButil.getConnection();String sql = String.format("update student set sname = '%s',ssex= '%s',sbirthday ='%s',cls = %d, where sno = %d",student.getSname(),student.getSsex(),student.getSbirthday(),student.getCls(),student.getSno());try {stmt = conn.createStatement();i = stmt.executeUpdate(sql);} catch (SQLException e) {e.printStackTrace();}finally {DButil.closeConnection(rs,stmt,conn);}return i;}@Overridepublic void delStudent(int sno) throws SQLException {conn = DButil.getConnection();String sql = String.format("delete from student where sno = %d",sno);try {stmt = conn.createStatement();stmt.executeUpdate(sql);} catch (SQLException e) {e.printStackTrace();}finally {DButil.closeConnection(rs,stmt,conn);}}
}

**

test.TestStudentDaoImpl

package test;import dao.IStudentDao;
import dao.impl.StudentDaoImpl;
import entity.Student;
import org.junit.Test;import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class StudentDaoImplTest {IStudentDao iStudentDao = new StudentDaoImpl();List<Student> list = new ArrayList<>();Student student = new Student();@Testpublic void getStudentByPage(){list = iStudentDao.getStudentByPage(1,5);for (Student student1 : list) {System.out.println(student1);}}@Testpublic void getAllStudent() throws SQLException {list = iStudentDao.getAllStudents();for (Student student2 : list) {System.out.println(student2);}}@Testpublic void getStudentBySno() throws SQLException {student = iStudentDao.getStudentBySno(101);System.out.println(student);}@Testpublic void addStudent() throws SQLException {student = new Student(122,"王莉","女","1999-08-17",95033);iStudentDao.addStudent(student);list = iStudentDao.getAllStudents();for (Student student1 : list) {System.out.println(student1);}}@Testpublic void updateStudent() throws SQLException {int sno = 110;student = new Student(sno,"刘晓明","男","2008-02-09",95034);iStudentDao.updateStudent(student);list = iStudentDao.getAllStudents();for (Student student1 : list) {System.out.println(student1);}}@Testpublic void delStudent() throws SQLException {iStudentDao.delStudent(108);list = iStudentDao.getAllStudents();for (Student student1 : list) {System.out.println(student1);}}
}

四、druid连接池进行分层

准备工作:需在项目中引入以上三个jar包,每个项目只做一次。

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?useSSL=true&serverTimezone=UTC&characterEncoding=UTF-8
user=school
pass=123456

util.Env

package util;import java.io.IOException;
import java.util.Properties;/*** Env单例模式用来动态获取不同数据库连接字符串*/
public class Env extends Properties {private static Env instance = null;private Env(){try {// Property的load方法用来加载指定的properties属性文件load(getClass().getResourceAsStream("/db.properties"));} catch (IOException e) {e.printStackTrace();}}/*** 单例设计模式在该类的外界通过该方法可以得到当前类的实例对象* @return 当前类的实例对象*/public static Env getInstance(){//如果当前实例为空,则去调用当前类的私有构造器构造该对象if(instance==null){instance = new Env();}//返回该对象return instance;}}

util.DBPoolUtil

package util;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.util.Properties;/*** 数据库连接池数据源工具类,用来动态获取数据源*/
public class DBPoolUtil {private static DruidDataSource dataSource = null;static {Properties p = new Properties();try {//加载Properties文件p.load(DBPoolUtil.class.getResourceAsStream("/db.properties"));//借助Properties对象创建一个dataSource对象dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(p);//分别设置dataSource连接的4个字符串dataSource.setUrl(Env.getInstance().getProperty("url"));dataSource.setDriverClassName(Env.getInstance().getProperty("driver"));dataSource.setUsername(Env.getInstance().getProperty("user"));dataSource.setPassword(Env.getInstance().getProperty("pass"));} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 工具方法,用来动态获取DataSource对象* @return 整个dataSource数据源对象*/public static DataSource getDataSource(){return dataSource;}
}

entity.Student

package entity;import java.util.Date;public class Student {private String sno;private String sname;private String ssex;private String sbirthday;private int cls;public Student(String sno, String sname, String ssex, String sbirthday, int cls) {this.sno = sno;this.sname = sname;this.ssex = ssex;this.sbirthday = sbirthday;this.cls = cls;}public Student() {}public String getSno() {return sno;}public void setSno(String sno) {this.sno = sno;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getSsex() {return ssex;}public void setSsex(String ssex) {this.ssex = ssex;}public String getSbirthday() {return sbirthday;}public void setSbirthday(String sbirthday) {this.sbirthday = sbirthday;}public int getCls() {return cls;}public void setCls(int cls) {this.cls = cls;}@Overridepublic String toString() {return "Student{" +"sno='" + sno + '\'' +", sname='" + sname + '\'' +", ssex='" + ssex + '\'' +", sbirthday=" + sbirthday +", cls=" + cls +'}';}
}

dao.IStudentDao

package dao;import entity.Student;import java.util.List;public interface IStudentDao {/*** 得到所有的Student集合* @return 所有的Student集合*/List<Student> getAllStudent();/*** 分页查询得到对应页数的Student对象集合* @param cp 当前第几页* @param ps 每页最大条目数* @return 所有Student对象的集合*/List<Student> getStudentByPage(int cp,int ps);/*** 通过sno得到该sno所对应的Student对象* @param sno 编号* @return sno 对应的对象*/Student getStudentBySno(int sno);/*** 持久化Student的s对象到持久化介质中* @param s 要持久化的s对象* @return 受影响的行数*/int saveStudent(Student s);/*** 修改持久化介质中的s的sno所对应s数据,用该s对象的所有属性值去替换持久化介质中该sno对应的持久化数据* @param s 要持久化数据的新值* @return 受影响的行数*/int updateStudent(Student s);/*** 删除持久化介质中sno所对应的数据* @param sno 要删除对象sno的主键* @return 受影响的行数*/int deleterStudent(int sno);/*** 获取当前表中的总记录数* @return 数据库中该表的条目数*/long getCount();}

dao.impl.IStudentDaoImpl

package dao.impl;import dao.IStudentDao;
import entity.Student;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import util.DBPoolUtil;import java.sql.SQLException;
import java.util.List;
import java.util.logging.Handler;public class IStudentDaoImpl implements IStudentDao {//  使用数据库的连接池对象创建一个QueryRunner对象,使用QueryRunner对象可以完成所有的crud操作private QueryRunner qr = new QueryRunner(DBPoolUtil.getDataSource());@Overridepublic List<Student> getAllStudent() {try {return qr.query(" select * from student",new BeanListHandler<Student>(Student.class));} catch (SQLException e) {e.printStackTrace();}return null;}@Overridepublic List<Student> getStudentByPage(int cp, int ps){int si = (cp - 1) * ps;try {return qr.query("select * from student limit ?,?",new BeanListHandler<Student>(Student.class),si,ps);} catch (SQLException e) {e.printStackTrace();}return null;}@Overridepublic Student getStudentBySno(int sno) {try {return qr.query(" select * from student where sno=?",new BeanHandler<Student>(Student.class),sno);} catch (SQLException e) {e.printStackTrace();}return null;}@Overridepublic int saveStudent(Student s) {try {return qr.update("insert into student values(?,?,?,?,?)",s.getSno(),s.getSname(),s.getSsex(),s.getSbirthday(),s.getCls());} catch (SQLException e) {e.printStackTrace();}return 0;}@Overridepublic int updateStudent(Student s) {try {qr.update(" update student set sname=?,ssex=?,sbirthday=?,cls=? where sno=?",s.getSname(),s.getSsex(),s.getSbirthday(),s.getCls(),s.getSno());} catch (SQLException e) {e.printStackTrace();}return 0;}@Overridepublic int deleterStudent(int sno) {try {qr.update("delete from student where sno=?",sno);} catch (SQLException e) {e.printStackTrace();}return 0;}@Overridepublic long getCount() {try {return qr.query("select count(1) from student",new ScalarHandler<>());} catch (SQLException e) {e.printStackTrace();}return 0;}
}

test.TestStudent

package test;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import dao.IStudentDao;
import dao.impl.IStudentDaoImpl;
import entity.Student;import javax.xml.crypto.Data;
import java.util.Date;
import java.util.List;
import java.util.Scanner;public class TestStudentDao {public static void main(String[] args) {IStudentDao isd = new IStudentDaoImpl();/*** 得到所有的Student集合* @return 所有的Student集合*/List<Student> list = isd.getAllStudent();for (Student s : list) {System.out.println(s);}System.out.println("=====================");/*** 分页查询得到对应页数的Student对象集合* @param cp 当前第几页* @param ps 每页最大条目数* @return 所有Student对象的集合*/List<Student> list1 = isd.getStudentByPage(2,2);for (Student s1 : list1) {System.out.println(s1);}System.out.println("============================");/*** 通过sno得到该sno所对应的Student对象* @param sno 编号* @return sno 对应的对象*/System.out.println(isd.getStudentBySno(436));/*** 持久化Student的s对象到持久化介质中* @param s 要持久化的s对象* @return 受影响的行数*/Student ss = new Student();Scanner input = new Scanner(System.in);System.out.println("请输入sno:");String sno = input.next();ss.setSno(sno);System.out.println("请输入sname:");String sname = input.next();ss.setSname(sname);System.out.println("请输入ssex:");String ssex = input.next();ss.setSsex(ssex);System.out.println("请输入sbirthday:");String sbirthday = input.next();ss.setSbirthday(sbirthday);System.out.println("请输入cls:");int cls = input.nextInt();ss.setCls(cls);/*** 修改持久化介质中的s的sno所对应s数据,用该s对象的所有属性值去替换持久化介质中该sno对应的持久化数据* @param s 要持久化数据的新值* @return 受影响的行数*/System.out.println(isd.updateStudent(ss));/*** 删除持久化介质中sno所对应的数据* @param sno 要删除对象sno的主键* @return 受影响的行数*/System.out.println(isd.deleterStudent(101));/*** 获取当前表中的总记录数* @return 数据库中该表的条目数*/System.out.println(isd.getCount());}
}

service.IStudentService

package service;import entity.Student;import java.util.List;public interface IStudentService {/*** 得到所有的Student集合** @return 所有的Student集合*/List<Student> getAllStudent();/*** 分页查询得到对应页数的Student对象集合** @param cp 当前第几页* @param ps 每页最大条目数* @return 所有Student对象的集合*/List<Student> getStudentByPage(int cp, int ps);/*** 通过sno得到该sno所对应的Student对象** @param sno 编号* @return sno 对应的对象*/Student getStudentBySno(int sno);/*** 持久化Student的s对象到持久化介质中** @param s 要持久化的s对象* @return */boolean saveStudent(Student s);/*** 修改持久化介质中的s的sno所对应s数据,用该s对象的所有属性值去替换持久化介质中该sno对应的持久化数据** @param s 要持久化数据的新值* @return */boolean updateStudent(Student s);/*** 删除持久化介质中sno所对应的数据** @param sno 要删除对象sno的主键* @return*/boolean deleterStudent(int sno);/*** 获取当前表中的总记录数** @return */long getCount();}

service.impl.StudentServiceImpl

package service.Impl;import dao.IStudentDao;
import dao.impl.IStudentDaoImpl;
import entity.Student;
import service.IStudentService;import java.util.List;public class StudentServiceImpl implements IStudentService {private IStudentDao isd = new IStudentDaoImpl();@Overridepublic List<Student> getAllStudent() {return isd.getAllStudent();}@Overridepublic List<Student> getStudentByPage(int cp, int ps) {return isd.getStudentByPage(cp, ps);}@Overridepublic Student getStudentBySno(int sno) {return isd.getStudentBySno(sno);}@Overridepublic boolean saveStudent(Student s) {return isd.saveStudent(s)>0;}@Overridepublic boolean updateStudent(Student s) {return isd.updateStudent(s)>0;}@Overridepublic boolean deleterStudent(int sno) {return isd.deleterStudent(sno)>0;}@Overridepublic long getCount() {return isd.getCount();}
}

五、QueryRunner()方法的使用

主要是针对数据库连接池的使用,一方面解决了数据库访问过多时造成数据库承受的压力,另一方面也简化了数据查询。

QueryRunner方法()

QueryRunner中一共有6种方法:
•execute(执行SQL语句)
•batch(批量处理语句)
•insert(执行INSERT语句)
•insertBatch(批量处理INSERT语句)

•query(SQL中 SELECT 语句)
•update(SQL中 INSERT, UPDATE, 或 DELETE 语句)(最为常用)

•ArrayHandler:把结果集中的第一行数据转成对象数组。
•ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
•BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
•BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
•MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
•MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
• ColumnListHandler:将结果集中某一列的数据存放到List中。
•KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List),再把这些map再存到一个map里,其key为指定的列。
ScalarHandler:将结果集第一行的某一列放到某个对象中。

JDBC中的DBUtil工具和druid连接池相关代码实例相关推荐

  1. c3p0和jdbctemplate配置oracle集群rac,C3P0连接池、DRUID连接池和JdbcTemplate

    目录 一.C3P0连接池 1.C3P0连接池简介 2.常用的配置参数 3.C3P0连接池基本使用 (1)C3P0配置文件 (2)API介绍 4.使用步骤 二.DRUID连接池 1. DRUID简介 2 ...

  2. C3P0连接池、DRUID连接池和JdbcTemplate

    目录 一.C3P0连接池 1.C3P0连接池简介 2.常用的配置参数 3.C3P0连接池基本使用 (1)C3P0配置文件 (2)API介绍 4.使用步骤 二.DRUID连接池 1. DRUID简介 2 ...

  3. Druid 连接池 JDBCUtils 工具类的使用

    Druid工具介绍 它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. 支持所有JDBC兼容的数据库,包括Oracle.MySQL. ...

  4. Java回顾(十二) File类、Druid连接池、JDBCTemplate(Spring JDBC)、HTML和CSS

    1.File类 1.1.File类概述和构造方法 File:是文件和目录路径名的抽象表示 文件和路径是可以通过File封装为对象的 以下是三种实现的方法,一般来说,用第一种就可以 public cla ...

  5. SSM中使用Druid连接池

    连接池 最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源.由于频繁的打开和关闭连接对jvm包括数据库都有一定的资源负荷,尤其应用压力较大时资源占用比较多容易产生性能问题.由 ...

  6. druid连接池初始化慢_从零开始手写 mybatis (三)jdbc pool 从零实现数据库连接池

    前景回顾 第一节 从零开始手写 mybatis(一)MVP 版本 中我们实现了一个最基本的可以运行的 mybatis. 第二节 从零开始手写 mybatis(二)mybatis interceptor ...

  7. spring-boot中使用druid连接池

      最近因为项目的要求,需要在spring-boot中配置druid连接池,数据库是Oracle,并且是多数据源的连接池,特地写下我的配置经历.   用的框架是spring-boot,数据库是orac ...

  8. JDBC的API与德鲁伊Druid连接池配置

    JDBC的API DriverManager  : 管理驱动,创建连接. Connection : 一个数据库连接,通过connection获取statement对象 Statement : 执行sq ...

  9. Druid 连接池 报错 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

    场景赘述 早晨查看项目前一天的实际运行日志,发现了 一个Springboot项目中的druid 连接池和 mysql 产生了异常信息,重连暂并未对系统产生影响 下面是具体报错信息: com.mysql ...

  10. 使用MyBatis集成阿里巴巴druid连接池(不使用spring)

    在工作中发现mybatis默认的连接池POOLED,运行时间长了会报莫名其妙的连接失败错误.因此采用阿里巴巴的Druid数据源(码云链接 ,中文文档链接). mybatis更多数据源参考博客链接 . ...

最新文章

  1. mysql外键无法删除_mysql外键无法删除数据的情况
  2. Pthread:POSIX Threads Programming
  3. 标准情况下的最优方案与魔鬼赛道
  4. 醒来觉得甚是爱你。--朱生豪
  5. interp1 函数-------一维数据插值函数
  6. Python学习笔记:Day4 编写Model
  7. 循环自相关函数和谱相关密度(四)——实信号、复信号模型下的QPSK信号循环谱推导
  8. vitualbox命令操作VBoxManage
  9. ruby array_在Ruby中使用Array.pop和Array.shift方法从Array中删除元素
  10. 冒泡排序 实现数据的由大到小排序
  11. nodejs进程异常退出处理方法
  12. Camera 初始化(Open)二(HAL3中Open过程)
  13. iOS:segment对齐原则
  14. 华为认证的好处是什么?考试费是多少?
  15. 安装IBM HTTP SERVER
  16. 计算机三级数据库应用题设计题,计算机考试三级数据库练习题
  17. vue配置sass全局变量
  18. 微信小程序-输入框输入文字后,将光标移到文字中间,接着输入文字后光标又自动跳到最后...
  19. 柯伊玟导演作品《黑暗迷踪》顺利杀青
  20. java中定义ListNode

热门文章

  1. 苹果3D视觉报告:龙头引领行业大趋势
  2. |app自动化测试之Appium WebView 技术原理
  3. mysql的填充因子_SQL Server表索引:调整填充因子
  4. 一篇很哇塞的MyBatis入门到精通
  5. 信用卡刷卡消费背后的故事
  6. RenderingNG中关键数据结构和它们的角色
  7. 怒怼外媒,为中国正名,这个《流浪地球》捧红的犹太小哥太励志了
  8. 【百度大脑新品体验】车牌识别
  9. PyPI 官方仓库遭遇挖矿恶意组件投毒
  10. 红帽企业linux8,红帽发布企业版 Linux(RHEL) 8.0