Java 学习(2022-07-16)
一、DAO 和 增删改查通用方法 - BasicDao
1.1 基本说明
- DAO: data access object数据访问对象
- 这样的通用类,称为BasicDao,是专门和数据车交互的,即完成对数据库的 crud 操作
- 在BaiscDao的基础上,实现一张表对应一个Dao,更好的完成功能,比如 Customer表-Customer.java类(javabean)-CustomerDao.java
二、java web
2.1 java web概念
Java web指的是使用Java语言进行web互联网领域项目开发的技术栈―--进行web项目开发所需的技术的集合
2.2 java web 学什么
2.3 Tomcat
2.3.1 下载
tomcat.apache.org/download-80…
2.3.2 Tomcat目录结构
bin目录存放的是可执行的二进制文件(start.bat启动Tomcat、shutdown.bat 用于停止Tomcat)conf存放配置文件lib此目录存放了Tomcat服务器运行web项目所需的基础类库logs存放Tomcat服务器的运行日志、记录了服务器启动、运行异常及关闭等操作的记录temp临时目录,存放Tomcat运行过程中产生的临时文件webapps存放Tomcat管理的web项目的目录,此目录中默认部署了Tomcat管理器等几个web项目workTomcat可以运行动态网页,动态网页就是在服务器上将数据加载到网页生成的页面,此目录就是存放Tomcat生成的文件
2.3.3 Tomcat 响应流程
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项目
- File->new->project..
- 选择
Java Enterprise - 选择 web application库和版本
- Java web目录
3.3 创建 Servlet
Servlet是一个Java程序,是一个能够接收HTTP请求的Java类,因此需要实现HTTP协议。 在JavaEE库中有一个类
HttpServlet实现了HTTP协议,我们创建的类只要继承这个HttpServlet类,就实现了HTTP协议,就能够接受HTTP请求。
- 创建类,继承
HttpServlet 类,才能接受 HTTP 请求,这种类叫做 Servlet 类
public class BookListServlet extends HttpServlet {
}
- 在创建的类中,需要重写
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右上角运行即可:
3.5.1 配置服务器
3.5.2 应用
- 点击右上角
Add Config - 部署 Tomcat
- 配置访问路径
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>-->
<!--<!–配置插件–>-->
<!--<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 开发流程
- 引入 MyBatis 依赖
- 创建核心配置文件
- 创建实体(Entity)类
- 创建 Mapper 映射文件
- 初始化 SessionFactory
- 利用 SqlSession 对象操作数据
5.3 MyBatis 环境配置
5.3.1 mybatis-config.xml 核心文件
- MyBatis 采用XML格式配置数据库环境信息
- MyBaits 环境配置标签
<environment> environment包含数据库驱动、URL、用户名与密码
<?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&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&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&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&characterEncoding=utf-8&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);
}
}
}