MySQL---数据库从入门走向大神系列(十二)-构建MVC项目(2)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL---数据库从入门走向大神系列(十二)-构建MVC项目

BookDAOJdbc.java:

package cn.hncu.stud.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import cn.hncu.domain.Book;
import cn.hncu.pubs.ConnsUtil;
public class BookDAOJdbc implements IBookDAO {
    @Override
    public void save(List<Book> books) throws InterruptedException, SQLException {
        Connection con = ConnsUtil.getConnection();
        String sql = "insert into book(name,price,studid) values(?,?,?)";
        PreparedStatement pst = con.prepareStatement(sql);
        for(Book book:books){
            pst.setString(1, book.getNamem());
            pst.setDouble(2, book.getPrice());
            //stud中设置了uuid这里才能设置成功
            pst.setString(3, book.getStud().getId());
            pst.addBatch();
        }
        pst.executeBatch();
    }
}

StudDAOJdbc.java

package cn.hncu.stud.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import cn.hncu.domain.Stud;
import cn.hncu.pubs.ConnsUtil;
public class StudDAOJdbc implements StudDAO {
    @Override
    public List<Map<String, String>> query() {
        List<Map<String, String>> list = new ArrayList<Map<String,String>>();
        Connection con = null;
        try {
            con = ConnsUtil.getConnection();
            String sql="select * from stud";
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while(rs.next()){
                Map<String, String> map = new HashMap<String, String>();
                map.put("id", rs.getString("id"));
                map.put("name", rs.getString("name"));
                //一个map就是一条记录(数据行)
                list.add(map);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            if(con!=null){
                try {
                    con.close();
                } catch (SQLException e) {
                    throw new RuntimeException("数据库连接关闭失败", e);
                }
            }
        }
        return list;
    }
    @Override
    public void save(Stud stud) throws InterruptedException, SQLException {
        Connection con = ConnsUtil.getConnection();
        String sql = "insert into stud values(?,?)";
        PreparedStatement pst = con.prepareStatement(sql);
        String uuid = UUID.randomUUID().toString().replaceAll("-","");
        pst.setString(1, uuid);
        pst.setString(2, stud.getName());
        pst.executeUpdate();
        //在这里为book补外键字段的值
        stud.setId(uuid);
        //这一句执行在前,这样在BookDAOJdbc中会调用book.getStud().getId()就可以拿到该id值了
    }
}

IStudService.java:

package cn.hncu.stud.service;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import cn.hncu.domain.Stud;
import cn.hncu.pubs.tx.Transaction;
public interface IStudService {
    public abstract List< Map<String, String> > query();
    @Transaction//注意,注解必须加在接口上,加在实现类上是无效的!,因为我们的动态代理是面向接口的
    public abstract void save(Stud stud) throws InterruptedException, SQLException;
}

StudService.java:

package cn.hncu.stud.service;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import cn.hncu.domain.Stud;
import cn.hncu.stud.dao.BookDAOJdbc;
import cn.hncu.stud.dao.IBookDAO;
import cn.hncu.stud.dao.StudDAO;
import cn.hncu.stud.dao.StudDAOJdbc;
public class StudService implements IStudService {
    //注入
    private StudDAO studDao = new StudDAOJdbc();
    private IBookDAO bookDao = new BookDAOJdbc();
    @Override
    public List<Map<String, String>> query() {
        return studDao.query();
    }
    //※利用动态代理在背后帮忙实现事务功能,注意:该方法内部的异常必须抛出来给动态代理捕捉处理
    @Override
    public void save(Stud stud) throws InterruptedException, SQLException {
        studDao.save(stud);//在这个内部为stud对象补id--先执行
        bookDao.save(stud.getBooks());//通过book拿到stud对象,进而拿到studid,完成外键字段的赋值
    }
}

jdbc.properties:

##MySQL
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=utf-8
username=root
password=1234
##Oracle
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#username=scott
#password=tiger

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>mvc示例演示</title>
  </head>
  <body>
    <br/>
    <a href='<c:url value="/StudServlet?cmd=query"></c:url>'>学生信息查询</a>
    <hr/>
    <form action="<c:url value='/StudServlet?cmd=save'/>" method="post">
        姓名:<input type="text" name="name" /><br/>
        <fieldset style="width: 200px">
            <legend>图书1</legend>
            书名:<input type="text" name="bookname" /><br/><br/>
            价格:<input type="text" name="price" />
        </fieldset>
        <fieldset style="width: 200px">
            <legend>图书2</legend>
            书名:<input type="text" name="bookname" /><br/><br/>
            价格:<input type="text" name="price" />
        </fieldset><br/>
        <input type="submit" value="保存">
    </form>
    <br/>
    <a href="<c:url value='/StudServlet'/>">默认请求</a>
  </body>
</html>

show.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>学生信息查询</title>
    <style type="text/css">
        table,tr,td,th{
            border: 1px;
            border-style: solid;
            margin: auto;
        }
    </style>
  </head>
  <body style="text-align: center;">
    <h2>学生信息</h2>
    <table>
        <tr> <th>ID</th> <th>姓名</th></tr>
        <c:forEach items="${studs}" var="stud">
        <tr> <td>${stud.id }</td> <td>${stud.name }</td> </tr>
        </c:forEach>
    </table>
  </body>
</html>

web.xml

<servlet>
    <servlet-name>StudServlet</servlet-name>
    <servlet-class>cn.hncu.stud.StudServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>StudServlet</servlet-name>
    <url-pattern>/StudServlet</url-pattern>
  </servlet-mapping>

嗯,我就不做过多的解释啦,这个只是自己对以前知识点的一个小总结吧。

转载请附上原文博客链接:

http://blog.csdn.net/qq_26525215

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
13天前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
36 8
|
10天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
26 1
|
12天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
29 4
|
17天前
|
存储 前端开发 数据可视化
在实际项目中,如何选择使用 Flux 架构或传统的 MVC 架构
在实际项目中选择使用Flux架构或传统MVC架构时,需考虑项目复杂度、团队熟悉度和性能需求。Flux适合大型、高并发应用,MVC则适用于中小型、逻辑简单的项目。
|
19天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
90 1
|
7天前
|
运维 关系型数据库 MySQL
安装MySQL8数据库
本文介绍了MySQL的不同版本及其特点,并详细描述了如何通过Yum源安装MySQL 8.4社区版,包括配置Yum源、安装MySQL、启动服务、设置开机自启动、修改root用户密码以及设置远程登录等步骤。最后还提供了测试连接的方法。适用于初学者和运维人员。
57 0
|
20天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
48 0
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
63 3
Mysql(4)—数据库索引
|
21天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
64 2
|
24天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
94 4
下一篇
无影云桌面