Java 学习(2022-07-16)

185 阅读7分钟

Java 学习(2022-07-16)

一、DAO 和 增删改查通用方法 - BasicDao

1.1 基本说明

  1. DAO: data access object数据访问对象
  2. 这样的通用类,称为BasicDao,是专门和数据车交互的,即完成对数据库的 crud 操作
  3. 在BaiscDao的基础上,实现一张表对应一个Dao,更好的完成功能,比如 Customer表-Customer.java类(javabean)-CustomerDao.java image.png image.png

二、java web

2.1 java web概念

Java web指的是使用Java语言进行web互联网领域项目开发的技术栈―--进行web项目开发所需的技术的集合

2.2 java web 学什么

image.png

2.3 Tomcat

2.3.1 下载

tomcat.apache.org/download-80… image.png

2.3.2 Tomcat目录结构

  • bin目录存放的是可执行的二进制文件(start.bat启动Tomcat、shutdown.bat 用于停止Tomcat)
  • conf 存放配置文件
  • lib 此目录存放了Tomcat服务器运行web项目所需的基础类库
  • logs存放Tomcat服务器的运行日志、记录了服务器启动、运行异常及关闭等操作的记录
  • temp 临时目录,存放Tomcat运行过程中产生的临时文件
  • webapps存放Tomcat管理的web项目的目录,此目录中默认部署了Tomcat管理器等几个web项目
  • work Tomcat可以运行动态网页,动态网页就是在服务器上将数据加载到网页生成的页面,此目录就是存放Tomcat生成的文件

2.3.3 Tomcat 响应流程

image.png

2.4 HTTP 状态码

当浏览器向服务器发送请求、服务器对浏览器进行响应时,会响应给浏览器一个状态码,不同的状态码表示服务器对请求的不同处理。

2.4.1 状态码分类

  • 1xx:表示浏览器请求服务器,服务器未做任何操作
  • 2xx:表示服务正常响应,并且响应成功
  • 3xx:表示服务器只对浏览器的请求进行了部分处理,通知浏览器进行下一步操作
  • 4xx:表示浏览器端错误:404(路径错误)、401(参数问题)
  • 5xx:表示服务器资源错误

2.4.2 常见状态码

  • 200响应成功
  • 302表示服务器临时重定向
  • 304表示服务器资源没有变化
  • 404访问资源不存在
  • 500服务器错误

三、Servlet

3.1 Servlet简介

问题:浏览器可以通过http协议请求web服务器,访问web服务器上的web资源, web资源又分为静态资源和动态资源,静态资源可以直接存储在web服务器上供浏览器访问,动态资源该如何访问呢?

  • Servlet是服务器端的Java程序、能够接收HTTP请求、处理HTTP请求、并对HTTP请求进行响应的动态网页技术。
  • servlet是JavaEE (JavaWeb)规范的一个重要组成部分。
  • Servlet的作用:
    • 接收客户端的HTTP请求(浏览器)
    • 根据用户请求进行数据处理
    • 动态生成网页(网页中的数据是根据客户端请求动态改变的)
    • 将生成的包含动态数据的网页响应给客户端

3.2 Java web工程

Servlet是JavaEE规范的一部分,Servlet的开发需要依赖JavaEE环境,之前创建的单纯的Java应用已经不能满足Servlet开发所需的环境需求,我们要创建Java web工程。

  • Java工程:只引入了JDK的标准库(JavaSE)
  • Java web工程:引入了Java企业级开发环境(JavaEE)

3.2.1 建立 Java web项目

  1. File->new->project..
  2. 选择 Java Enterprise image.png
  3. 选择 web application库和版本 image.png
  4. Java web目录 image.png

3.3 创建 Servlet

Servlet是一个Java程序,是一个能够接收HTTP请求的Java类,因此需要实现HTTP协议。 在JavaEE库中有一个类HttpServlet实现了HTTP协议,我们创建的类只要继承这个HttpServlet类,就实现了HTTP协议,就能够接受HTTP请求。

  1. 创建类,继承 HttpServlet 类,才能接受 HTTP 请求,这种类叫做 Servlet 类
