File:是文件和目录路径名的抽象表示
public class FileDemo01 {
public static void main(String[] args) {
//File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的File实例。
File file1 = new File("E:\\2\\1.txt");
System.out.println(file1);
//File(String parent,String child):从父路径名字符串和子路径名字符串创建新的File实例。
File file2 = new File("E:\\2","1.txt");
System.out.println(file2);
//File(File parent,string child):从父抽象路径名和子路径名字符串创建新的File实例。
File file3 = new File("E:\\2");
File file4 = new File(file3,"1.txt");
System.out.println(file4);
}
}
public class FileDemo02 {
public static void main(String[] args) throws IOException {
//需求1:createNewFile() 我要在E:\2\test目录下创建一个文件java.txt
File file1 = new File("E:\\2\\test\\java.txt");
System.out.println(file1.createNewFile());
//需求2:mkdir() 我要在E:\2\test目录下创建一个目录JavasE
File file2 = new File("E:\\2\\test\\javaSE");
System.out.println(file2.mkdir());
//需求3:mkdirs() 我要在E:\2\test目录下创建一个多级目录JavasE\fileTest
File file3 = new File("E:\\2\\test\\javaSE\\fileTest");
System.out.println(file3.mkdirs());
}
}
public class FileDemo03 {
public static void main(String[] args) {
System.out.println("5的阶层是" + fn(5));
}
public static int fn(int num) {
if (num == 1) {
return 1;
} else {
return num * fn(num - 1);
}
}
}
用递归遍历文件目录
public class FileDemo03 {
public static void main(String[] args) {
File file = new File("E:\\2\\test");
fn(file);
}
public static void fn(File file) {
File[] files = file.listFiles();
if(files != null){
for (File file1:files){
if (file1.isDirectory()){
fn(file1);
}else {
System.out.println(file1.getAbsolutePath());
}
}
}
}
}
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
public class DruidTest {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
InputStream is = DruidTest.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
工具类代码
/**
* Druid连接池的工具类
*/
public class JDBCUtils {
/**
* 1.定义成员变量 DataSource
*/
private static DataSource ds ;
static{
try {
//1.加载配置文件
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 释放资源
*/
public static void close(Statement stmt,Connection conn){
close(null,stmt,conn);
}
public static void close(ResultSet rs , Statement stmt, Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 获取连接池方法
*/
public static DataSource getDataSource(){
return ds;
}
}
测试使用Druid工具类的效果,还是使用prepareStatement防止sql注入
public class DruidTest02 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
//1、给user 添加一条记录
try {
conn = JDBCUtils.getConnection();
String sql = "INSERT INTO user VALUES(null,?,?);";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"test");
pstmt.setString(2,"123456");
int i = pstmt.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt,conn);
}
}
}
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
执行的代码
public class JDBCTemplateDemo01 {
public static void main(String[] args) {
//1、导入jar包
//2、创建JDBCTemplate对象
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
//3、调用方法
String sql = "update user set password = ? where id = ?";
int update = template.update(sql, "12321",6);
System.out.println(update);
}
}
输出结果为1
查询数据库表中的user 表,将其封装为Emp对象的List集合
//查询数据表user中的所有信息
public class JDBCDemo02 {
@Test
public void test01() {
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select * from user";
List<User> query = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
for (User user : query) {
System.out.println(user);
}
}
}
查询数据库里面的记录数量
/**
* 查询数据库中的记录条数
*/
@Test
public void test02() {
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select count(id) from user";
Long total = template.queryForObject(sql, Long.class);
System.out.println(total);
}
< img > : 展示图片
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--展示一张图片-->
<img src="image/avi.png" align="right" alt="古镇 " width="623" height="622"/>
<!--
相对路径:
* 以.开头的路径
* ./:代表当前目录 ./image/1.png 如果在同一级目录下的话,./可以省略
../:代表上一级的目录
-->
<img src="../image/avi.png" align="left" alt="用上一级目录显示的图片"/>
</body>
</html>
< a > :超链接 href
< target >: _blank 在新的选项卡展示页面;_self在本页内打开;规定在何处打开目标 URL。仅在 href 属性存在时使用。
<!--新打开一个选项卡-->
<a href="https://www.baidu.com/" target="_blank">点我</a>
<!--在本页内打开-->
<a href="https://www.baidu.com/" target="_self">点我</a>
<a href="./111.html" target="_self">列表标签</a>
<a href="https://www.baidu.com/">
<img src="../image/avi.png" alt="图片test" align="left">
</a>
结合css进行操作的
<span>12313</span>
<span>12311231</span>
<hr>
<div>1312312</div>
<div>131412</div>
html 5中为了提高程序的可读性,提供了一些标签。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1" width="50%" align="center" cellpadding="0" cellspacing="0" bgcolor="#faebd7">
<tr >
<!--占2行-->
<th rowspan="2">编号</th>
<th>姓名</th>
<th>成绩</th>
</tr>
<tr align="center">
<td>1</td>
<td>hws</td>
<td>100</td>
</tr>
<tr align="center">
<td>2</td>
<!--占2列-->
<td colspan="2">hhh</td>
<td>90</td>
</tr>
</table>
</body>
</html>
使用的标签:form
form:用于定义表单的。可以定义一个范围,范围代表采集用户数据的范围
* 属性:
* action:指定提交数据的url
* method:提交数据的方式 比较常用 get 或者 post
* 表单中的数据想要被提交,必须指定其name属性
实现的代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="#" method="get">
用户名:<input name="username"> <br>
密码:<input name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
input : 可以通过type属性值,改变元素展示的样式
type属性:
text : 文本输入框,默认值
1、 placeholder可描述输入input 字段预期值的简短的提示信息
password : 密码输入框
radio :单选框
1、要想让多个单选框实现单选的效果,则多个单选框的name属性值必须一样。
2、一般会给每一个单选框提供value属性,指定其被选中后提交的值
3、checked属性,可以指定默认值
checkbox : 多选框
1、一般会给每一个单选框提供value属性,指定其被选中后提交的值
2、checked属性,可以指定默认值
file : 文件选择框
hiddle : 文件
按钮 :
1、普通的按钮 button,与js一起使用
2、submit 按钮
3、图片的按钮,用src < input type=“image” src="…/image/avi.png">
日期:
1、date 传值的是 birthday=2020-05-06
2、datetime-local 传值的是 birthday=2020-05-01T12%3A03
**label : 指定输入项的描述信息**
注意:
label的for属性一般和input的id值相对应,如果对应了,则点击label区域,会让input输入框获取焦点。
实现的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="#" method="get">
<label for="username">用户名:</label>
<input type="text" name="username" id="username" placeholder="请输入用户名"><br>
<label for="password">密码:</label>
<input type="password" name="password" id="password" placeholder="请输入用户名"><br>
<label>性别:</label>
<input type="radio" name="gender" value="male" checked="checked">男
<input type="radio" name="gender" value="female">女<br>
<label>爱好:</label>
<input type="checkbox" name="hobbies" value="shopping">购物
<input type="checkbox" name="hobbies" value="java">java
<input type="checkbox" name="hobbies" value="game">游戏<br>
<input type="file" name="file"><br>
<input type="hidden" name="id" value="11"><br>
<label>生日</label>
<input type="datetime-local" name="birthday">
<label>邮箱</label>
<input type="email" name="email">
<input type="submit" value="提交">
</form>
</body>
</html>
option是指定的列表项,selected是默认选中的
<label>省份</label>
<label>
<select name="province" >
<option value=" ">--请选择省份--</option>
<option value="1" selected>浙江省</option>
<option value="2">上海市</option>
<option value="3">河南省</option>
</select>
</label><br>
cols : 指定列数,每一行有多少个字符
rows : 指定行数