〇、本模块内容简介

30=(DB5+前端5+Web Core15+Project5)

Junit、注解

MySQL、JDBC、JDBCUtils、c3p0、Druid连接池及工具类、JDBCTemplate

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

HTML、CSS、JavaScript、BootStrap、Xml、Jsoup、JQuery

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

Tomcat、Servlet、Request、Response、Cookie、Session、JSP、EL、JSTL、Maven、Redis、Nginx、Linux

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

基于缓存与异步技术的旅游网设计

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

一、基础增强

1、Junit单元测试

  • 测试分类:黑盒、白盒、单元
  • 使用步骤:
    • 定义类:*.test.类名Test,如com.itheima.test.UserTest
    • 定义方法:testXxx(),如testAdd()
    • 加@Test注解,并导入依赖
    • 使用断言处理结果:Assert.assertEquals(期望的结果,运算的结果);
  • @Before和@After用于资源的申请与释放

2、注解

  • 概念:Annotation,在jdk1.5后,说明程序中的类、方法、变量、参数和包(给计算机看的注释)
  • 作用:编译检查@Override重写、生成文档@Documented、使用反射进行代码分析
  • 学习
    • 预定义注解/内置注解

      • @Override:检查是否继承自父类
      • @Deprecated:标记过时的方法,编译警告及删除线。如Date类建议修改为Calender类
      • @SupressWarnings("all"):忽略注解声明的警告
    • 自定义注解
      • 格式
元注解
@Documented //注解会抽取到文档中
@Retention(RUNTIME)//注解被保留的阶段:Source/Class/Runtime
@Target(TYPE,METHOD,FIELD)//作用位置:类、方法、成员变量
@Inherited //加注解的类的子类会自动继承父类注解
public @interface 注解名称(){ 属性列表,如
   public abstaract String show();
}
      • 本质:反编译后发现是一个继承Annotation的接口(注释类型扩展的公共接口)
      • 属性:可以定义的抽象方法,使用时需要赋值
        • 返回值类型:不包括void和对象
  • 程序中的解析注解:获取注解属性值
    • 获取注解定义位置的对象(Class,Method,Field)
    • 获取指定注解getAnnotation(Class)--相当于内存中生成一个注解接口的子类实现对象
 1 package com.liujinhui.Day1209BaseEnhance.annotation;
2 import java.io.InputStream;
3 import java.lang.reflect.Method;
4 import java.util.Properties;
5 /*
6 假设的框架类
7 改配置文件使程序的扩展性更强,配置文件中使用了全类名,则使用了反射机制
8 * */
9 @Pro(className = "com.liujinhui.Day1209BaseEnhance.annotation.Demo1",methodName = "show")
10 //要写全类名
11 public class ReflectTest {
12 /**
13 * @author: Liu Jinhui
14 * @description: 创建任意对象
15 * @date: 2020/12/9 20:42
16 * @return * @param null
17 */
18 public static void main(String[] args) throws Exception{
19 //可以创建任意类的对象,可以执行任意方法
20 /*
21 前提:不能改变该类的任何代码,可以创建任意类的对象,可以执行任意方法
22 * */
23 //1.解析注解
24 //1.1获取该类的字节码文件对象
25 Class<ReflectTest> reflectTestClass = ReflectTest.class;
26 //2.获取上面的注解对象
27 //method也有getAnno
28 Pro an = reflectTestClass.getAnnotation(Pro.class);
29 //其实就是在内存中生成了一个该注解接口的子类实现对象
30 /*
31 public class ProIMpl implements Pro{
32 public String className(){
33 return "com.liujinhui.Day1209BaseEnhance.annotation.Demo1";
34 }
35 public String methodName(){
36 return "show";
37 }
38 */
39 //3.调用注解对象中调用的抽象方法,获取返回值
40 String className = an.className();
41 String methodName = an.methodName();
42 System.out.println(className+methodName);
43 //4.加载该类进内存
44 Class cls = Class.forName(className);
45 //5.创建对象
46 Object obj = cls.newInstance();
47 //6.获取方法对象
48 Method method = cls.getMethod(methodName);
49 //7.执行方法
50 method.invoke(obj);
51 }
52 }
1 /*
2 描述需要执行的类名和方法名
3 */
4 @Target({ElementType.TYPE})
5 @Retention(RetentionPolicy.RUNTIME)
6 public @interface Pro {
7 String className();
8 String methodName();
9 }

