如果你想开发一个应用(1-5)

你是否会觉得奇怪?每次通过IDE运行的tomcat,让应用进行启动调试,发现他的页面都比我的钱包还干净,为什么呢,我之前添加了的好多项呢,说好的三点钟看书呢?

持久化基础

这时候,终于轮到持久化技术出场了,所谓持久化就是把数据转换为持久状态,如存储在文件或数据库中,以便能够持久的保存,这里介绍一下使用jdbc来进行数据库操作的方法,顺便在这时介绍一下jsp的bean。

jdbc是一个专用的数据库链接桥接的方法。提供里一套数据库操作的接口,然后由各个厂商对此进行实现,同时,各种的orm操作,实际上也可以说就是对jdbc的各种封装,也就是说,熟悉了一jdbc这种数据库操作的方法,也就几乎可以了解任意一种数据库操作的方式。

一般来说,对于基础数据库操作,统一成为crud才做,即Create(创建)、Read(读取)、Update(更新)和Delete(删除)的操作,现在大部分的业务应用,基本都是不同逻辑下的crud操作,对于这个项目来说,我们主要使用的操作为C和R,也就是:

  • 插入一条todo项
  • 读取todo列表

这样,即使服务重启,也可以从db中获取已经存在的信息,首先用mysql来实现这样一个功能.

mysql当然可以使用纯命令行的方式,但我们毕竟不是dba,我还是建议你使用一个ide,我使用的是SQLyog,具体的操作步骤以下几步:

创建数据库jtodos

CREATE DATABASE `jtodos` ;

创建数据库todos

