Java多线程Jdbc_Java连接数据库 #01# JDBC单线程适用

2023-11-07

官方教程(包括 javase的基础部分):JDBC Basics

重新梳理、学习一下“Java连接数据库”相关的内容。

因为最开始没有认真学多线程和JDBC,一直在自己写的多线程程序中维持下面的错误写法:

多个线程共用一个connection

connection只开不关

为什么上述做法是错误的呢? 可以参看这个帖子。- - “JDBC规范并未规定那三个对象必须是线程安全的,因此所有的JDBC厂商也不会去弄成线程安全的,正因为如此,所以就会有并发问题。” 、-- “ 并不是说不能把连接对象弄成成员变量,只是不能将其弄成成员变量后,在多线程环境下处于共享这些对象,如果同步处理得不好,那就会产生严重的连接泄漏。为了避免这种情况发生,仅在用时获取连接,用完后马上关掉。” -- “如果你对JDBC、多线程编程没有达到非常熟练的程度,还是老老实实地使用经典的JDBC代码结构。” -- 摘抄自csdn 火龙果被占用了

另外,connection只开不关很容易导致连接失效(mysql默认保持连接的时间是8小时,如果这个连接在8小时内无人访问的话,就会关闭这个连接。- -摘)

我把这些错误代码放在第一小节记录下来,作为java连接数据库的最原始版本,在这之后逐渐改良成可以适应各种场景的正确代码。

① DDL.sql

DROP TABLE IF EXISTS`profile`;CREATE TABLE`profile` (

`profileId`BIGINT(20) NOT NULLAUTO_INCREMENT,

`username`VARCHAR(50) NOT NULL,

`password`VARCHAR(50) NOT NULL,

`nickname`VARCHAR(50) NOT NULL,

`last_online`TIMESTAMP NULL DEFAULT NULL,

`gender`CHAR(1) NULL DEFAULT NULL,

`birthday`TIMESTAMP NULL DEFAULT NULL,

`location`VARCHAR(50) NULL DEFAULT NULL,

`joined`TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(`profileId`),UNIQUE INDEX`username` (`username`)

) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;

profile表可以基本等价为user表来理解。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

② 对应的实体类Profile.java

packageorg.sample.entity;importjava.sql.Timestamp;public classProfile {privateLong profileId;privateString username;privateString password;privateString nickname;privateTimestamp last_online;privateCharacter gender;privateTimestamp birthday;privateString location;privateTimestamp joined;publicProfile() {

}publicLong getProfileId() {returnprofileId;

}public voidsetProfileId(Long profileId) {this.profileId =profileId;

}publicString getUsername() {returnusername;

}public voidsetUsername(String username) {this.username =username;

}publicString getPassword() {returnpassword;

}public voidsetPassword(String password) {this.password =password;

}publicString getNickname() {returnnickname;

}public voidsetNickname(String nickname) {this.nickname =nickname;

}publicTimestamp getLast_online() {returnlast_online;

}public voidsetLast_online(Timestamp last_online) {this.last_online =last_online;

}publicCharacter getGender() {returngender;

}public voidsetGender(Character gender) {this.gender =gender;

}publicTimestamp getBirthday() {returnbirthday;

}public voidsetBirthday(Timestamp birthday) {this.birthday =birthday;

}publicString getLocation() {returnlocation;

}public voidsetLocation(String location) {this.location =location;

}publicTimestamp getJoined() {returnjoined;

}public voidsetJoined(Timestamp joined) {this.joined =joined;

}

@OverridepublicString toString() {return "Profile{" +

"profileId=" + profileId +

", username='" + username + '\'' +

", password='" + password + '\'' +

", nickname='" + nickname + '\'' +

", last_online=" + last_online +

", gender=" + gender +

", birthday=" + birthday +

", location='" + location + '\'' +

", joined=" + joined +

'}';

}

}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

③ ConnectionFactory.java或者常说的Dbutil(错误代码 ↓)

packageorg.sample.db;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.util.ResourceBundle;/*** 单线程适用,只开不关,反复用一个 Connection*/

