首页
友链
Search
1
01-快捷命令
132 阅读
2
寒假计划
128 阅读
3
浏览器规范(ES module)和 node.js 规范(Common JS)
120 阅读
4
03-概念解析
119 阅读
5
学期计划(大三下学期)
102 阅读
计划
算法
面试题
运维
Ansible
Linux
数据库
neo4j
共用
web 前端
CSS
JavaScript
Vue
Node.js
英语单词
工程化
JAVA
mysql
收获
面试
mybatis
Spring
基础
spring-mvc
问题
项目
宠物乐园
速查
问题集
git
学习
sql
二阶段
登录
Search
标签搜索
spring
mysql
vue
ansible
CSS
面试
计划
收获
JAVA面试题
spring-mvc
Starrylsi
累计撰写
106
篇文章
累计收到
37
条评论
首页
栏目
计划
算法
面试题
运维
Ansible
Linux
数据库
neo4j
共用
web 前端
CSS
JavaScript
Vue
Node.js
英语单词
工程化
JAVA
mysql
收获
面试
mybatis
Spring
基础
spring-mvc
问题
项目
宠物乐园
速查
问题集
git
学习
sql
二阶段
页面
友链
搜索到
51
篇与
的结果
2024-10-03
2024-10-03_多线程
填空处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入_________状态。处于新建状态的线程被启动后,将进入线程队列排队等待CPU,此时它已具备了运行条件,一旦轮到享用CPU资源就可以获得执行机会。上述线程是处于 状态。一个正在执行的线程可能被人为地中断,让出CPU的使用权,暂时中止自己的执行,进入 状态。在Java中编写实现多线程应用有两种途径:一种是继承Thread类创建线程,另一种是实现 接口创建线程。在线程控制中,可以调用______________方法,阻塞当前正在执行的线程,等插队线程执行完后后再执行阻塞线程。多线程访问某个共享资源可能出现线程安全问题,此时可以使用________________关键字来实现线程同步,从而避免安全问题出现,但会影响性能,甚至出现死锁。在线程通信中,调用wait( )可以是当前线程处于等待状态,而为了唤醒一个等待的线程,需要调用的方法是______________。在线程通信中,可以调用wait()、notify()、notifyAll()三个方法实现线程通信,这三个方法都是______________类提供的public方法,所以任何类都具有这三个方法。
2024年10月03日
11 阅读
0 评论
0 点赞
2024-10-03
2024-10-03_IO流实践
文件复制可以使用封装好的 files.copy(),也可以使用原生的需求 3: 分别使用文件流和缓冲流复制一个长度大于 100MB 的视频文件,并观察效率的差异。问题: 不知道在文件复制时先使用哪一个关键: 输入流就是在读取数据,输出流就是在写数据理解清楚两个概念:输入流是 Java 中用于从不同数据源读取数据的流输出流是 Java 中用于将数据写入不同目的地的流使用文件流复制为什么需要这两段代码?第一段代码设置了文件读取和写入的“通道”。第二段代码实现了文件内容的实际复制。 String sourceFile = "H:\\My_Life_Archive\\Entertainment-娱乐\\VID_20210916_082147.mp4"; String destFile = "H:\\My_Life_Archive\\Entertainment-娱乐\\outputVideo.mp4"; // 使用文件流复制文件 long startTime = System.currentTimeMillis(); // 第一段:创建输入输出流对象 try (FileInputStream readVideo = new FileInputStream(sourceFile); FileOutputStream writeVideo = new FileOutputStream(destFile)) { //第二段:读取和写入数据 int byteData; while ((byteData = readVideo.read()) != -1) { writeVideo.write(byteData); } } catch (IOException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println("文件流复制耗时:" + (endTime - startTime) + "ms");使用缓冲流复制创建通道设置缓冲数组大小判断是否文件末尾写入数据关闭流String sourceFile = "H:\\My_Life_Archive\\Entertainment-娱乐\\VID_20210916_082147.mp4"; String destFile = "H:\\My_Life_Archive\\Entertainment-娱乐\\outputVideo.mp4"; long startTime = System.currentTimeMillis(); //1.创建通道 try { BufferedInputStream bufferedReadVideo = new BufferedInputStream(new FileInputStream(sourceFile)); BufferedOutputStream bufferedWriteVideo = new BufferedOutputStream(new FileOutputStream(destFile)); //2.复制内容 byte[] buffer = new byte[1024*1024]; int bytesRead; while ((bytesRead = bufferedReadVideo.read(buffer)) != -1) { bufferedWriteVideo.write(buffer, 0, bytesRead); } bufferedWriteVideo.flush(); } catch (IOException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println("文件流复制耗时:" + (endTime - startTime) + "ms");需求 4: 复制文件夹 d:/java 下面所有文件和子文件夹内容到 d:/java2。前置知识listFiles() 方法被调用以获取目录下的所有文件和子目录。使用 java.nio.file.Files.copy() 方法来复制一个文件。这里使用了两个 toPath() 方法将 java.io.File 对象转换成 java.nio.file.Path 对象,以便于使用 Files.copy() 方法进行文件复制代码实现/** * 复制一个目录及其内容到另一个位置。 * * @param src 源目录 * @param dest 目标目录 */ private static void copyFolder(File src, File dest) { // checks if(src==null || dest==null) return; if(!src.isDirectory()) return; if(dest.exists()){ if(!dest.isDirectory()){ //System.out.println("destination not a folder " + dest); return; } } else { dest.mkdir(); } File[] files = src.listFiles(); if(files==null || files.length==0) return; for(File file: files){ File fileDest = new File(dest, file.getName()); //System.out.println(fileDest.getAbsolutePath()); if(file.isDirectory()){ copyFolder(file, fileDest); }else{ if(fileDest.exists()) continue; try { Files.copy(file.toPath(), fileDest.toPath()); } catch (IOException e) { //e.printStackTrace(); } } } } 我总结的关键步骤(符合我编写的步骤)第一步: 把复制文件的逻辑编写好获取文件列表循环列表初始化目标文件对象判断是否为目录,是就回调本身,不是就复制第二步: 考虑结束递归的条件确保传入的 src 和 dest 参数都是有效的(非 null)。确保 src 是一个目录。确保 dest 要么是一个已存在的目录,要么是一个可以成功创建的新目录。AI 总结的整体步骤参数检查:if (src == null || dest == null):确保源目录和目标目录都不为 null。 if (!src.isDirectory()):确保源目录确实是一个目录。 if (dest.exists()):检查目标目录是否已经存在。 如果存在且不是一个目录,则直接返回。 如果不存在,则尝试创建目录获取目录内容:File[] files = src.listFiles();:获取源目录下的所有文件和子目录。遍历目录内容:for (File file : files):遍历目录下的所有文件和子目录。 如果遇到子目录,则递归调用 copyFolder 方法继续复制。 如果遇到普通文件,则检查目标文件是否已存在。 如果已存在,则跳过复制。 如果不存在,则使用 Files.copy 方法复制文件,并使用 REPLACE_EXISTING 选项确保如果目标文件存在则被替换。
2024年10月03日
10 阅读
0 评论
0 点赞
2024-10-02
06-Mybatis-我学到了什么
总结Mybatissqlsession 会话级别的一级缓存,mapper应用级别的二级缓存mybatis的常用配置参数为什么要使用mybatis动态sql的帮我们完成了什么if 判断choose when otherwise 从多个条件中选取一个foreach 集合进行遍历where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容 prefix 前面添加内容 suffix 后面添加内容 suffixOverrides 去掉的后面内容 prefixOverrides 去掉的前面内容理解mybatis的缓存缓存:缓存指的是将经常访问的数据保存到一个高速的数据存储区。缓存的目的就是为了快速访问一级缓存: 指的是将数据保存一以SqlSession中(同一个SqlSession)二级缓存: 指的是将数据保存到mapper中(同一个sqlSessionFactory)一级缓存失效的四种情况1.不在同一个SqlSession对象中2.执行语句的参数不同。缓存中也不存在数据。3.执行增,删,改,语句,会清空掉缓存4.手动清空缓存数据二级缓存使用步骤myBatis的二级缓存默认是不开启的。我们需要在mybatis的核心配置文件中配置setting选项 和 在Mapper的配置文件中加入cache标签。并且需要被二级缓存的对象必须要实现java的序列化接口。缓存的使用顺序说明当我们执行一个查询语句的时候。mybatis会先去二级缓存中查询数据。如果二级缓存中没有。就到一级缓存中查找。如果二级缓存和一级缓存都没有。就发sql语句到数据库中去查询。查询出来之后马上把数据保存到一级缓存中。当SqlSession关闭的时候,会把一级缓存中的数据保存到二级缓存中。
2024年10月02日
9 阅读
0 评论
0 点赞
2024-09-23
9-23_21-jdbc
填空题JDBC,是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问。它由一组用Java语言编写的类和接口组成。JDBC API:供程序员调用的接口与类,集成在java.sql和javax.sql包中。简单地说,JDBC 可做三件事:连接数据库、发送操作数据库的语句、处理结果。加载JDBC驱动是通过调用方法 Class.forName() 实现的。JDBC中与数据库建立连接是通过调用 DriverManager类的静态方法 getConnection() 实现的。有三种 Statement对象:Statement、PreparedStatement、CallableStatement(从PreparedStatement 继承)。ResultSet 对象是executeQuery()方法的返回值,它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet对象自动维护指向当前数据行的游标。每调用一次next()方法,游标向下移动一行。在JDBC中,事务操作成功后,系统将自动调用 commit() 提交,否则调用rollback()回滚。在JDBC中,事务操作方法都位于接口java.sql.Connection中。可以通过调用setAutoCommit(false)来禁止自动提交。JDBC中,事务开始的边界不是那么明显,它会开始于组成当前事务的所有SQL语句中的第一个被执行的时候选择题只要是通过 JDBC 进行数据库操作,都需要创建一个 Connection 对象来建立与数据库的连接,然后才能执行 CRUD(创建、读取、更新、删除)操作。Connection 对象是执行 SQL 语句和进行事务管理的基础使用 Connection 对象的 prepareStatement()方法可以创建一个 PreparedStatement 接口的实例实际上,Statement 的 executeUpdate()方法返回的是一个 int 类型的值,表示执行的 SQL 语句影响的行数,而不是一个布尔值。如果是执行插入、更新或删除操作,这个方法返回的是受影响的行数;如果是执行创建或删除表的操作,则返回 0如果 JDBC 执行查询语句没有查询到数据,ResultSet 对象不会是 null,而是可以正常创建,但是它的第一条记录是空的,即调用 next()方法会返回 false。ResultSet 对象的记录指针初始状态下并不指向第一条记录,而是在结果集之外。必须先调用 next()方法,如果返回 true,那么记录指针才会指向第一条记录。在 JDBC 编程中,要获取 ResultSet 对象 rs 的第一列数据,可以使用列的索引(从 1 开始)或者列的名称SELECT COUNT(_) FROM emp;这条 SQL 语句是用来统计 emp 表中的记录数。即使表中没有任何数据,COUNT(_)也会返回一个数值,即 0,而不是 null。因此,ResultSet 中将会是有数据的,具体来说,它会包含一个值为 0 的单一数据行。PreparedStatement 可以执行带有问号占位符的预编译 SQL 语句,但它也可以执行其他类型的 SQL 语句,只要这些语句在创建 PreparedStatement 对象时被指定。问号占位符用于预编译时的参数化查询,以提高性能和安全性,但不是 PreparedStatement 唯一能执行的语句类型在 PreparedStatement 中,参数是通过索引位置来设置的,索引从 1 开始。所以,要为第三个问号赋值,应该使用索引 3(因为索引是从 1 开始的)判断题正确。JDBC对Java程序员而言是接口模型,提供了一组操作数据库的接口;对实现与数据库连接的服务提供商而言是API,提供了实现这些接口的具体方法。正确。这是JDBC访问数据库的标准步骤。正确。ResultSet对象确实有记录指针,并且使用next()方法遍历结果集是常见的做法。错误。循环完毕后,ResultSet对象的游标不会指回第一条记录,而是停留在结果集的末尾。正确。关闭不再需要的Statement和Connection对象是一种好的编程实践,可以释放数据库资源。错误。虽然ResultSet可能会在某些情况下自动关闭,但最佳实践是显式地关闭它,以确保资源被正确释放。错误。关闭资源的顺序应该是先关闭ResultSet,然后是Statement,最后是Connection。这样做是因为Statement和ResultSet都依赖于Connection,一旦关闭了Connection,与之相关的Statement和ResultSet都会变得无效。错误。在JDBC中,事务操作默认是自动提交的,除非调用了setAutoCommit(false)来禁用自动提交。简答题不同类型的JDBC驱动:Type 1: 完全用本地语言编写的驱动,通常称为JDBC-ODBC桥。它使用ODBC API来与数据库进行通信。Type 2: 部分用本地语言编写,驱动本身充当JDBC和数据库之间的中间层。Type 3: 纯Java驱动,使用本地协议直接与数据库进行通信。Type 4: 纯Java驱动,通过网络协议与数据库进行通信。JDBC的操作步骤:加载JDBC驱动。创建数据库连接(Connection对象)。创建Statement或PreparedStatement对象。执行SQL语句。获取并处理结果(ResultSet)。关闭所有资源(ResultSet、Statement、Connection)。execute, executeQuery, executeUpdate的区别:executeQuery: 用于执行返回数据集的查询语句,返回ResultSet对象。executeUpdate: 用于执行插入、更新或删除操作的SQL语句,返回受影响的行数。execute: 可以执行任何类型的SQL语句,返回一个boolean值,如果第一个结果是一个ResultSet对象,则返回true,否则返回false。它还可以返回一个ResultSet对象或更新计数。JDBC的ResultSet:ResultSet是JDBC API中的一个接口,代表从数据库执行查询操作后返回的数据集。它提供了一种方式来逐行遍历查询结果。ResultSet通常通过executeQuery方法获得,它包含了查询结果集中的数据。相对于Statement,PreparedStatement的优点:性能:PreparedStatement支持预编译,可以提高执行效率,特别是对于频繁执行的相同SQL语句。安全性:PreparedStatement可以有效防止SQL注入攻击,因为它使用参数化查询。灵活性:可以通过设置不同的参数值来重复使用同一个PreparedStatement对象。JDBC的事务管理:定义:事务是一组原子性的SQL操作,要么全部成功,要么全部失败。为什么需要:事务提供了数据的完整性和一致性。在执行一系列数据库操作时,如果其中任何一个操作失败,事务可以回滚到操作之前的状态,确保数据不会处于不一致的状态。操作:通常包括commit(提交事务)和rollback(回滚事务)。可以通过Connection对象的setAutoCommit方法来控制事务的自动提交行为。
2024年09月23日
13 阅读
0 评论
0 点赞
2024-09-17
08-sql执行顺序
掌握: sql执行顺序和注意点关键点: 查询完成后排序,大致顺序不便关键: 分析一个需求,给出解决思路#sql语句的执行顺序 #语法 : #select 关键字 列名... from 表名 where 表达式 group by 列名... having 表达式 order by 列名... #执行顺序 :from -> where -> group by -> having -> select -> order by #注:where 不支持组函数参加表达式 # having 支持组函数 并且会预加载组函数结果 #语句中的 任意功能都视情况添加 #只有mysql支持 直接编写having #其他数据库要求having子句必须在group by之后 #错误写法 : select * from employees having salary > 5000; #group by 关键字 允许分组多列 且分组后 一定不存在重复数据 所以在某些情况下 分组可以起到去重的功能 #如果select 语句中 存在普通列和组函数列 则group by 要求必须对所有普通列进行分组
2024年09月17日
17 阅读
0 评论
0 点赞
1
2
...
11