3、基于注解解析的自定义测试框架

使用技术:字符缓冲输出流、注解解析

 1 package com.liujinhui.Day1209BaseEnhance.annotation.demo;
2
3 import java.lang.annotation.ElementType;
4 import java.lang.annotation.Retention;
5 import java.lang.annotation.RetentionPolicy;
6 import java.lang.annotation.Target;
7
8 @Target(value = {ElementType.METHOD})
9 @Retention(RetentionPolicy.RUNTIME)
10 @interface Check {
11 }
 1 package com.liujinhui.Day1209BaseEnhance.annotation.demo;
2
3 /**
4 * 小明定义的计算器类
5 * 需要测试是否有错误
6 */
7 public class Calculator {
8 //加法
9 @Check
10 public void add(){
11 System.out.println("1+0="+(1+0));
12 }
13 //减法
14 @Check
15 public void sub(){
16 System.out.println("1 - 0 ="+(1 - 0));
17 }
18 //乘法
19 @Check
20 public void mul(){
21 System.out.println("1*0="+(1*0));
22 }
23 //除法
24 @Check
25 public void div(){
26 System.out.println("1/0="+(1/0));
27 }
28 //结果
29 public void show(){
30 System.out.println("永无bug...");
31 }
32 }
 1 package com.liujinhui.Day1209BaseEnhance.annotation.demo;
2
3 import java.io.BufferedWriter;
4 import java.io.FileWriter;
5 import java.io.IOException;
6 import java.lang.reflect.InvocationTargetException;
7 import java.lang.reflect.Method;
8
9 /**
10 * 简单的测试框架
11 * 当主方法执行后,会自动执行被检测的所有方法(加了@Check的方法)
12 * 判断方法是否有异常,并记录到文件中
13 */
14 public class TestCheck {
15 public static void main(String[] args) throws IOException {
16 //1.创建计算器对象
17 Calculator c = new Calculator();
18 //2.获取字节码文件对象
19 Class cls = c.getClass();
20 //3.获取所有的方法
21 Method[] methods = cls.getMethods();
22 int number=0;//记录异常出现的次数
23 BufferedWriter bw=new BufferedWriter(new FileWriter("bug.txt"));
24 for (Method method : methods) {
25 //4.判断方法上是否有check注解
26 if (method.isAnnotationPresent(Check.class)) {
27 //判断当前方法上有无指定注解
28 //5.有就执行该方法
29 try {
30 method.invoke(c);
31 } catch (Exception e) {
32 //6.捕获异常
33 number++;
34 //记录到文件中
35 bw.write(method.getName() + "方法出异常了");
36 bw.newLine();
37 bw.write("异常的名称:" + e.getCause().getClass().getSimpleName());
38 bw.newLine();
39 bw.write("异常的原因:" + e.getCause().getMessage());
40 bw.newLine();
41 bw.write("-----------------------");
42 }
43 }
44 }
45 bw.write("本次测试共出现"+ number +"次异常");
46 bw.flush();
47 bw.close();
48 }
49 }

二、MySQL基础

1、概念

  • 持久化和管理数据的仓库
  • 常用

2、DB软件的基本使用

  • 安装
  • 卸载
  • 配置-启动、关闭和登录
    • 服务:services.msc
    • 命令:net start mysql/net stop mysql
    • 远程登录:-h127.0.0.1或-host=127.0.0.1

3、SQL语句

  • 概念:结构化查询语言,关系型的准则;各种数据库有对应方言
  • 语法:
    • 注释:-- xx或/* xx */或# xx(特有)
  • 分类:
    • DDL:建库、建表
    • DML:CUD
      • 改表名:alter table 表名 rename to 新表名;
      • 改字符集:alter table stu character set utf8;
      • 改列名:alter table 表名 change 列名 新列名 新的类型;
      • 删表:DELETE和TRUNCATE(先删再建效率高)
    • DQL:Retrieve
    • DCL:权限控制

三、MySQL约束