public classStaticConnectionFactory {private static ResourceBundle rb = ResourceBundle.getBundle("org.sample.db.db-config");private static final String JDBC_URL = rb.getString("jdbc.url");private static final String JDBC_USER = rb.getString("jdbc.username");private static final String JDBC_PASSWORD = rb.getString("jdbc.password");private static Connection conn = null;static{try{//Class.forName("org.gjt.mm.mysql.Driver");//JDBC 4.0 之后(包括 JDBC 4.0)不再需要 class.forName ,详细查看 javaSE6 之后的 API

conn =DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);

}catch(SQLException e) {throw new RuntimeException("Error connecting to the database", e);

}

}public staticConnection getConnection() {returnconn;

}public static void setAutoCommit(boolean autoCommit) throwsSQLException {

conn.setAutoCommit(autoCommit);

}public static void commit() throwsSQLException {

conn.commit();

}public static void rollback() throwsSQLException {

conn.rollback();

}

}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

④ org/sample/db/db-config.properties

jdbc.url=jdbc:mysql://***.**.**.**:3306/profiles?characterEncoding=utf8

jdbc.username=root

jdbc.password=aaaaaaaaaaa

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

⑤ ProfileDAO.java

packageorg.sample.dao;importorg.sample.entity.Profile;importjava.util.List;public interfaceProfileDAO {intsaveProfile(Profile profile);

ListlistProfileByNickname(String nickname);

Profile getProfileByUsername(String username);intupdateProfileById(Profile profile);intupdatePassword(String username, String password);intupdateLastOnline(String username);

}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

⑥ ProfileDAOImpl.java(为了用“带资源的try”严重画蛇添足了。)

packageorg.sample.dao.impl;importcom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;importorg.sample.dao.ProfileDAO;importorg.sample.db.StaticConnectionFactory;importorg.sample.entity.Profile;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;//NotThreadSafe

