YorkWu's Blog - 后端
type: channel
link: https://wyy.ink/tag/%E5%90%8E%E7%AB%AF/
items: JDBC基础
items: MySQL数据库基础
items: Servlet基础
items: Java IO流
items: Java异常类&常用类

JDBC基础
type: item
date: 2022-06-19T18:00:00+08:00
description: JDBC基础JDBC是一个Java中用于连接数据库的API，通过JDBC可以方便的以任何形式访问关系型数据库中的数据。基本流程连接到MySQL将查询指令发送到数据库处理数据库送回的信息创建JDBC Application导包import java.sql.*;注册MySQL驱动Class.forName("com.mysql.cj.jdbc.Driver"); // mysql 5以上 Class.forName("com.mysql.jdbc.Driver"); // mysql 5及以下连接到数据库String DBname = "students"; // 数据库名 String user = "root"; // 用户名 String pw = "12345678"; // 用户密码 String uri = "jdbc:mysql://localhost:3306/" + DBName + "?useSSL=false&characterEncoding=utf-8"; Connection con = DriverManager.getConnection(uri, user, pw);使用已经创建好的连接创建一个Statement用于处理SQL语句Statement stmt = con.createStatement();处理SQL语句String cmd = "SELECT * FROM class"; ResultSet rs = stmt.executeQuery(cmd);从结果集中提取数据while (rs.next()) { int id = rs.getInt("student_id"); String name = rs.getString("stu_name"); Date date = rs.getDate("date"); System.out.printf("ID: %d, Name: %s, Date: %s\n", id, name, date); }执行结果：ID: 1, Name: YorkWu, Date: 2022-06-19 ID: 2, Name: a, Date: 2022-06-19 ID: 3, Name: b, Date: 2022-06-19 ID: 4, Name: c, Date: 2022-06-19 ID: 5, Name: d, Date: 2022-06-19 ID: 6, Name: e, Date: 2022-06-19 ID: 7, Name: f, Date: 2022-06-19关闭连接rs.close(); stmt.close(); con.close();注意注册数据库驱动程序，一般使用Class.forName()即可。数据库url格式mysql:jdbc:mysql://hostname/databaseName[?useSSL=false&characterEncoding=utf-8]记得关闭连接JDBC StatementsStatement用于对数据库进行通用访问，可以处理静态SQL语句（一般的SQL语句），实时编译SQL语句执行，由于需要拼接SQL语句，容易造成SQL注入。PreparedStatement，预编译SQL语句，在需要多次使用的语句中使用。创建时可以使用"?"占位，运行时替换。PreparedStatement示例String cmd = "SELECT * FROM class WHERE student_id >= ?"; PreparedStatement ps = con.prepareStatement(cmd); ps.setInt(1, 3); ResultSet rs = ps.executeQuery(); while (rs.next()) { // do something... } rs.close(); ps.close();可以使用setXXX(idx, val)函数设置占位符"?"的值，XXX表示要设置的类型，例如Int，String，其中idx表示第几个占位符表示的位置，val表示要更改的值，注意，idx从1开始而不是从0开始！！！JDBC ResultSet结果集中有一个光标指向当前在结果的第几行，通过rs.next()将光标移动到下一行，如果不存在下一行则返回false。ResultSet中的方法beforeFirst() 光标移动到第一行之前afterLast() 光标移动到最后一行之后first() 光标移动到第一行last() 光标移动到最后一行absolute(int row) 光标移动到第row行relative(int row) 光标偏移row行，row可为负…