1、DQL查询语句

  • 排序
  • 聚合:排除空值,空值需要使用IFNULL函数
  • 分组查询:where不能加聚合函数,在分组前限定分组的记录
  • 分页查询:
    • limit 开始索引,每页条数
    • 公式:开始索引=(当前页码-1)*每页条数
    • 如:(1-1)*3,(2-1)*3,(3-1)*3

2、约束

  • 主键(自增长)、非空、唯一、外键(constraint)
  • 外键-级联操作ON DELETE/UPDATE CASCADE

3、数据库的设计:多表关系

4、数据库设计范式

5、数据库的备份还原

  • 备份:mysqldum -uroot -proot ssm > d://db1.sql
  • 还原:source d://db1.sql

四、MySQL多表和事务

1、多表查询

  • 笛卡尔积(×)
  • 内连接:显式where,隐式inner join 表名 on 条件
  • 外连接:
    • 左外:左表所有--left outer join
    • 右外:右表所有--right outer join
  • 子查询:
    • 单行单列:条件运算符
    • 多行单列:in
    • 多行多列:作为虚拟表

2、事务

  • 概念:start transaction、commit(MySQL自动提交1,改为手动提交SET @@autocommit=0;)、rollback(放到最后)
  • 特征:原子性、一致性※、持久性、隔离性
  • 隔离级别:
    • 脏读、不可重复读/虚读、幻读

3、DCL

  • SQL分类:DDL是操作数据库和表,DML、DQL是操作表中数据,DCL是管理用户权限
  • 用户管理:添加删除用户,修改用户、忘记密码解决
  • 权限管理:查询(SHOW GRANTS FOR)、授予(GRANT ALL ON *.* TO )、撤销权限(REVOKE SELECT ON *.* FROM root@主机名)

五、JDBC

1、概念:Java Database Connectivity

  • 数据库操作规则,本质是接口,真正执行的是实现类

2、对象详解

  • DriverManager--驱动管理对象

    • 注册驱动:Class.forName("com.mysql.jdbc.Driver");---jdk1.5后可以省略,把字节码文件加载至内存

      • Driver类内的静态代码块实现了DriverManager类的registerDriver(Driver driver) 方法,本质相同
    • 获取连接:Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/db3","root","root");
  • Connection--数据库连接对象

    • 获取SQL执行对象:Statement stmt = conn.createStatement();
    • 事务管理
      • 开启事务void setAutoCommit(boolean autoCommit)
      • 提交事务void commit()
      • 回滚事务void rollback()
  • Statement--执行SQL的对象
    • 执行任意SQL:boolean execute()
    • 执行DML和DDL:int executeUpdate()
    • 执行DQL:ResultSet executeQuery(String sql)
  • ResultSet--结果集对象
    • 通过游标,获取每一行  rs.next()
    • 获取指定类型数据:   rs.getInt(1);---参数为列编号或列名
  • PreparedStatement--解决SQL注入的预处理对象
    • 之前:字符串拼接,会导致SQL注入安全性问题
    • 解决:
      • pstmt=conn.prepareStatement(String sql) ;---使用?从1开始做占位符
      • pstmt.setString(1,"zhangsan");

3、JDBC工具类抽取:JDBCUtils

  • 通过配置文件jdbc.properties配置数据库连接信息
  • 在工具类中设置获取连接方法和释放资源的方法
  1 package cn.itcast.utils;
