公司项目开发知识点回顾

前言

“拿来主义”在某些时候并不是最佳选择,尤其是当自己遇到问题的时候,毫无头绪。

在一次实验过程中,需要实现数据库的CRUD操作。由于之前项目开发过程中,自己就曾进行过此操作。故选择“走捷径”,直接使用前面的操作。其实之前的数据库操作方法是别人封装好的,当时自己只是拿来就用而已。这次自己就按照前面的方法配置了相关参数,在写数据时,却出现了意想不到的情况,数据只能读不能写。曾经一度怀疑过是不是所建数据库有问题,设置为了“只读”属性。经过一番检查,并未发现此问题。重新建立数据库,还是出现了上面的情况。让自己很是汗颜!

苦思冥想,自己最终还是选择回到前面的项目中去看看问题到底出在哪里。经过阅读“立马送药”中数据库操作的有关代码,自己还是发现了一些端倪。MyDatabase.commit();这句意味深长。在操作之后添加这句后,居然就可以往数据库中写数据了。

数据库连接使用了基本的jdbc操作。

知识点

JDBC

尽管在实际开发过程中,我们一般使用ORM框架来代替传统的JDBC,例如Hibernate或者iBatis(或者是MyBatis),但JDBC是Java用来实现数据访问的基础,掌握它对于我们理解Java的数据操作流程很有帮助。

JDBC的全称是Java Database Connectivity。

JDBC对数据库进行操作的流程:

•连接数据库

•发送数据请求,即传统的CRUD指令

•返回操作结果集

JDBC中常用的对象包括:

•ConnectionManager

•Connection

•Statement

•CallableStatement

•PreparedStatement

•ResultSet

•SavePoint

数据库事务

谈到数据库开发,事务是一个不可回避的话题,JDBC默认情况下,是每一步都自动提交的,我们可以通过设置connection.setAutoCommit(false)的方式来强制关闭自动提交,然后通过connection.commit()和connection.rollback()来实现事务提交和回滚。

语法  commit()

示例  下面的代码利用commit方法提交当前事务。

Connection conn = ……         //省略部分代码

conn.setAutoCommit(false);     //先将事务设为手动提交

Statement st = conn.createStatement();

String sql = "INSERT INTO users VALUES ('xiaoli','123456')";

st.execute(sql);

conn.commit();          //提交事务

该方法用于使当前事务中的数据更改成为持久的模式,并释放Connection对象当前持有的所有数据库锁。此方法只有在手动事务的模式下才可以用。

自己有时间还是要恶补一下有关JDBC的知识点。

拓展

在“立马送药”项目中,客户端与服务端通信的大致思路自己还是清楚的。

客户端主要通过以下代码实现与服务端的通信。可见通信方式为http请求中的post方法,doupdate方式。有关http请求的知识,自己还需要进一步的学习。数据包传送方式为json形式。

/**
 * param1:http 请求地址
 * param2:tx_code 交易代码
 * param3:data	请求数据
 * param4:succFun 成功处理方法
 * param5:errFun 错误处理方法
 */
appCallServer = function(http,tx_code,data,succFun,errFun) {
var outdata={result:"9999",errtext:"未知错误"};
try{
var content = {
method: 'POST',
url: "/lmapp/DoUpdate?pkgtype=json",
"data": data
};
// 固定报文
content.data.version="1.0";
if (!content.data.uid) {
if (localStorage.getItem('uid')) {
content.data.uid = localStorage.getItem('uid');
} else {
content.data.uid = "$tempuser";
}
}
// 设置前台sessionid
content.data.fore_time = getNowFormatDate();
// 设置前台请求ID
if(localStorage.sessionid){
content.data.sessionid = localStorage.sessionid;
}else{
content.data.sessionid = "";
}
content.data.tx_code = tx_code;
showProgressBar();
//alert(JSON.stringify(content.data));
//采用链式调用
http(content)
//成功处理函数
.success(function(data) {	//参数data为服务端返回的数据对象
hideProgressBar();
if(data.result=="0000"){
console.log("typeof(succFun):" + typeof(succFun));
if(typeof(succFun)!="undefined"){
succFun(data);	//方法回调
}
}else{
if(typeof(errFun)!="undefined"){
if(data.result=="9998"){
if(confirm(data.errtext)){
// 若为管理端操作,则路由至管理端登陆界面
if (checkTrade(tx_code)) {
window.location.href='index_sys.html';
}else{
// 否则路由至药店端登陆界面
window.location.href='index_shop.html';
}
}
}
errFun(data);
}else{
//alert(data.errtext);
if(confirm(data.errtext) && data.result == "9998"){
// 若为管理端操作,则路由至管理端登陆界面
if (checkTrade(tx_code)) {
window.location.href='index_sys.html';
}else{
// 否则路由至药店端登陆界面
window.location.href='index_shop.html';
}
}
}
}
})
//失败处理函数
.error(function(data){
hideProgressBar();
outdata.errtext="交易发送成功,但未能正常收到应答";
if(typeof(errFun) != "undefined"){
errFun(outdata);
}else{
if(confirm(outdata.errtext)  && data.result=="9998"){
// 若为管理端操作,则路由至管理端登陆界面
if (checkTrade(tx_code)) {
window.location.href='index_sys.html';
}else{
// 否则路由至药店端登陆界面
window.location.href='index_shop.html';
}
}
}
});
}catch(error){
hideProgressBar();
outdata.errtext = error.message;
if(typeof(errFun) != "undefined"){
errFun(outdata);
}else{
alert(outdata.errtext);
//alert("调用交易"+tx_code+"失败4:"+outdata.errtext);
}
}
};