MySQL数据库基础
type: item
date: 2022-04-18T19:32:00+08:00
description: MySQL基础连接MySQL通过Shell控制台连接MySQL[root@host]# mysql -u root -p - 也可以创建其他用户之后，使用其他用户登陆 - 推出mysql使用exit命令除此之外，Java可以通过JDBC连接到MySQL数据库MySQL基本操作sql语句是操作关系型数据库的一种语句，一般以分号结尾。sql语句不区分大小写创建数据库CREATE DATABASE 数据库名;使用mysqladmin创建数据库[root@host]# mysqladmin -u root -p create ABC Enter password:******以上语句创建了数据库ABC删除数据库drop database 数据库名;使用mysqladmin删除数据库[root@host]# mysqladmin -u root -p drop ABC Enter password:******删除了名为ABC的数据库注意⚠️一旦删除数据库，该数据库所有内容将消失且不可恢复选择数据库use ABC;以上语句选择了ABC数据库，意思是之后进行的操作将是对数据库ABC进行的操作MySQL数据类型MySQL支持很多种类型，主要可以分为：数值、字符串、日期三种类型数值类型整数类型分为很多种，TINYINT、SMALLINT、MEDIUMINT、INT或INTEGER、BIGINT分别占用1、2、3、4、8字节空间，且全部有有符号类型和无符号类型。浮点类型三种FLOAT占用4Bytes$(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)$DOUBLE占用8Bytes$(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)$DECIMAL精确浮点类型，对于DECIMAL(M,D)有M位有效数字，D位小数日期和时间DATE占用3Bytes范围$1000-01-01/9999-12-31$格式为年-月-日TIME占用3Bytes范围$-838:59:59/838:59:59$格式为小时:分钟:秒YEAR占用1Bytes范围$1901/2155$DATETIME占用8Bytes范围1000-01-01 00:00:00/9999-12-31 23:59:59TIMESTAMP占用4Bytes范围1970-01-01 00:00:00到格林威治时间2038年1月19日 凌晨 03:14:07时间戳字符串类型创建数据表CREATE TABLE table_name (column_name column_type);例CREATE TABLE IF NOT EXISTS student( student_id INT UNSIGNED AUTO_INCREMENT, student_name VARCHAR(100) NOT NULL, date DATE, PRIMARY KEY (student_id) )ENGINE=InnoDB DEFAULT CHARSET=utf8;注：AUTO_INCREMENT表示自增（每次会自动加一）一般用于主键如果不希望某一列为空，可以使用NOT NULLPRIMARY KEY (student_id)将student_id设置为主键ENGINE 设置存储引擎，CHARSET 设置字符编码。注意：在添加表之前，先使用use切换到想要操作的数据库中删除数据表DROP TABLE table_name;插入数据INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );例INSERT INTO table_name (student_id, student_name, date) VALUES (1, "YorkWu", NOW());如果要插入的是字符串类型，需要使用双引号引起来。日期类型，可以使用类似“2022-04-11”的方法注入（包括引号）查询数据SELECT column_name,column_name FROM table_name [WHERE Clause] [LIMIT N] [OFFSET M]查询中可以选择一个或者多个表，用逗号隔开可以读取一条或多条记录可以使用星号*来代替其他字段，表示选择全部可以使用WHERE包含一些条件可以用LIMIT表示限制返回…

Servlet基础
type: item
date: 2022-04-04T16:11:00+08:00
description: Servlet基础什么是ServletServlet是一种规范，对于B/S结构，需要一个Server处理由Browser发送的请求，Servlet是一个处理这些请求的模块，通过Servlet可以处理浏览器的请求并且不涉及底层源码。Servlet提供了一系列规范，这样使得所有遵循Servlet规范的webapp都可以在不同的服务器运行，例如Tomcat。规范了哪些接口规范了哪些类规范了一个web应用中应该有哪些配置文件规范了一个web应用中配置文件的名字规范了一个web应用中配置文件存放的路径规范了一个web应用中配置文件的内容规范了一个合法有效的web应用它的目录结构应该是怎样的。.....符合Servlet规范的webapp开发步骤第一步：在webapps目录下新建一个目录，起名crm（这个crm就是webapp的名字）。注意：crm就是这个webapp的根第二步：在webapp的根下新建一个目录：WEB-INF注意：全部大写。第三步：在WEB-INF目录下新建一个目录：classes这个目录下存放的是Java程序编译之后的class文件。第四步：在WEB-INF目录下新建一个目录：lib注意：这个目录不是必须的。但如果一个webapp需要第三方的jar包的话，这个jar包要放到这个lib目录下，这个目录的名字也不能随意编写，必须是全部小写的lib。例如java语言连接数据库需要数据库的驱动jar包。那么这个jar包就一定要放到lib目录下。第五步：在WEB-INF目录下新建一个文件：web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0" metadata-complete="true"> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.bjpowernode.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>目录结构webapproot |------WEB-INF |------classes(存放字节码) |------lib(第三方jar包) |------web.xml(注册Servlet) |------html |------css |------javascript |------image ....Servlet示例import jakarta.servlet.*; import java.io.IOException; //实现Servlet接口 public class AServlet implements Servlet { // init为初始化 // init方法只执行一次 // 在AServlet对象第一次被创建之后执行。 // init方法通常是完成初始化操作的。 // init方法在执行的时候AServlet对象已经被创建出来了。 @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("AServlet's init method execute!"); } // service方法：是处理用户请求的核心方法。 // 只要用户发送一次请求，service方法必然会执行一次。 @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("AServlet's service method execute!"); } // destroy方法也是只执行一…