2 import java.io.FileReader;
3 import java.io.IOException;
4 import java.net.URL;
5 import java.sql.*;
6 import java.util.Properties;
7
8 /**
9 * JDBC工具类
10 * 一个获取连接的方法
11 * 一个释放资源的方法
12 */
13 public class JDBCUtils {
14 private static String url;
15 private static String user;
16 private static String password;
17 private static String driver;
18 /**
19 * 文件的读取,只需要读取一次就可以拿到这些值
20 * 方案:通过静态代码块
21 */
22 static{
23 //读取配置资源文件,获取值
24 //BufeeredReader。。。麻烦
25 try {
26 //1.创建Properties集合类
27 Properties prop=new Properties();
28 //2.加载文件,代码提示
29 //prop.load(new FileReader("src/jdbc.properties"));
30 //找不到资源文件,最笨的方法---可以写绝对路径D:\IdeaProjects\liujinhui\day04_jdbc_20201220\src\jdbc.properties
31 //另外:获取src路径下的文件--->ClassLoader 类加载器:可以 加载字节码文件进内存,同时可以获取src下的资源文件
32 ClassLoader classLoader = JDBCUtils.class.getClassLoader();
33 //传的是以src相对的文件路径
34 //返回统一资源定位符,即文件的绝对路径
35 URL res= classLoader.getResource("jdbc.properties");
36 String path = res.getPath();
37 System.out.println(path);
38 prop.load(new FileReader(path));
39 //3.获取数据,赋值
40 url=prop.getProperty("url");
41 user=prop.getProperty("user");
42 password=prop.getProperty("password");
43 driver=prop.getProperty("driver");
44 //4.注册驱动
45 Class.forName(driver);
46 } catch (IOException e) {
47 e.printStackTrace();
48 } catch (ClassNotFoundException e) {
49 e.printStackTrace();
50 }
51 }
52 //Arrays等都是静态,方便类直接调用
53 /**
54 * 获取连接的工具方法
55 * @return 连接对象
56 */
57 //String url,String root,String password有参数仍然很麻烦
58 //通过私有变量、配置文件及静态代码块解决
59 public static Connection getConnection() throws SQLException{
60 return DriverManager.getConnection(url,user,password);
61 }
62 /**
63 * 释放资源
64 * @param stmt
65 * @param conn
66 */
67 public static void close(Statement stmt,Connection conn){
68 if (stmt!=null){
69 try {
70 stmt.close();
71 //conn.close();多个语句要放到多个try..catch中
72 } catch (SQLException e) {
73 e.printStackTrace();
74 }
75 }
76 if (conn!=null){
77 try {
78 conn.close();
79 } catch (SQLException e) {
80 e.printStackTrace();
81 }
82 }
83 }
84 /**
85 * 释放资源
86 * @param rs
87 * @param stmt
88 * @param conn
89 */
90 public static void close(ResultSet rs, Statement stmt, Connection conn){
91 if (stmt!=null){
92 try {
93 stmt.close();
94 //conn.close();多个语句要放到多个try..catch中
95 } catch (SQLException e) {
96 e.printStackTrace();
97 }
98 }
99 if (conn!=null){
100 try {
101 conn.close();
102 } catch (SQLException e) {
103 e.printStackTrace();
104 }
105 }
106 if (rs!=null){
107 try {
108 rs.close();
109 } catch (SQLException e) {
110 e.printStackTrace();
111 }
112 }
113 }
114 }

测试

1     /**
2 * 登录方法
3 */
4 public boolean login(String username ,String password){
5 if (username==null||password==null){
6 return false;
7 }
8 Connection conn=null;
9 Statement stmt=null;
10 ResultSet rs=null;
11 try {
12 //连接数据库判断是否登录成功
13 //1.获取连接,更改数据库只需要修改配置文件,可扩展性强
14 conn = JDBCUtils.getConnection();
15 //2.定义 sql
16 String sql="select * from user where username='"+username+"' and password='"+password+"'";
17 //3.获取执行SQL的对象
18 stmt = conn.createStatement();
19 //4.执行查询
20 rs = stmt.executeQuery(sql);
21 //5.判断
22 /*if (rs.next()){
23 return true;
24 }else{
25 return false;
26 }*/
27 //直接返回
28 return rs.next();
29 } catch (SQLException e) {
30 e.printStackTrace();
31 }finally {
32 JDBCUtils.close(rs,stmt,conn);
33 }
34 return false;
35 }
36 }

4、控制事务

  • 使用Connection对象(获取连接、事务管理)
  • 在执行sql之前开启事务
  • 在当所有sql执行完提交事务
  • 在 catch中回滚事务

package cn.itcast.jdbc;