反思

之所以会出现前面遇到的问题,归根到底,还是自己的“拿来主义”、“不求甚解”造成的。身为“程序猿”,遇到自己不明白的问题,还是需要静下心来把问题搞明白,把原理搞清楚,这样自己心里才有数。

参考文献

1.http://www.jb51.net/article/36866.htm

2.《疯狂JAVA讲义》李刚

美文美图

Java进阶(二十六)公司项目开发知识点回顾的更多相关文章

  1. AngularJS进阶(二十九)AngularJS项目开发技巧之localStorage存储

    AngularJS项目开发技巧之localStorage存储       注: localStorage深度学习 绪 项目开发完毕,测试阶段发现后台管理端二维码生成有问题,问题在于localStora ...

  2. AngularJS进阶(三十六)AngularJS项目开发技巧之利用Service&Promise&Resolve解决图片预加载问题(后记)

    AngularJS项目开发技巧之利用Service&Promise&Resolve解决图片预加载问题(后记) 前言 在"AngularJS项目开发技巧之图片预加载" ...

  3. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  4. mysql进阶(二十六)MySQL 索引类型(初学者必看)

    mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

  5. Java进阶(三十六)深入理解Java的接口和抽象类

    Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...

  6. 网站开发进阶(二十六)js刷新页面方法大全

    js刷新页面方法大全 在项目开发过程中,需要实现刷新页面.经过学习,发现下面这条语句就可以轻松实现. location.reload(); // 刷新页面 有关刷新页面的其它方法,具体学习内容如下,有 ...

  7. Java进阶(二十九)Could not create the view: An unexpected exception was thrown

    Could not create the view: An unexpected exception was thrown 在将web项目部署到tomcat时,控制台输出以下内容: 这个问题的出现是在 ...

  8. Java进阶专题(十六) 数据结构与算法的应用(上)

    前言 ​ 学习算法,我们不需要死记硬背那些冗长复杂的背景知识.底层原理.指令语法--需要做的是领悟算法思想.理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案.相比编程领域的其他技术 ...

  9. Java笔记(二十六)……IO流上 字节流与字符流

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

随机推荐

  1. WUOJ-ACM :1003: 零起点学算法78——牛牛

    武汉科技大学ACM :1003: 零起点学算法78--牛牛Problem Description牛牛是一种纸牌游戏,总共5张牌,规则如下: 如果找不到3张牌的点数之和是10的倍数,则为没牛: 如果其中 ...

  2. iOS支付宝,微信,银联支付集成封装调用(下)

    一.越来越多的app增加第三方的功能,可能app有不同的页面但调用相同的支付方式,例如界面如下: 这两个页面都会使用第三方支付支付:(微信,支付宝,银联)如果在每一个页面都直接调用第三方支付的接口全部 ...

  3. PHP If...Else 语句

    PHP If...Else 语句 条件语句用于根据不同条件执行不同动作. PHP 条件语句 当您编写代码时,您常常需要为不同的判断执行不同的动作.您可以在代码中使用条件语句来完成此任务. 在 PHP ...

  4. Android开发技巧——设置系统状态栏颜色

    开门见山,先来三张效果图: 然后我们再来讲如何实现以及如何快速地实现. 如何实现 实现设置系统状态栏颜色需要至少在Android 4.4.2(API 19)以上.这是因为,在这个版本以下,没有任何的A ...

  5. Zookeeper 客户端API调用示例(基本使用,增删改查znode数据,监听znode,其它案例,其它网络参考资料)

    9.1 基本使用 org.apache.zookeeper.Zookeeper是客户端入口主类,负责建立与server的会话 它提供以下几类主要方法  : 功能 描述 create 在本地目录树中创建 ...

  6. Java程序员的Golang入门指南(下)

    Java程序员的Golang入门指南(下) 4.高级特性 上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号.函数多返回值.switch-case默认break.函数闭包.集合 ...

  7. [CSDN_Markdown]Markdown基本语法2

    简介 前文 Markdown基本语法 中介绍了Markdown的基本语法,知道那些基本的语法,实际上已经可以写纯文本的博客了.对我们这群写代码的人或者将要写代码的人来说,貌似这些还不够,我们还希望能插 ...

  8. ubuntu蓝牙音响配对成功但在声音设置中无法设置 解决

    ubuntu蓝牙音响配对成功但在声音设置中无法设置 解决 首先,连接蓝牙 但是,在声音设置中如下: 都没有发现设备??? 打开终端输入: ~$ pactl load-module module-blu ...

  9. [python]mysql数据缓存到redis中 取出时候编码问题

    描述: 一个web服务,原先的业务逻辑是把mysql查询的结果缓存在redis中一个小时,加快请求的响应. 现在有个问题就是根据请求的指定的编码返回对应编码的response. 首先是要修改响应的bo ...

  10. SQLite 创建表(http://www.w3cschool.cc/sqlite/sqlite-create-table.html)

    SQLite 创建表 SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表.创建基本表,涉及到命名表.定义列及每一列的数据类型. 语法 CREATE TABLE 语句的基 ...