Java IO流
type: item
date: 2022-03-31T19:01:00+08:00
description: JavaIO流用于数据的输入输出，所有输入流都是InputStream（数据输入）或Reader（文本输入）的子类，输出流都是OutputStream（数据输出）或Writer（文本输出）的子类。File类File类处理文件的基本信息例如文件所在目录，文件长度或文件读写权限等，不进行对文件的读写。File类构造函数：File(String filename);File(String directoryPath, String filename);File(File dir, String filename);filename为文件名，directoryPath是文件路径，dir为一个目录。默认第一种要求该文件与当前在同一路径下。文件属性public String getName():获取文件名public boolean canRead():返回文件是否可读public boolean canWrite():~可写public boolean exists()判断文件是否存在public long length()获取文件长度public String getParent()获取文件父目录public boolean isFile()判断文件是否为文件（不是目录）public boolean isDirectory()判断是否为一个目录public boolean isHidden()判断是否为隐藏文件public long lastModified()获取最后被修改的时间（时间戳）目录创建目录：public boolean mkdir()创建成功返回true，失败或已存在返回false列出目录下文件public String[] list():列出目录下所有文件public File[] listFiles(): 用File对象返回所有文件列出目录下指定类型的文件public String[] list(FilenameFilter obj);public File[] listFiles(FilenameFilter obj);其中，FilenameFilter为一个接口，其中有一accept方法public boolean accept(File dir, String name);对于一个文件，File对象将调用obj的accept方法，当accept返回为True则会将该文件添加到返回的数组中。例：// Example10_2.java(Demo) import java.io.*; public class Example10_2 { public static void main(String args[]) { File dirFile = new File("."); FileAccept fileAccept = new FileAccept(); fileAccept.setExtendName("java"); String fileName[] = dirFile.list(fileAccept); for(String name:fileName) { System.out.println(name); } } } //FileAccept.java(Impl) import java.io.*; public class FileAccept implements FilenameFilter { private String extendName; public void setExtendName(String s) { extendName="."+s; } public boolean accept(File dir,String name) { //重写接口中的方法 return name.endsWith(extendName); } }文件的创建与删除当创建一个文件对象后，若文件不存在可以使用方法创建一个文件，也可以用方法删除一个文件。public boolean creatNewFile():若不存在文件则将创建一个public boolean delete();若存在该文件将删除当前文件运行可执行文件使用Runtime类声明一个对象，然后使用getRuntime得到一个对象，之后可以使用exec(String command)执行一个命令（command为命令）。例：import java.io.*; public class Example10_3 { public static void main(String args[]) { try{ Runtime ce=Runtime.getRuntime(); File file=new File("c:/windows","No…

Java异常类&常用类
type: item
date: 2022-03-29T21:17:00+08:00
description: Java异常异常类程序运行时抛出的一些错误。Java使用throw抛出一个Exception子类的实例表示异常发生。大部分异常均直接或者间接继承Exception类。try-catch通过try-catch语句可以处理异常，一旦出现异常，将会执行catch中的语句。try { ... } catch(ExceptionSubClass1 e) { ... } catch(ExceptionSubClass2 e) { }注意：这些catch里的语句不可存在继承的关系。自定义异常类继承Exception以定义自己的异常类。一个方法定义时候可以使用throws声明要产生的异常，在需要抛出异常时候可以使用throw关键字抛出异常。ExceptionSubClass:public class BankException extends Exception { String message; public BankException(int m,int n) { message="入账资金"+m+"是负数或支出"+n+"是正数，不符合系统要求."; } public String warnMess() { return message; } } BankClass:public class Bank { private int money; public void income(int in,int out) throws BankException { if(in<=0||out>=0||in+out<=0) { throw new BankException(in,out); //方法抛出异常，导致方法结束 } int netIncome=in+out; System.out.printf("本次计算出的纯收入是:%d元\n",netIncome); money=money+netIncome; } public int getMoney() { return money; } }DemoClass:public class Demo { public static void main(String args[]) { Bank bank=new Bank(); try{ bank.income(200,-100); bank.income(300,-100); bank.income(400,-100); System.out.printf("银行目前有%d元\n",bank.getMoney()); bank.income(200, 100); bank.income(99999,-100); } catch(BankException e) { System.out.println("计算收益的过程出现如下问题:"); System.out.println(e.warnMess()); } System.out.printf("银行目前有%d元\n",bank.getMoney()); } }finally格式try { ... } catch(...) { ... } finally{ ... }无论catch有没有捕获异常，finally中语句都会被执行注意：如果catch中使用return，依然会执行finally中部分！如果使用system.exit(0)则不会执行。断言调试使用可以让代码不处理某项异常，直接终止程序程序正式运行的时候关闭断言，再需要debug时候再开启易于发现某些致命错误断言语法格式使用assert声明一条断言语句格式1assart booleanException;格式2assart booleanException:messageException;例如：assart number >= 0则条件不符合程序立即停止对于第二种类型，停止后还会输出“:”之后的内容启用方法默认关闭，编译时加入-ea参数开启断言Java常用类String类构造String对象常量对象String s = "Hello,String!";此字符串将加入常量池！String对象String t = new String("Hello,String!");t只是引用，存放真正字符串的内存地址如此，即使t和s内保存的字符串相同，但在不同位置，显然$s\neq t$对String对象输出，输出的是其实体。也可从一个String对象创建另一个String对象构造方法String(char[] a)使用字符数组创建一个String对象。String(char[] a, int sIndex, int eIndex)使用a数组的s~e区间建立一个String对象引用String常量两个String变量若同时引用同一个字面量，则其具有相同…