public class ProfileDAOImpl implementsProfileDAO {private static final Connection conn =StaticConnectionFactory.getConnection();

@Overridepublic intsaveProfile(Profile profile) {int i = 0;try(

PreparedStatement ps=createPreparedStatementForSaveProfile(conn, profile);

) {

i=ps.executeUpdate();

}catch(SQLException e) {if (!(e instanceofMySQLIntegrityConstraintViolationException)) {

e.printStackTrace();

}

}returni;

}

@Overridepublic ListlistProfileByNickname(String nickname) {

List profiles = new ArrayList<>();try(

PreparedStatement ps=createPreparedStatementForListProfileByNickname(conn, nickname);

ResultSet rs=ps.executeQuery();

) {while(rs.next()) {

Profile profile=extractProfileFromResultSet(rs);

profiles.add(profile);

}

}catch(SQLException e) {

e.printStackTrace();

}returnprofiles;

}

@OverridepublicProfile getProfileByUsername(String username) {

Profile profile= null;try(

PreparedStatement ps=createPreparedStatementForGetProfileByUsername(conn, username);

ResultSet rs=ps.executeQuery();

) {if(rs.next()) {

profile=extractProfileFromResultSet(rs);

}

}catch(SQLException e) {

e.printStackTrace();

}returnprofile;

}

@Overridepublic intupdateProfileById(Profile profile) {int i = 0;try(

PreparedStatement ps=createPreparedStatementForUpdateProfileById(conn, profile);

) {

i=ps.executeUpdate();

}catch(SQLException e) {

e.printStackTrace();

}returni;

}

@Overridepublic intupdatePassword(String username, String password) {int i = 0;try(

PreparedStatement ps=createPreparedStatementForUpdatePassword(username, password);

) {

i=ps.executeUpdate();

}catch(SQLException e) {

e.printStackTrace();

}returni;

}

@Overridepublic intupdateLastOnline(String username) {int i = 0;try(

PreparedStatement ps=createPreparedStatementForUpdateLastOnline(username);

) {

i=ps.executeUpdate();

}catch(SQLException e) {

e.printStackTrace();

}returni;

}private Profile extractProfileFromResultSet(ResultSet rs) throwsSQLException {

Profile profile= newProfile();

profile.setBirthday(rs.getTimestamp("birthday"));

profile.setJoined(rs.getTimestamp("joined"));

profile.setLast_online(rs.getTimestamp("last_online"));

profile.setLocation(rs.getString("location"));

profile.setNickname(rs.getString("nickname"));

profile.setPassword(rs.getString("password"));

profile.setProfileId(rs.getLong("profile_id"));

profile.setUsername(rs.getString("username"));if (rs.getString("gender") != null) {

profile.setGender(rs.getString("gender").charAt(0));

}returnprofile;

}private PreparedStatement createPreparedStatementForSaveProfile(Connection conn, Profile profile) throwsSQLException {

String sql= "INSERT INTO `profiles`.`profile` (`username`, `password`, `nickname`) " +

"VALUES (?, ?, ?)";

PreparedStatement ps=conn.prepareStatement(sql);

ps.setString(1, profile.getUsername());

ps.setString(2, profile.getPassword());

ps.setString(3, profile.getNickname());returnps;

}private PreparedStatement createPreparedStatementForListProfileByNickname(Connection conn, String nickname) throwsSQLException {

String sql= "SELECT `profile_id`, `username`, `password`, `nickname`, `last_online`, `gender`, `birthday`, `location`, `joined`" +

"FROM `profiles`.`profile`" +

"WHERE `nickname`=?";

PreparedStatement ps=conn.prepareStatement(sql);

ps.setString(1, nickname);returnps;

}private PreparedStatement createPreparedStatementForGetProfileByUsername(Connection conn, String username) throwsSQLException {

String sql= "SELECT `profile_id`, `username`, `password`, `nickname`, `last_online`, `gender`, `birthday`, `location`, `joined`" +

"FROM `profiles`.`profile`" +

"WHERE `username`=?";

PreparedStatement ps=conn.prepareStatement(sql);

ps.setString(1, username);returnps;

}private PreparedStatement createPreparedStatementForUpdateProfileById(Connection conn, Profile profile) throwsSQLException {

String sql= "UPDATE `profiles`.`profile`" +

"SET `nickname`=?, `gender`=?, `birthday`=?, `location`=? " +

"WHERE `profile_id`=?";

PreparedStatement ps=conn.prepareStatement(sql);

ps.setString(1, profile.getNickname());

ps.setString(2, profile.getGender() != null ? String.valueOf(profile.getGender()) : null);

ps.setTimestamp(3, profile.getBirthday());

ps.setString(4, profile.getLocation());

ps.setLong(5, profile.getProfileId());returnps;

}private PreparedStatement createPreparedStatementForUpdatePassword(String username, String password) throwsSQLException {

String sql= "UPDATE `profiles`.`profile`" +

"SET `password`=? " +

"WHERE `username`=?";

PreparedStatement ps=conn.prepareStatement(sql);

ps.setString(1, password);

ps.setString(2, username);returnps;

}private PreparedStatement createPreparedStatementForUpdateLastOnline(String username) throwsSQLException {

String sql= "UPDATE `profiles`.`profile`" +

"SET `last_online`=CURRENT_TIMESTAMP " +

"WHERE `username`=?";

PreparedStatement ps=conn.prepareStatement(sql);

ps.setString(1, username);returnps;

}

}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

⑦ ProfileDAOTest.java