public class BookListServlet extends HttpServlet {
}
  1. 在创建的类中,需要重写doGet 和 doPost 类
public class BookListServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}

3.4 Servlet 配置

Servlet创建完成之后,需要配置url访问路径,然后将web项目运行在Tomcat之上,就能够通过配置的url访问Servlet类。Servlet自3.0规范开始支持两种配置方式:

  • 基于web.xml配置文件进行配置
  • 基于注解配置

3.4.1 基于 web.xml 配置 Servlet

  • 打开 Java web工程中的web/WEB-INF/web.xml文件
  • 配置如下:
<!--配置 类访问路径-->
<servlet>
    <servlet-name>BookListServlet</servlet-name>
    <!--servlet 类路径-->
    <servlet-class>com.lyq.test1.BookListServlet</servlet-class>
</servlet>
<servlet>
    <servlet-name>BookQueryServlet</servlet-name>
    <servlet-class>com.lyq.test1.BookQueryServlet</servlet-class>
</servlet>

<!--使用 servlert-name 来配对-->

<!--配置url-->
<servlet-mapping>
    <servlet-name>BookListServlet</servlet-name>
    <!-- url-patttern 配置servlet访问路径, / 不能丢-->
    <url-pattern> /book-list </url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>BookQueryServlet</servlet-name>
    <url-pattern>  /book-query </url-pattern>
</servlet-mapping>

3.4.2 基于注解配置Servlet

  • 在创建的 Servlet 类上添加@WebServlet注解,在注解后面的参数配置url,必须用/开头
@WebServlet("/book-list")
public class BookListServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("list - dopost");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("list - doget");
    }
}

3.5 IDEA 配置 web 项目

通过IDEA,将java web项目部署到Tomcat中并运行Tomcat。

如果在创建web项目时选择了web服务器,则直接点击IDEA右上角运行即可:

image.png

3.5.1 配置服务器

image.png

3.5.2 应用

  1. 点击右上角 Add Config image.png
  2. 部署 Tomcat image.png
  3. 配置访问路径 image.png

3.6 Servlet 响应动态网页

案例:根据客户端发送的 BookId,动态查询,生成html,返回客户端

实现代码:

public class Book {
    private String bookId;
    private String bookName;
    private Integer bookPrice;

    public Book() { // 配合反射
    }

    public Book(String bookId, String bookName, Integer bookPrice) {
        this.bookId = bookId;
        this.bookName = bookName;
        this.bookPrice = bookPrice;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookId='" + bookId + ''' +
                ", bookName='" + bookName + ''' +
                ", bookPrice='" + bookPrice + ''' +
                '}';
    }

    public String getBookId() {
        return bookId;
    }

