写点什么

Java 进阶 (二十六) 公司项目开发知识点回顾

  • 2022 年 9 月 19 日
    上海
  • 本文字数:2389 字

    阅读完需:约 8 分钟

Java进阶(二十六)公司项目开发知识点回顾

一、前言

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

      在一次实验过程中,需要实现数据库的 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";}}// 设置前台sessionidcontent.data.fore_time = getNowFormatDate();// 设置前台请求IDif(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);}}};
复制代码

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

发布于: 刚刚阅读数: 4
用户头像

No Silver Bullet 2021.07.09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
Java进阶(二十六)公司项目开发知识点回顾_Java_No Silver Bullet_InfoQ写作社区