import cn.itcast.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; /**
* 事务操作
*/
public class JDBCDemo11 { public static void main(String[] args) {
Connection conn=null;
PreparedStatement pstmt1=null;
PreparedStatement pstmt2=null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//开启事务
conn.setAutoCommit(false);
//2,定义SQL
//2.1 张三-500
//String sql1="update account set balance=balance-500 where id=1";
//2.2 李四+500
//String sql2="update account set balance=balance+500 where id=2";
//通用写法
String sql1="update account set balance=balance-? where id=?";
String sql2="update account set balance=balance+? where id=?";
//3.获取执行sql对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2= conn.prepareStatement(sql2);
//代码格式化快捷键
//4.设置参数
pstmt1.setDouble(1,500);
pstmt1.setInt(2,1);
pstmt2.setDouble(1,500);
pstmt2.setInt(2,2);
//5.执行SQL
pstmt1.executeUpdate();
//手动制造异常
int i=3/0;
pstmt2.executeUpdate();
//提交事务
conn.commit();
//使用大异常
} catch (Exception e) {
try { //事务回滚,前提不为null
if (conn!=null){
conn.rollback();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt1,conn);
JDBCUtils.close(pstmt2,null);
}
}
}

六、JDBC连接池和JDBCTemplate

1、数据库连接池

  • 概念:容器存放数据库连接对象
  • 实现:DataSource的接口(基本实现、连接池实现、分布式事务实现)
    • C3P0连接池
    • Druid连接池(阿里巴巴提供)
  • 方法:
    • 获取连接:Connection getConnection()
    • 释放连接:Connection.close()--连接池则归还连接

2、C3P0连接池

  • 方式:硬编码/配置文件--src/c3p0.properties 或src/ c3p0-config.xml(推荐)
  • 使用:
    • DataSource ds = new ComboPooledDataSource();--构造传连接池名
    • ds.getConnection();
    • 可以配置多个连接池<default-config>和<named-config name="otherc3p0">
<c3p0-config>
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day25</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>

3、Druid连接池

  • 导入jar包,定义配置文件druid.properties
  • 加载配置文件,通过工厂类DruidDataSourceFactory获取连接池createDataSource(Properties)
/**
* Druid演示
*/
public class DruidDemo {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties pro=new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn=ds.getConnection();
System.out.println(conn);
}
}
  • 定义工具类,将加载配置文件放至工厂类,提供静态方法,直接由类名调用

    • 获取连接池DataSource
    • 获取连接
    • 释放资源
package cn.itcast.datasource.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 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){
/*if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}*/
//简化书写
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;
}
}

使用连接池测试

package cn.itcast.datasource.druid;
import cn.itcast.datasource.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; /**
* 使用新的工具类
*/
public class DruidDemo2 {
public static void main(String[] args) {
/**
* 完成添加的操作,给account表添加一条记录
*/
Connection conn=null;
PreparedStatement pstmt=null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//2.定义sql
String sql="insert into account values(null,?,?)";
//3.获取pstmt对象
pstmt = conn.prepareStatement(sql);
//4.给?赋值
pstmt.setString(1,"王五");
pstmt.setDouble(2,3000);
int count = pstmt.executeUpdate();
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
}finally {
//6.释放资源
JDBCUtils.close(pstmt,conn);
}
}
}

4、JDBCTemplate

  • 创建对象:JDBCTemplate template =new JDBCTemplate(ds)
  • 调用方法完成CRUD操作:
    • update()---DML语句实现CUD
    • queryForMap()--DQL实现R,将结果封装为map集合({列名:值})
    • queryForList()--DQL实现R,将将map结果封装为list结果集(map的集合)
    • query(new BeanPropertyRowMapper<类型>(类型.class))--将结果集封装为JavaBean对象
    • queryForObject()--对象查询,将结果集封装为对象,一般用于聚合函数
 /**
* 查询所有id为1的记录,将其封装为map集合
*/
@Test
public void test4(){
String sql="select * from emp where id=?";
Map<String, Object> map = template.queryForMap(sql, 1001);
System.out.println(map);
//{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
}
/**
* 如果有多条记录
* 注意:此方法queryForMap结果集长度只能为1
*/
@Test
public void test5(){
String sql="select * from emp where id= ? or id= ?";
Map<String, Object> map = template.queryForMap(sql, 1001,1002);
System.out.println(map);
//{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
}
/**
* 查询所有记录,将其封装为list集合
*/
@Test
public void test6(){
String sql="select * from emp";
List<Map<String, Object>> list = template.queryForList(sql);
for (Map<String, Object> stringObjectMap : list) {
System.out.println(stringObjectMap);
}
}
/**
* 查询所有记录,将其封装为 Emp对象的list集合
*/
@Test
public void test7(){
String sql="select * from emp";
List<Emp> list = template.query(sql, new RowMapper<Emp>() {
@Nullable
@Override
public Emp mapRow(ResultSet rs, int i) throws SQLException {
Emp emp=new Emp();
int id = rs.getInt("id");
String ename = rs.getString("ename");
int job_id = rs.getInt("job_id");
int mgr = rs.getInt("mgr");
Date joindate = rs.getDate("joindate");
double salary = rs.getDouble("salary");
double bonus = rs.getDouble("bonus");
int dept_id = rs.getInt("dept_id");
emp.setId(id);
emp.setEname(ename);
emp.setJob_id(job_id);
emp.setMgr(mgr);
emp.setJoindate(joindate);
emp.setSalary(salary);
emp.setBonus(bonus);
emp.setDept_id(dept_id);
return emp;
}
});
for (Emp emp : list) {
System.out.println(emp);
}
}
/**
* 查询所有记录,将其封装为 Emp对象的list集合
* template已经提供了实现类
*/
@Test
public void test8(){
String sql="select * from emp";
List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));
//提示空值不能转换为double,则需要修改javabean为引用数据类型
for (Emp emp : list) {
System.out.println(emp);
}
}
/**
* 查询总的记录数(count')
*/@Test
public void test9(){
String sql="select count(id) from emp";
Long total = template.queryForObject(sql, Long.class);//用于执行聚合函数
System.out.println(total);
}
}

