JavaEE课程复习1--数据库相关操作

〇、本模块内容简介

 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 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(放到最后)
  • 特征:原子性、一致性※、持久性、隔离性
  • 隔离级别:
    • 脏读、不可重复读/虚读、幻读

         JavaEE课程复习1--数据库相关操作_第1张图片

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();
    • 可以配置多个连接池 
  
 
    
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/day25
    root
    root
    
    5
    8
    1000
  

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 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 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> list = template.queryForList(sql);
        for (Map stringObjectMap : list) {
            System.out.println(stringObjectMap);
        }
    }
    /**
     * 查询所有记录,将其封装为 Emp对象的list集合
     */
    @Test
    public void test7(){
        String sql="select * from emp";
        List list = template.query(sql, new RowMapper() {
            @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 list = template.query(sql,new BeanPropertyRowMapper(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、反向代理与负载均衡

你可能感兴趣的:(java-ee,数据库,java,开发语言)