CREATE TABLE `todos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item` varchar(100) DEFAULT NULL,
  `createtime` datetime DEFAULT NULL,
  `userid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

都非常简单,需要注意的是表内有userid字段,这个字段暂时不要了解,以后会使用。

最后,还要在maven库中找到jdbc的相关库,并添加到pom.xml中:

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

dao操作

dao(Data Access Object)是数据访问对象的简称,我们使用此对象来封装db操作的api,在进行数据库操作之前,先封装一个数据库操作的工具类,以便在之后的代码里可以专注于逻辑实现,这个工具类放在com.niufennan.jtodos.utils包内,类名为DatabaseHelper,是一个静态类,代码如下:

  public static Connection getConnection(){
    Connection connection=null;
    try {
        Class.forName(com.mysql.jdbc.Driver.class.getName());
        connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/sstest?serverTimezone=GMT%2b8","root","1234");
    }  catch (ClassNotFoundException e) {
        e.printStackTrace();
    }catch (SQLException e) {
        e.printStackTrace();
    }
    return connection;
}
public static void close(ResultSet rs, Statement statement, Connection connection){
    if(rs!=null)
    {
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if(statement!=null)
    {
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
    if(connection!=null) {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

这个类以后会复杂的多,但目前为止,只有获取链接和关闭链接两个方法即可。

需要说明的有三点:

  1. Class.forName(com.mysql.jdbc.Driver.class.getName());

加载jdbc驱动。

  1. connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/jtodos?serverTimezone=GMT%2b8","root","1234");

建立链接,三个参数分别为链接数据库使用的url,数据库的用户名,数据库密码,注意url中的serverTimezone参数,这个是配置程序所使用的时区,这里显示使用的为东八区。即北京所在时区。

  1. 关闭链接需按顺序分别关闭。

然后是正常的数据库查询的业务类TodoDao,这个类在com.niufennan.jtodos.dao包内,此类只有两个方法,分别对应我们所需的操作,即C和R源代码如下:

public class TodoDao {
    public List<Todo> getAll(){
        Connection connection= null;
        Statement statement=null;
        ResultSet resultSet=null;
        List<Todo> list=new ArrayList<Todo>();
        try{
            connection =DatabaseHelper.getConnection();
            statement= connection.createStatement();
            resultSet=statement.executeQuery("select * from todos");
            while (resultSet.next()){
                Todo todo=new Todo();
                todo.setId(resultSet.getInt("id"));
                todo.setItem(resultSet.getString("item"));
                todo.setCreateTime(resultSet.getDate("createtime"));
                todo.setUserId(resultSet.getInt("userid"));
                list.add(todo);
            }
        }catch (SQLException ex){
            new RuntimeException(ex);
        }
        finally {
            DatabaseHelper.close(resultSet,statement,connection);
        }
        return list;
    }

    public void save(Todo todo){
        Connection connection=null;
        PreparedStatement statement=null;
        try {
            connection = DatabaseHelper.getConnection();
            statement=connection.prepareStatement("INSERT INTO todos (item,createtime,userid)VALUES(?,?,?);");
            statement.setString(1,todo.getItem());
            statement.setDate(2,new Date(todo.getCreateTime().getTime()));
            statement.setInt(3,todo.getUserId());
            statement.executeUpdate();
        }catch (SQLException ex){
            throw  new RuntimeException(ex);
        }finally {
            DatabaseHelper.close(null,statement,connection);
        }
    }
}
    

此类需要作为jsp内的javabean使用,所以必须具有javabean所需的特征:
1 必须是公开的和具体的
2 必须具有无参的构造函数
3 所有独立字段(如有)必须通过公开的get和set方法暴露
此类完全符合javabean的条件,所以他可以作为javabean使用

需注意两点:
1 todos表内id为自增长id,在insert的时候不需要也不允许设置
2 注意在插入时候的createtime字段,db中时间输入必须使用setTimestamp,否则会损失时分秒的部分,这时需要以时刻为参数,重新创建一个java.sql.Timestamp输入。

jsb Bean

好,数据库操作类也完成,下面所要做的就是在jsp页面中使用它了,jsp页面中使用javabean的方法为jsp:useBean标签,继续修改index.jsp内的代码(貌似已经修改的千疮百孔了)

<jsp:useBean id="todoDao" class="com.niufennan.jtodos.dao.TodoDao"></jsp:useBean>

这样,jsp页面中就引入了TodoDao方法,id指的是在jsp中使用的句柄,class指向这个bean的全路径。

继续修改jsp中的代码块为:

<jsp:useBean id="todoDao" class="com.niufennan.jtodos.dao.TodoDao"></jsp:useBean>
<%
    request.setCharacterEncoding("utf-8");
    if(request.getParameter("todo")!=null){
        Todo todo=new Todo();
        todo.setCreateTime(new Date());
        todo.setItem(request.getParameter("todo"));
        todo.setUserId(0);
        todoDao.save(todo);
    }

    List<Todo> todos=todoDao.getAll();
    pageContext.setAttribute("todos",todos);
%>

可以看到,不在对application进行访问,而是直接使用todoDao,对数据库进行操作,并且,感觉代码都清爽了好多,运行一下:

ok 运行效果和之前一模一样,停止服务器再次运行,效果还是这样,故不再贴图。

最后再说几句

首先,我们使用了useBean的标签,他的作用域其实是application级别的,也就是说,他和之前我们使用的ArrayList一样,是存储在application中。

还有,现在这个应用是每次数据库操作都创建一个数据库链接,实际上数据库链接的开销非常大,一般来说都是使用数据库连接池,而现在很多的orm都是使用的数据库连接池操作。

从代码中可以看到了,数据库操作的代码都是又臭又长,非常容易出错和难以维护,哪怕执行一条select语句都要写一大度代码,还必须各种try catch,并且很多问题都不会引起编译错误,只有运行时的偶然因素才会引起错误,所以这块一般都是使用orm和各种数据库工具库,比如Apache common里就有dbutils的工具类,但现在我们暂时先这样,以后会慢慢的进行修改维护。

现在我所有的计划列表都已经存储到了db中,即使重启服务器,重启pc等任何操作也不会改变计划,但是,我做的应用仅仅是为了自己使用么?如果其他人也同样使用这个应用会怎么样呢?下一章将解答这个问题.

感谢您的观看!

时间: 2024-11-10 17:29:08

如果你想开发一个应用(1-5)的相关文章

如果你想开发一个应用(1-13)

大家新年快乐 2018事事顺利 前端技术选型 因为作为一个后端开发人员,前端都是摸索着前进,所以会写的比较简单. 选型第一步 做出原型图后,就要像用什么技术来实现这个App了,最理想的方式当然是原生的Android或者IOS了,但这两个首先就被pass掉了,因为: 对于一个开发者来说,同时开发两个客户端实在是太难了,所以,最终选择还是使用js进行开发,然后用cordova技术包装成App文件. 选型第二步 既然确定了使用js进行开发,接下来就是js框架的选择了,摆在前面的同样有很多选型,JQue

如果你想开发一个应用(1-12)

到了现在,整个程序的结构已经出来了,层级清晰,代码简练(暂时不考虑分布式等附加功能),之后就开始在这个架构上扩充业务功能. 产品化 现在的程序,不管是不是承认,都透着一股弄弄的demo味,但是,谁没有一点野心呢?虽然现在只是一个小小的记事性的demo,但谁知道日后会不会成为东半球最好的记事型APP呢. 在去年夏天有一部现象级的电影上映,就是<你的名字>,里边男女主角用来记事的APP非常的吸引人,并且我发现在功能上,与我们现有的demo很是契合,下面我们从影片的截图分析一下所需的功能,并根据需要

推送类服务大集合,如果你想开发推送的服务,可以参考下。

推送类的服务,开发者如果想开发推送类的,但又不知道如何选择,不知道哪个推送类的对自己的开发是否有利.devstore为你整合,汇集了上百种的第三方服务,这里为你分享一些推送类的服务.http://www.devstore.cn/service/serviceClassfiy/24.html推送类服务大集合,如果你想开发推送的服务,可以参考下.,布布扣,bubuko.com

【刘文彬】【精解】开发一个智能合约

原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/contract.html 智能合约 这两天被老大搞去搬砖,学习计划有变但无大碍,这篇文章将仔细分析智能合约相关内容. 关键字:智能合约,remix,Solidity,truffle,geth,leveldb,datadir,ganache,web3j 合约 合约也称合同.协议,是甲乙双方参与的,制定一系列条目规范双方权利与义务的文件.智能合约是电子化的,自动执行的,去中心化的,具有不可抵赖性,本质上它

如果你建造了一个精良的模型却没人用,你肯定不会得到赞誉(转)

注:本文编译自 How to do Data Science ,作者 Brandon Rohrer 为微软高级数据科学家. <哈佛商业评论>曾宣称“数据科学家”是二十一世纪最性感的职业.所谓性感,既代表着难以名状的诱惑,又说明了大家对它又不甚了解. 如何做好数据科学呢? 微软高级数据科学家 Brandon Rohrer 概括了做数据科学的七大步骤,手把手教你做数据科学. 1. 获取更多的数据 数据科学的原材料是数字和名称的集合,测量.价格.日期.时间.产品.标题.行动等,数据科学无所不包.你也

2016开发一个app需要多少钱?app开发需要哪些成本-app开发问题汇总-广州达到信息

作为一个APP开发从业者,被外行的朋友们问及最多的问题是,"做一个网站需要多少钱?"或者"开发一个APP需要多少钱?".作为开发过完整网站项目和手机APP的人,今天从产品经理的角度,一起来算一下开发一个中小型APP从无到有需要做哪些工作,以及为达成使命,需要付出多少金钱代价. 现在主流有两种开发模式,一种是使用现成的模板进行修改,另一种则是全部重新设计开发. 使用模板工作量较小,如果是一款功能简单,客户要求不太高的APP,只需要让美工对前台的页面进行一定程度的修改,

我想写一个前端开发工具(一):在npm发布模块

有必要说说我为什么要开始写这个 我最近忙于公司的项目,一直没有抽出时间来写文章.本来想每个月写一片文章,保质保量,无奈上个月没有坚持. 这段时间有点忙,主要是由于公司业务调整,我从原来的广告项目中调整到新业务线的前台页面开发了,和以前一样,还是带着3.4个兄弟姐妹.不同的是以前的项目周期普遍偏长,可以让每个同学有时间从头到尾的把项目吃透,而现在做C端的前台页面往往开发时间非常的短,比如我们就要在1.2个月完成业务线所有前台页面的开发.联调.测试.部署,以及下一步的迭代.由于是从零开始,不存在基于

如果你想为您的公司制作(修改)一个企业官网,那么请先看看这篇文章

一个企业网站有什么功能?,为什么要为自己的企业做自己的官网! 1.企业宣传作用,(似乎是废话) 2.在线交易作用. 事实上,给你的网站接入企业支付宝,微信支付等.可以达到实时交易的功能,但很多网站都忽视了这点. 3.资料下载 我们完全可以将企业的一些共享资料,比如合同模版,产品资料放到企业官网供客户下载,但同样,对于很多企业都完全忽视了这点. 4.在线客服作用. 将自己的官网加入一些在线客服软件,比如 CC客服,53客服等,可以实时的跟访问到您官网的用户进行沟通.常见的有医院官网,几乎所有的医院

创业的时候只能专心致志做好一件事。什么叫“一件事”?只能开发一个游戏,只能做一个产品

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:王统伟链接:http://www.zhihu.com/question/19550531/answer/15183706来源:知乎 这是我在商界招商网看到天使投资人曾李青(原腾讯公司五位创始人之一)对早期创业公司的看法 ,觉得对你蛮有帮助的,你可以参考下!曾李青:早期创业公司九种死法第一,跨行业创业 比如原来做游戏的人要做电商,原来做互联网社区的要做游戏.现在的互联网环境下,这种跨行业创业失败概率都会比较高. 在演讲中,他