七、HTML

1、概述

2、标签 介绍

八、HTML&CSS

1、表单

2、CSS

九、JavaScript基础

1、简介

2、语法

3、对象

十、JavaScript高级

1、入门

2、BOM

3、DOM

4、事件※

十一、BootStrap

1、概念

2、响应式布局

3、案例介绍

十二、XML

1、概念

2、约束

3、解析

4、Jsoup

十三、Tomcat&Servlet基础

1、Web回顾

2、Web服务器软件

3、Servlet入门

十四、Servlet高级&HTTP&Request

1、Servlet介绍

2、HTTP

3、Request

4、基于BeanUtils的用户登录案例

十五、Response

1、Http响应消息

2、Response

3、ServletContext

十六、Cookie&Session

1、会话技术介绍

2、Cookie

3、Session

4、JSP

5、案例:验证码判断

十七、EL&JSTL

1、JSP指令、注释、内置对象

2、MVC开发模式

3、EL表达式

4、JSTL表达式

5、三层架构

6、案例:用户信息列表展示

十八、综合练习

1、界面设计

2、登录功能

3、添加功能

4、删除功能

5、修改功能

6、删除选中

7、分页查询

8、复杂条件查询

十九、Filter&Listener

1、Filter过滤器

2、案例:登录验证

3、案例:敏感词汇

4、Listener监听器

二十、JQuery基础

1、 概念

2、选择器

3、DOM操作

4、案例:隔行变色、表情选择

二十一、JQuery高级

1、动画

2、遍历

3、事件绑定

4、案例:广告的定时显示与隐藏

二十二、Ajax&Json

1、Ajax

2、JSON

3、案例:检验用户名是否存在

二十三、Redis

1、介绍

2、命令操作

3、Redis持久化

4、Jedis操作

5、案例:下拉列表缓存加载省份信息

二十四、Maven基础

1、介绍

2、具体使用

3、Maven详细介绍

4、Idea使用Maven

5、基于Maven的Servlet实例

二十五、Web项目旅游网1

1、项目介绍

2、前台表单校验

3、后台功能:数据库查询、邮件激活

4、登录实现

二十六、Web项目旅游网2

1、BaseServlet抽取

2、分类数据展示

3、旅游线路分页展示

二十七、Web项目旅游网3

1、旅游线路名称查询

2、旅游线路详情展示

二十八、Web项目旅游网4

1、旅游线路收藏

2、收藏次数的动态展示

3、补充

二十九、Linux

1、概述

2、安装

3、常用命令

4、其他功能

三十、Linux&Nginx

1、安装软件

2、常用软件的安装

3、Nginx

4、Nginx静态网站部署

5、反向代理与负载均衡