    public void setBookId(String bookId) {
        this.bookId = bookId;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public Integer getBookPrice() {
        return bookPrice;
    }

    public void setBookPrice(Integer bookPrice) {
        this.bookPrice = bookPrice;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("query - doget");
    // 动态查询
    // 1. 获得 bookId
    String bookId = req.getParameter("bookId");

    // 2. 根据 bookId 去查询数据库
    Map<String, Book> bookMap= new HashMap<>();
    bookMap.put("1001", new Book("1001", "a", 15));
    bookMap.put("1002", new Book("1002", "b", 16));
    bookMap.put("1003", new Book("1003", "c", 17));

    Book book = bookMap.get(bookId);
    // 3. 将查询到的数据,生成网页, 通过 IO 流向浏览器响应网页数据
    // 这个 out 对象,用于响应输出流
    // a. 设置响应头
    resp.setContentType("text/html");
    resp.setCharacterEncoding("utf-8");
    // b. 通过输出流响应网页数据
    PrintWriter out = resp.getWriter();
    // 4. 将网页响应给服务器
    out.println("<!DOCTYPE html");
    out.println("<head><mete charset='utf-8'><title>aaa</title></head>");
    out.println("<body>");
    out.println("<table>");
    out.println("<td>" + book.getBookId());
    out.println("<td>" + book.getBookName());
    out.println("</table>");
    out.println("</body>");
    out.println("</html>");
    out.flush();
    out.close();
}

四、Maven

4.1 什么是 Maven

  • Maven是项目管理工具,对软件项目提供构建与依赖管理
  • Maven是Apache下的Java开源项目
  • Maven为Java项目提供了统一的管理方式,已成为业界标准

4.2 Maven 核心特性

  • 项目设置遵循统一的规则,保证不同开发环境的兼容性
  • 强大的依赖管理,项目依赖组件自动下载、自动更新
  • 可扩展的插件机制,使用简单,功能丰富

4.3 Maven 下载依赖

可以在该网址搜索对应jar包,放置到pom.xml文件下Maven Central Repository Search

  • 修改远程库以及添加依赖示例:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.imooc</groupId>
    <artifactId>idea-maven</artifactId>
    <version>1.0.0-RELESE</version>
    <!--修改远程仓库-->
    <repositories>
        <repository>
            <id>aliyun</id>
            <name>aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>

        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.22</version>
        </dependency>
    </dependencies>
    <!--<build>-->
        <!--&lt;!&ndash;配置插件&ndash;&gt;-->
        <!--<plugins>-->
            <!--<plugin>-->
                <!--<groupId>org.apache.maven.plugins</groupId>-->
                <!--<artifactId>maven-assembly-plugin</artifactId>-->
                <!--<version>2.5.5</version>-->
                <!--<configuration>-->
                    <!--<archive>-->
                        <!--<manifest></manifest>-->
                    <!--</archive>-->
                <!--</configuration>-->
            <!--</plugin>-->
        <!--</plugins>-->
    <!--</build>-->
</project>

五、MyBatis

数据持久化框架

5.1 什么是 MaBatis

  • MyBatis是优秀的持久层框架
  • MyBatis使用XML将SQL与程序解耦,便于维护
  • MyBatis学习简单,执行高效,是JDBC的延伸

5.2 MyBatis 开发流程

  1. 引入 MyBatis 依赖
  2. 创建核心配置文件
  3. 创建实体(Entity)类
  4. 创建 Mapper 映射文件
  5. 初始化 SessionFactory
  6. 利用 SqlSession 对象操作数据

5.3 MyBatis 环境配置

5.3.1 mybatis-config.xml 核心文件

  • MyBatis 采用XML格式配置数据库环境信息
  • MyBaits 环境配置标签 <environment>
  • environment包含数据库驱动、URL、用户名与密码

image.png

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--默认dev,也可以指定prd环境-->
    <environments default="dev">
        <environment id="dev">
            <!--采用 jdbc 方式-->
            <transactionManager type="JDBC"></transactionManager>
            <!--连接池的方式-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/goods?useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

        <environment id="prd">
            <!--采用 jdbc 方式-->
            <transactionManager type="JDBC"></transactionManager>
            <!--连接池的方式-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/goods?useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

5.4 SqlSessionFactory 对象

  • SqlSessionFactory是MyBatis的核心对象
  • 用于初始化MyBatis,创建SqlSession对象
  • 保证SqlSessionFactory在应用中全局唯一

5.4.1 SqlSession 对象

  • SqlSession是MyBatis操作数据库的核心对象
  • SqlSession使用JDBC方式与数据库交互
  • SqlSession对象提供了数据表CRUD对应方法

案例:使用MyBatis写工具类

public class MyBatisUtils {
    // 静态变量,保证全局唯一
    private static SqlSessionFactory sqlSessionFactory = null;
    // 初始化静态对象
    static {
        Reader reader = null;
        try {
            reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            // 初始化异常
            throw new ExceptionInInitializerError(e);
        }
    }

    public static SqlSession openSession(){
        return sqlSessionFactory.openSession();
    }
    public static void closeSession (SqlSession sqlSession){
        if (sqlSession != null){
            sqlSession.close();
        }
    }
}

5.5 MyBatis 数据查询步骤

  • 创建实体类(Entity)
  • 创建 Mapper XML
  • 编写<select>SQL标签
  • 开启驼峰命名映射
  • 新增 <mapper>
  • SqlSession 执行 select 语句

goods.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="goods">
    <resultMap id="customMap" type="com.lyq.mybatis.entity.Goods">
        <id column="id" property="goodsId" />
        <!--非主键列 用 result 标签-->
        <result column="goods_name" property="goodsName"/>
    </resultMap>
     <!-- id 代表 sql 名称, resultType 代表返回数据类型-->
    <select id="selectAll" resultMap="customMap">
        select * from goods;
    </select>

    <!-- 如果需要传递单参数 -->
    <select id="selectId" resultType="com.lyq.mybatis.entity.Goods" parameterType="Integer">
        select * from goods where goods_id = #{value};
    </select>
    <!-- 如果需要传递多参数 -->
    <select id="selectByPriceRange" resultType="com.lyq.mybatis.entity.Goods" parameterType="java.util.Map" >
        select * from goods
        where goods_id between #{min} and #{max}
    </select>
</mapper>

mybatis-config.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--通过设置,自动驼峰命名转换-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--默认dev,也可以指定prd环境-->
    <environments default="prd">
        <environment id="dev">
            <!--采用 jdbc 方式-->
            <transactionManager type="JDBC"></transactionManager>
            <!--连接池的方式-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/mysqldemo?useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

        <environment id="prd">
            <!--采用 jdbc 方式-->
            <transactionManager type="JDBC"></transactionManager>
            <!--连接池的方式-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/mysqldemo?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mappers/goods.xml"/>
    </mappers>
</configuration>

单元测试类

// 单元测试类
public class MyBatisTest {
    @Test
    public void testSqlSessionFactory() throws IOException {
        // 利用 Reader 加载 classpath 下的 mybatis-config-xml 核心配置文件
        Reader resourceAsReader = Resources.getResourceAsReader("mybatis-config.xml");
        // 初始化 SqlSessionFactory 对象,同时解析 mybatis-config-xml 文件
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);
        // 创建 SqlSession 对象,SqlSession 是 JDBC 拓展类,用于数据库交互
        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(sqlSession != null){
                sqlSession.close();
            }
        }
        // 创建数据库连接
    }
    @Test
    public void testMybatisUtils() throws Exception {
        SqlSession sqlSession = null;
       try {
           sqlSession= MyBatisUtils.openSession();
           Connection connection = sqlSession.getConnection();
           System.out.println(connection);

       }catch (Exception e){
            throw e;
       }finally {
           MyBatisUtils.closeSession(sqlSession);
       }
    }
    @Test
    public void test02() throws Exception {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.openSession();
            List<Goods> objects = sqlSession.selectList("goods.selectAll");
            System.out.println(objects);
            // sqlSession.selectOne() // 返回一条
            for (Goods g : objects){
                System.out.println(g.getGoodsId() + g.getGoodsName());
            }
        }catch (Exception e) {
            throw e;
        }finally {
            MyBatisUtils.closeSession(sqlSession);
        }
    }

    @Test
    public void test03() throws Exception {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.openSession();
            Goods goods = sqlSession.selectOne("goods.selectId", 1);
            System.out.println(goods.getGoodsId() + goods.getGoodsName());
            // sqlSession.selectOne() // 返回一条
//            for (Goods g : objects){
//                System.out.println(g.getGoodsId() + g.getGoodsName());
//            }
        }catch (Exception e) {
            throw e;
        }finally {
            MyBatisUtils.closeSession(sqlSession);
        }
    }

    @Test
    public void test04() throws Exception {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.openSession();
            Map param = new HashMap();
            param.put("min", 1);
            param.put("max", 3);
            List<Goods> list = sqlSession.selectList("goods.selectByPriceRange", param);
            // sqlSession.selectOne() // 返回一条
            for (Goods g : list){
                System.out.println(g.getGoodsId() + g.getGoodsName());
            }
        }catch (Exception e) {
            throw e;
        }finally {
            MyBatisUtils.closeSession(sqlSession);
        }
    }

}