packageorg.sample.dao;importorg.junit.Test;importorg.sample.dao.impl.ProfileDAOImpl;importorg.sample.db.StaticConnectionFactory;importorg.sample.entity.Profile;importjava.sql.SQLException;importjava.util.List;import static org.junit.Assert.*;public classProfileDAOTest {private ProfileDAO profileDAO = newProfileDAOImpl();private static final String USER_NAME = "hello123";

@Testpublic voidsaveProfile() {

Profile profile= newProfile();

profile.setUsername(USER_NAME);

profile.setPassword("231231232");

profile.setNickname("jack");int i =profileDAO.saveProfile(profile);

System.out.println(i);

}

@Testpublic voidlistProfileByNickname() {

List profiles = profileDAO.listProfileByNickname("123");

}

@Testpublic voidgetProfileByUsername() {

Profile existProfile=profileDAO.getProfileByUsername(USER_NAME);

Profile notExistProfile= profileDAO.getProfileByUsername(USER_NAME + "321");

assertNotNull(existProfile);

assertNull(notExistProfile);

}

@Testpublic voidupdateProfileById() {

Profile profile=profileDAO.getProfileByUsername(USER_NAME);int i =profileDAO.updateProfileById(profile);

assertEquals(1, i); //即便没改变值,但是还是会重新set一遍,因此影响行数还是一行

profile.setGender('f');

profile.setNickname("www" +Math.random());int j =profileDAO.updateProfileById(profile);

assertEquals(1, j);

}

@Testpublic voidupdatePassword() {

profileDAO.updatePassword(USER_NAME,"www" +Math.random());

}

@Testpublic void updateLastOnline() throwsSQLException {try{

StaticConnectionFactory.setAutoCommit(false);

profileDAO.getProfileByUsername(USER_NAME);

profileDAO.updateLastOnline(USER_NAME);

StaticConnectionFactory.commit();

}catch(SQLException e) {

e.printStackTrace();try{

StaticConnectionFactory.rollback();

}catch(SQLException e1) {

e1.printStackTrace();

}

}finally{

StaticConnectionFactory.setAutoCommit(true);

}

}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java多线程Jdbc_Java连接数据库 #01# JDBC单线程适用 的相关文章

  • 对meta标签的再次认识

    META标签用来描述一个HTML网页文档的属性 例如作者 日期和时间 网页描述 关键词 页面刷新等 指定字符集 向搜索引擎说明网页的关键词 告诉搜索引擎你的站点的主要内容 告诉搜索引擎你的站点的制作的作者 响应式页面
  • 【stm32】手把手用cubemx配置血氧传感器(MAX30102)

    一 前言 网上流传血氧传感器的代码有好几个版本 听说这个不准 那个不准的 突然间我看到了一篇好文章 大概是自己用软件测试测量结果是否准确 秀的我头皮发麻呀 外部中断触发 本文将通过他的例程来手把手教大家如何配置 本文适合小白 只讲如何应用
  • c语言 请求页式存储管理,操作系统-页式内存管理

    页式内存管理上 A 段式内存管理 1 指的是一段连续的内存空间 2 段式内存管理 程序的各个部分相对独立 数据段 代码段 早期x86处理器无法通过一个寄存器访问所有内存单元 解决早期程序运行的重定位问题 段式内存管理的应用 在x86系列的处
  • STM32F767ZI-NUCLEO移植运行micropython过程记录

    注意 本教程移植microPython是通过烧写hex文件实现的 网上其他教程很多是介绍使用USB DFU方式 设备boot0至高电平 通过DfuSeDemo烧写 由于自己还不熟没有使用这种方式 后续有时间再尝试 另外本教程是基于STM32
  • 编译工程——词法分析

    词法分析主要是读入源程序的输入字符 区分成词素 生成词法单元序列 序列中的每个词法单元对应一个词素 此外 它还会完成其他的任务 如过滤掉源程序中的注释和空白 空格 换行符 制表符以及在输入中用于分割词法单元的其他字符 以及将编译器生成的错误
  • linux 平铺式桌面,Linux平铺窗口管理器:i3,sway,Qtile,dwm,awesome,附安装方法

    下面介绍五款 Linux 平铺窗口管理器 i3 sway Qtile dwm awesome 同时提供在 Fedora 系统中如何安装它们 在 Linux 桌面生态中有多种窗口管理器 WM 有些是作为桌面环境的一部分开发的 有的则被用作独立
  • oracle中的resetlog——还需理解

    关于resetlog的作用是将日志序列重置 这样以前的归档就作废 请高人指点 是什么样的一个工作机制 首先一定要明白oracle工作的基本原理 归档情况下 大家一定要同步 谁也不能滞后或者超前 也就是SCN号 如果学oracle不懂scn的
  • Centos Linux 清理磁盘占用空间:/dev/xvda1

    CnetOS7 磁盘空间不足 进行如下操作可释放空间 df h 查看磁盘占用率 df h 这时是100 截图是清理之后的 进入根目录cd 执行du sm sort n 磁盘占用的升序排列 或du h max depth 1du 进入占用空间
  • PDF Web Viewer

    https mozilla github io pdf js web viewer html
  • 编程每日一题_C程序设计_日K蜡烛图

    描述 来源 pintia 正确解法一 嵌套 if 条件判断 include
  • 华为OD机试 - 区间交集(Java)

    题目描述 给定一组闭区间 其中部分区间存在交集 任意两个给定区间的交集 称为公共区间 如 1 2 2 3 的公共区间为 2 2 3 5 3 6 的公共区间为 3 5 公共区间之间若存在交集 则需要合并 如 1 3 3 5 区间存在交集 3
  • 线性DP题目汇总(持续更新)

    一 前言 此篇章主要整理一些关于线性dp的题目 很多题目其实都可以被挂上线性dp的标志 比如最熟悉的最长上升子序列啊 最长公共子序列啊等等 并且线性dp在自己写力扣周赛的题目的时候 真的会时不时出几道 然后刚好利用这些题目加上dp分析的方法
  • uniapp中H5使用Vconsole调试

    下载与安装vconsole 1 1 选中你的项目 弄出终端 输入以下命令 npm install vconsole npm install vconsole 2 引用vconsole 找到main js文件中 加上以下代码 import V
  • PyPDF2 pdf 文件写入提示如下错误:PyPDF2.utils.PdfReadError: Illegal character in Name Object

    今天学习PyPDF2 pdf文件写入其他指定pdf 文件提示如下错误信息 Traceback most recent call last File D python35 Lib site packages PyPDF2 generic py
  • 强化学习基础

    强化学习 强化学习概念 强化学习 RL 就是智能体Agent与环境交互从而进行学习的一种机器学习方法 Agent执行一个动作后 会从环境中获得反馈 这个反馈就是环境对这个动作做出的评价 这个可以理解为当你拿100分时 你妈妈会给你一顿大餐的
  • 毕业设计 STM32单片机的GPS定位系统 - 物联网

    基于STM32单片机的定位系统 由 STM32F103C8T6单片机最小系统 GPS模块 ESP8266 系统内可以通过ESP8266无线传输模块将GPS传回来的数据在ONENET界面显示 ONENET界面可以显示行驶距离 速度 经纬度还可
  • 中望cad文字显示问号怎么办_CAD字体显示问号解决方法

    很多朋友查看CAD图纸的时候会出现很多问号 这到底是怎么回事呢 想要搞定也是很麻烦的 小编提供的这款CAD字体 问号修复工具采用lsp格式 加载后再命令行输入fs回车即可解决cad字体中出现问号的问题 遇到类似问题的朋友不妨下载试试 使用说
  • 算法导论学习--红黑树详解之删除(含完整红黑树代码)

    前面我们讨论了红黑树的插入的实现 基本思想是分类讨论 然后分情况讨论以后我们发现插入操作调整函数只需要处理三种情况 并不是太复杂 但是删除操作会更复杂一点 因为二叉搜索树的删除操作本身就分成了多种情况 这样在执行删除操作后要处理的情况会更多
  • tomcat 远程连接

    在catalina sh里面添加以下配置 JAVA OPTS server XX PermSize 1024m XX MaxPermSize 2048m Xms3072 Xmx5120m XX UseParallelGC XX Parall

随机推荐

  • 爆了!2023 年上半年全球程序员薪酬报告

    大家好 这里是 NewBeeNLP 近日 美国科技公司数据收集网站 Levels fyi 发布了 2023 年上半年全球程序员薪酬报告 并统计了各领域薪酬的增长比例 我们从上表可以看到各个领域当中 增强现实 虚拟现实 AR VR 总薪酬中位
  • PC汇编语言(NASM)

    http www drpaulcarter com pcasm 转载于 https www cnblogs com yuanping archive 2012 12 29 2838844 html
  • 归并排序,C++实现

    归并排序 采用分治法的一个典型应用 实现方法有两种 1 自上而下的递归 所有递归的方法都可以用迭代重写 2 自下而上的迭代 c 代码 递归版 include
  • QT串口收发

    QT串口收发 串口扫描 配置串口信息 设置串口名称 设置波特率 设置数据位 设置奇偶校验 设置停止位 设置流控制 设置读取数据的缓存大小 打开串口 串口打开并配置代码 串口接收数据 串口发送数据 串口关闭 offAndOn自定义函数 使co
  • react组件的生命周期以及基本语法

    组件化的发展历程 面向对象 封装 集成 多态 模块化 13 16年 解决了全局变量和变量勿滥 组件化 使编程更轻量化 创建组件 组件的使用 无需注册 跟html标签书写一致 首字母大写 必须有根标签 一个组件一个模块 组件生命周期钩子函数
  • mvc:default-servlet-handler和mvc:annotation-driven成对出现的原因

  • [人工智能-深度学习-62]:环境搭建 - 增加或更换硬盘,SSD/SATA/SAS哪个好?

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 人工智能 深度学习 62 环境搭建 增加或更换硬盘 SSD SATA SAS哪个好 文火冰糖 王文兵 的博客 CSDN博客 第1章 硬盘的分
  • Linux提权

    目录 编辑 一 信息收集 Linux脏牛内核漏洞 SUID 1 信息收集 2 SUID提权 案例 1 SUID提权配合脚本 2 本地配合内核漏洞 3 脏牛内核漏洞演示 linux exploit suggester 二 定时任务 环境变量
  • SQL注入原理-数值型注入

    小伙伴们大家好 本期为大家带来的是SQL注入原理 数值型注入的讲解 目录 SQL注入原理 数值型注入 编辑 1 测试是否存在注入点 2 判断字段个数 3 找出可以回显的字段 4 查询数据库的信息 1 查看当前的数据库 2 查看当前数据库的用
  • 操作系统调度算法

    在操作系统中存在多种调度算法 其中有的调度算法适用于作业调度 有的调度算法适用于进程调度 有的调度算法两者都适用 下面介绍几种常用的调度算法 先来先服务 FCFS 调度算法 FCFS调度算法是一种最简单的调度算法 该调度算法既可以用于作业调
  • ddt+BeautifulReport,报告展示用例描述,unittest用例统计

    当前使用的ddt来管理测试数据 需要读取测试数据内每一条case的描述 修改之前 修改途径 ddt源码内 将test data docstring get test data docstring func v 修改为 test data d
  • 【Java】得到当前股票信息

    import java io BufferedReader import java io InputStreamReader import java net HttpURLConnection import java net URL pub
  • Java TreeMap排序

    TreeMap实现了SortedMap接口 根据键自然排序 要求键必须是可比较的 要么指定Comparator比较器 如果没有Comparator比较器 键要实现Comparable接口 package Map import java ut
  • linux查看某文件夹下各个文件大小

    例如 我想查看 app 下各个文件的大小 cd app du h max depth 0 解释 cd app 进入 app 文件夹 du h max depth 0 查看文件夹下各个文件的大小 其中 0 代表查看 本文件夹 在这儿是app文
  • 如何实现前端项目的自动化测试?

    这其实就是我们常说的 UI自动化测试 针对这个问题 我先告知答题思路如下 1 什么是UI自动化 有什么优势 2 UI自动化实践中会遇到什么难题 3 如何解决难题 将UI落实到实践中 重点 4 UI自动化学习资料推荐 一 什么是UI自动化 为
  • 解决macos安装升级时报错安装所选更新时发生错误的问题

    系统有更新 下载到一半时点了取消下载 然后再等有空的时候点击安装更新一直失败 解决方法为 重新启动Mac 并按住Command R进入恢复模式 找到Terminal后输入csrutil disable 然后重启Mac 再次下载并安装更新 重
  • 第16章Stata面板数据分析

    目录 16 1短面板数据分析 案例延伸 延伸 关于模型的选择问题 16 2长面板数据 案例延伸 延伸 进行随即系数模型回归分析 面板数据 Panel Data 又被称为平行数据 指的是对某变量在一定时间内持续跟踪观测的结果 面板数据兼具了横
  • java: 错误: 不支持发行版本 5 报错的解决

    今天在使用maven配置好logback的依赖后 满心欢喜的去运行了一下 结果却报了 java 错误 不支持发行版本 5 在网上查了一下发现是jdk版本太高不支持编译java5版本的二进制 而这个问题常常是导入maven依赖时会遇到的 下面
  • React Hooks之useContext

    useContext const value useContext MyContext 接收一个 context 对象 React createContext 的返回值 并返回该 context 的当前值 当前的 context 值由上层组
  • Java多线程Jdbc_Java连接数据库 #01# JDBC单线程适用

    官方教程 包括 javase的基础部分 JDBC Basics 重新梳理 学习一下 Java连接数据库 相关的内容 因为最开始没有认真学多线程和JDBC 一直在自己写的多线程程序中维持下面的错误写法 多个线程共用一个connection c