JavaEE课程复习1--数据库相关操作的更多相关文章

  1. mysq数据库相关操作

    (一)常用SQL语句 1.SELECT USER() 得到登陆的用户 2.SELECT VERSION() 得到mysql的版本信息 3.SELECT NOW() 得到当前的时间 4.SELECT D ...

  2. 尚学linux课程---9、yum相关操作和知识

    尚学linux课程---9.yum相关操作和知识 一.总结 一句话总结: 如何使用比如163,阿里云给yum配置yum源:去官网,不要百度:直接去官网,有帮助文档的(比如centos的就在centos ...

  3. Django数据库相关操作

    首先,在settings.py中加入应用的名称,让数据库知道使用的是哪个应用,然后给那个应用创建表. 在settings.py中配置数据库相关参数,默认使用sqlite3不用配置 编辑models.p ...

  4. fastCMS数据库相关操作类

    fastCMS针对数据库的操作有以下几个类: 1.[paging_Class]分页类 此类用于分页检索数据库内符合条件的记录 1) 支持百万级数据分页 2) 支持多种类型的SQL语法,比如 Left ...

  5. Django -查询数据库相关操作

    一. 内置Admin 依赖APP: django.contrib.auth django.contrib.contenttypes django.contrib.messages django.con ...

  6. YII 数据库相关操作

    CDbConnection: 一个抽象数据库连接CDbCommand: SQL statementCDbDataReader: 匹配结果集的一行记录CDbTransaction:数据库事务 访问数据库 ...

  7. MYSQL数据库相关操作---读书笔记分享

    ===================数据库软件: <DBMS,DataBase Management System >数据库: 保存特定类型数据的容器<DB,database> ...

  8. Dapper数据库相关操作

    using System; using System.Data; using System.Configuration; using System.Data.SqlClient; namespace ...

  9. SQLite数据库相关操作

    一.创建数据库 这里创建了note便签数据表,字段有noteId.noteTitle.noteTime.noteInfo );  // TODO Auto-generated constructor ...

  10. Python4_数据库相关操作

    ====================================================== 参考链接: PyCharm IDE 链接sqlite.建表.添加.查询数据:https:/ ...

随机推荐

  1. Kubernetes DevOps: Harbor

    Harbor 是一个 CNCF 基金会托管的开源的可信的云原生 docker registry 项目,可以用于存储.签名.扫描镜像内容,Harbor 通过添加一些常用的功能如安全性.身份权限管理等来扩 ...

  2. Bing 广告平台迁移到 .net6

    原文链接 https://devblogs.microsoft.com/dotnet/bing-ads-campaign-platform-journey-to-dotnet-6/ 广告组件平台对于微 ...

  3. springmvc 上传文件时的错误

    使用springmvc上传文件一直失败,文件参数一直为null, 原来是配置文件没写成功. <bean id="multipartResolver" class=" ...

  4. MyBatis(入参的类型和日志记录)

    入参的类型是对象 1. 新增的参数是对象 2. 空值的处理,占位符 字段,jdbcType=VARCHAR          字符串 字段,jdbcType=DATE                  ...

  5. Kubeadm部署高可用K8S集群

    一 基础环境 1.1 资源 节点名称 ip地址 VIP 192.168.12.150 master01 192.168.12.48 master02 192.168.12.242 master03 1 ...

  6. 驱动开发:内核枚举LoadImage映像回调

    在笔者之前的文章<驱动开发:内核特征码搜索函数封装>中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核LoadImage映像回调,在Win64环境下我们可以设置一个 ...

  7. 记录一次成功反混淆脱壳及抓包激活app全过程

    记录一次成功反混淆脱壳及抓包激活app全过程 前言 ​ 近期接到一个需求,要对公司之前开发的一款app进行脱壳.因为该app是两年前开发的,源代码文件已经丢失,只有加壳后的apk文件,近期要查看其中一 ...

  8. 【Kubernetes】K8s笔记(十一):Ingress 集群进出流量总管

    目录 0. Ingress 解决了什么问题 1. Ingress Controller 2. 指定 Ingress Class 使用多个 Ingress Controller 3. 使用 YAML 描 ...

  9. windows和虚拟机上的Ubuntu互传文件

    1.简介 本文讲述的是通过ssh登录虚拟机上的Ubuntu系统,实现互传文件 2.Ubuntu端 2.1.安装ssh sudo apt-get update sudo apt-get install ...

  10. JVM学习笔记——垃圾回收篇

    JVM学习笔记--垃圾回收篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...