对一个简单的 JDBC 包装器的扩展及应用

JDBC API 4.2(十一):java.sql.Wrapper 接口源码分析 java.sql.Wrapper 是 JDBC 的接口,当相关实例实际上是代理类时,该接口提供检索委托实例的功能。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

宗锋 (zong_feng@263.net)
西北大学计算机系硕士
2001 年 12 月

本文将对 《一个简单的 JDBC 包装器》中的JDBC包装器进行一些扩展,然后介绍一下其在jsp javabean开发模式中的应用。

最近看了《一个简单的 JDBC 包装器》,觉得这篇文章很有应用价值,我便在自己的开发中使用了它,不过这个包装器也存在一些不足,于是我对它进行了一些扩展。首先原文中的Table类缺少删除功能,我便增加了删除功能。代码如下:



public void delRow(Row row) throws SQLException {

String ss="";



ss = "delete from " name " where ";



for (int i=0; i<row.length();   i) {

String k = row.getKey( i );

String v = row.get( i );

ss  = k "='" v "'";

if (i != row.length()-1)

ss  = " and ";

}

Connection con = database.getConnection();

Statement st = con.createStatement();

st.executeUpdate( ss );

}

public void delRow(String conditions)throws SQLException {

String ss="";

ss = "delete from " name " where ";

ss  =conditions;

Connection con = database.getConnection();

Statement st = con.createStatement();

st.executeUpdate( ss );

}

这两个函数分别用于删除一个Row和满足一定条件的记录。对于具有主关键字的表,我们可以用下面代码中的方法二来进行删除,如果没有主关键字,我们可以用方法一删除。

示例如下:



//方法一

Row e = table.getRow( "id=2001" );

table.delRow(e);

//方法二

table.delRow("id=2001");

另外这个包装器没有对查询结果为NULL的情况作处理,我通过修改Table类的execute函数和RowSet类的get函数对这种情况作了处理。具体代码见附件。

下面谈谈利用这个JDBC包装器实现对数据库的封装,假定我们有一个表:student,创建表的Sql语句如下:



create table student(

id varchar(10) not null primary key,

name varchar(16) not null,

sex char(2) not null,

password varchar(16) not null,

department varchar(32) not null

)

我们对这个表进行封装,下面是Student类的主要代码:



public class Student{



private Row r;



public Student() {

r=new Row();

}

public Student(Row row) {

this.r=row;

}

private Table getTable() {

Database db =

new Database( "jdbc:mysql://localhost:3306/manger",

"zf", "zf" );

return db.getTable("student");

}



public void setName(String name){

r.put("name",name);

}

public void setPassword(String pass){

r.put("password",pass);

}

public void setId(String number){

r.put("id",number);

}

public void setDepart(String depart){

r.put("department",depart);

}

public void setSex(String sex){

r.put("sex",sex);

}

public String getName(){

return r.get("name");

}

public String getPassword(){

return r.get("password");

}

public String getId(){

return r.get("id");

}

public String getDepart(){

return r.get("department");

}

public String getSex(){

return r.get("sex");

}

/**

 *condition表示限制条件,如果为空,则插入新记录,否则更新记录

 */

public void save(String conditions) throws SQLException{

if(conditions==null)

{getTable().putRow(r);}

else

getTable().putRow(r,conditions);



}

/**

 *由于id作为主关键字,所以我们使用字符串为参数的delRow()函数

 */

public void delete()throws SQLException{

//getTable().delRow(this.r);

String conditions="";

conditions = "id="   "'" getId() "'";

getTable().delRow(conditions);

}

}

下面这个类是相应的一个查询类的主要代码:



public class StudentFactory{

public static Student findStudentById(String id)

throws SQLException{

Row r=getTable().getRow("id=" id);

if(r==null)

  return null;

else

return new Student(r);

}

public static Student[] findAllStudents()

throws SQLException{

RowSet rs=getTable().getRows("1>0");

if (rs==null)

return null;

else

Student[] stu=null;

stu=new Student[rs.length()];

for(int i=0;i<rs.length(); i  ){

stu[i]=new Student(rs.get(i));

}

return stu;

}

}

我使用javabean来实现很多功能,这样可以减少在jsp中的java代码量,方便我们对界面的改进。我们要实现的功能为对学生的编辑,添加,删除和列表。这些功能定义在两个javabean中:下面是两个jsp文件的主要代码:



<%-- student.jsp --%>

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="org.gjt.mm.mysql.*,manger.bean.*,manger.tools.*,manger.business.*" %>

<html>

<head>

<SCRIPT TYPE="text/javascript" LANGUAGE="JavaScript" >

<!--

function doDelete()

{

if(confirm('你确定删除吗?')) {

document.EditForm.event.value='delete';

document.EditForm.submit();

}

}

function doEdit()

{

if(confirm('你确定编辑吗?')) {

document.EditForm.event.value='showEdit';

document.EditForm.submit();

}

}

function showAddPage()

{

document.location='editstudent.jsp?event=showAdd';

}

</SCRIPT>

</head>

<body bgcolor="#FFFFFF" text="#000000">

<%

try {

Class.forName("org.gjt.mm.mysql.Driver").newInstance();

}

catch (Exception E) {

out.println("Unable to load driver.");

} %>

<jsp:useBean id="table" scope="page" class="manger.bean.ListStudentBean" />

<%

Student[] student=table.getStudent(pageContext);

int total=0;

int currPage=table.getCurPage();

int pageCount=table.getPageCount();

if(student!=null)

{total=student.length;}%>

<FORM NAME="EditForm" ACTION="editstudent.jsp">

<INPUT TYPE="HIDDEN" NAME="event" VALUE="">

<table width="75%" border="1">

<tr>

<td colspan="5">学生列表</td>

</tr>

<tr>

<td>学号</td>

<td>姓名</td>

<td>班级</td>

<td>备注一</td>

<td>选择</td>

</tr>

<%for (int i=0;i<total;i  ){

Student current=student[i];%>

<tr>

<td><%=current.getId()%></td>

<td><%=current.getName()%></td>

<td><%=current.getDepart()%></td>

<td><%=current.getSex() %></td>

<td>

<input type="checkbox" name="id" value=<%=current.getId()%>>

</td>

<% } %>

</tr><tr>

<td colspan="5">

<INPUT TYPE="BUTTON" onclick="doEdit();" VALUE="编辑">

<INPUT TYPE="BUTTON" onclick="showAddPage()" VALUE="增加">

<INPUT TYPE="BUTTON" onclick="doDelete();" VALUE="删除">

</td>

</tr>

</table>

</form>

</html>



<%-- studentedit.jsp --%>

<jsp:useBean id="table" scope="page" class="manger.bean.EditStudentBean" />

<%table.processRequest(pageContext);%>

<p> </p>

<form name="EditForm" action="editstudent.jsp">

<INPUT TYPE="hidden" NAME="event" VALUE="<%=table.getEvent()%>" >

<table width="75%" border="1">

<tr> 

<td colspan="2"> 

<div align="center"><b>编辑学生信息</b></div>

</td>

</tr>

<tr> 

<td width="40%">学号:</td>

<td width="60%"> 

<input type="text" name="id" value="<%=table.getStudent().getId()%>">

</td>

</tr>

<%--下面的一些学生信息我们省略了--%> 

<tr> 

<td colspan="2">

<input type="submit" name="Submit" value="确定">

</td>

</tr>

</table>

</form>

我的想法是在student.jsp中显示学生列表,从这个页面可以转到增加和编辑页面,也可以在这个页面中删除学生,这三个功能都是由editstudent.jsp完成的。在editstudent.jsp中非常关键的一行代码就是<%table.processRequest(pageContext);%>,这会调用EditStudentBean类的processRequest方法:下面是EditStudentBean类processRequest方法和addStudent方法的代码:



public void processRequest (PageContext pageContext) 

throws SQLException,ServletException,IOException{

this.student.setId("");

this.student.setName("");

this.student.setPassword("");

this.student.setDepart("");

this.student.setSex("");

HttpServletRequest request=(HttpServletRequest)pageContext.getRequest();

String event=request.getParameter("event");

//this.event=event;

if(event==null || event.equals("")||event.equals("showAdd"))

{this.event="add";

}

else if(event.equals("showEdit"))

{this.event="edit";

String id=request.getParameter("id");

Student stu=StudentFactory.findStudentById(id);

this.student=stu;

}

else if(event.equals("add"))

{this.addStudent(pageContext);

} 

else if(event.equals("delete"))

{this.deleteStudent(pageContext);

} 

else if(event.equals("edit"))

{this.editStudent(pageContext);

} 

}



public void addStudent(PageContext page)

throws SQLException,ServletException,IOException{

HttpServletRequest request=(HttpServletRequest)page.getRequest();

HttpServletResponse response=(HttpServletResponse)page.getResponse();

JspWriter out=page.getOut();

String id=request.getParameter("id");

String name=request.getParameter("name");

String sex=request.getParameter("sex");

String pass=request.getParameter("password");

String depart=request.getParameter("depart");

if (id!=null&&name!=null&&sex!=null&&pass!=null&&depart!=null

&&!id.equals("")&&!name.equals("")&&!sex.equals("")&&!pass.equals("")&&!depart.equals(""))

{Student s=new Student();

s.setId(id);

s.setName(name);

s.setSex(sex);

s.setPassword(pass);

s.setDepart(depart);

s.save(null); 

response.sendRedirect("student.jsp"); 

}

else

{out.print("请添完所有信息");

}

}

processRequest方法的功能主要为获取提交给editstudent.jsp的event的值,根据不同的event调用不同的函数。例如event=add,则调用addStudent函数。

注意:在设置Student对象的各个属性值时,一定要按照表(见上面的SQL语句)中顺序来设置,例如在表中,id字段在name字段的前面,所以setId方法在setName方法前面,这主要是由于Table类中的putRow函数中执行插入操作的SQL语句有缺陷。在那个SQL语句中,它是按各属性在Row中的顺序来执行插入操作的。如过你不愿意按表中字段的顺序来设置Student的属性,可以对putRow函数更改如下:



String ss = "";

if (conditions==null) {

ss = "INSERT INTO " name "(";

for (int i=0;i<row.length();  i) {

String k = row.getKey( i );

ss  = k;

if (i != row.length()-1)

ss  = ", ";

}



ss  =") VALUES (";

for (int j=0; j<row.length();   j) { 

String v = row.get( j );

ss  = "'" v "'";

if (j != row.length()-1)

ss  = ", ";

}

ss  = ")";

}

限于篇幅,我省略了student.jsp文件中的一些内容,对这个jsp文件进行处理的bean为ListStudentBean,这个类主要实现一个函数getStudent,这个函数主要通过StudentFactory查寻到所有的学生,由于我在此函数中进行了分页处理,因此此函数只返回当前页需要的Student数组。具体的代码参看附件。

总之,我改进之后的这个JDBC封装器还是比较有效的,它能满足一般地需要,当然你也可以根据你的情况对其进行扩充,以更好地适应你的开发。

代码在Tomcat4.01 mysql3.23.43下测试通过。

关于作者
宗锋,男,西北大学计算机系硕士。兴趣主要集中在:java,linux,enhydra,barracuda。希望能与有共同爱好的朋友进行交流。E-mail: zong_feng@263.net.
Cassandra JDBC Wrapper:Datastax Java 驱动的扩展 Cassandra JDBC Wrapper为Cassandra数据库的操作提供了一层标准JDBC封装,支持诸如连接管理、数据查询和更新等核心操作。通过这种封装,开发者可以更加便捷地在Java应用中集成和使用Cassandra。// 示例代码:连接 Cassandra 数据库并进行数据查询通过上述示例代码,我们可以看到,通过Cassandra JDBC Wrapper,开发者可以像使用传统关系型数据库一样,使用Statement和ResultSet进行数据库查询操作。 阅读详情

相关推荐

基于强化学习方法的PID参数整定

前言 PID控制器在工业界应用非常广泛,但是PID的参数调节一般需要人工根据经验法来试。对于有经验的工程师来说,一般试几次就可以获得满足调节的参数。然而对于新手工程师却很难确定一套比较好的参数。 这里我们采用强化学习的方法来调节PID参数。 这个例子展示了如何使用双延迟深度确定性策略梯度(TD3:twin-delayed deep deterministic policy gradient)强化学习算法来调整PI控制器。整定控制器的性能与使用Control System Tuner app整定的控制器的性能

weixin_42188287的博客 2万+

java怎么看util源码_JDK源码(1.7) -- java.util.Arrays

java.util.Arrays 源码分析---------------------------------------------------------------------------------java.util.Arrays是一个工具类,它的定义如下:1 public classArrays {2 //Sorting of primitive type arrays.34 ...

weixin_36096321的博客 204

算力网:正在编织的“第二电网“

中国算力网:编织智能时代的"第二电网" 中国正在构建全国一体化算力网,目标让算力资源像水电一样即取即用。这一国家战略通过"东数西算"布局,将东部算力需求与西部清洁能源优势结合,形成三级时延圈(1ms城市级、5ms区域级、20ms国家级)。算力网采用三层架构:基础设施层的八大枢纽节点作为"发电厂",编排管理层的智能调度系统作为"调度中心",运营服务层提供标准化算力服务。关键技术包括算力路由、异构算力统一度量、无损网络和液冷技术等。

这只是一个博客 670

一个简单的 JDBC 包装器

JDBC 提供了一种强大、全面的接口用来从 Java 程序访问数据库。对于较小的项目来说,使用 JDBC 似乎是理所当然的,它使一些程序员避免了同时使用数据库。本文描述了一种简单的包装器库,它让使用简单的数据库易如反掌。您会发现您已经开始想在编写的每一个程序中都使用 JDBC。全文阅读:http://www.javah.net/JDBC_JDO/20070525/1937.html

zaowei21的专栏 654

VASP计算层错能(SFE)全攻略2

本文介绍了使用VASP计算纯镍(Ni)层错能(SFE)的具体步骤。首先构建Ni的FCC单胞并扩展为超胞,通过修改原子位置引入堆垛层错;随后分别计算完美晶体和含层错结构的能量;最后通过能量差与层错面积之比求得SFE值。计算需注意k点网格、截断能和超胞尺寸的收敛性测试,并推荐使用PAW赝势和ASE等工具辅助结构构建。

weixin_50519490的博客 1990

Python+OpenCV实战:雨天车牌识别准确率提升300%的5个关键技巧

本文针对雨天车牌识别准确率骤降的难题,分享了五个基于Python和OpenCV的实战技巧。通过暗通道先验去雾、雨纹抑制、光照不变量颜色空间转换、多尺度自适应阈值分割以及融合传统特征与轻量级深度学习的混合识别策略,系统性地提升了算法在恶劣天气下的鲁棒性。这些方法能有效解决图像模糊、对比度低、字符断裂粘连等问题,为智能交通等实际应用提供可靠解决方案。

k8l9m0n的博客 717

一个简单的基于spring jdbc的扩展

今天试了一下用spring的jdbcTemplate来增删改查的功能,感觉还是挺麻烦的,于是就扩展了一下,代码比较凌乱,见谅。 原来的UserDao:@Resource private JdbcTemplate jdbcTemplate;@Override public void save(User t) { if(t == null) return ; this.jdbcTemp

Fengshunui的博客 511

Python实战:5分钟搞定滑动平均窗口计算(附完整代码+逐行注释)

本文深入解析Python中滑动平均窗口计算的实现与优化,提供Numpy、Pandas等多种高效方案,并附完整代码和逐行注释。涵盖边界处理、性能优化及异常检测等实战技巧,帮助开发者快速掌握时间序列数据处理的核心技术。

weixin_30872157的博客 125

Java-Wrapper-包装器-JDBC-代理

所有方法接口方法抽象方法boolean> iface)如果对象实现了接口inface,或者直接或间接地为一个iface对象的包装器,则返回true。<T> T返回一个实现接口iface的对象,以允许访问非标准方法,或代理对象没有暴露的标准方法。

Java程序员的知识博客 1255

【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛。 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口,然后还需要3个IO片选数码管接口,这样大大占用了IO口,导致连接的外设变少。因此我们引入74LS595芯片。电路设计如下: 只需要三个共阴极数码管与三个595芯片级联即可完成,通过RCLK,SCK,SER三个IO即可完成对数码管的动态控制并显示。电路焊接的实物图如下: 要求完成功能:实现数.

XiaoCaiDaYong的博客 8266

Django框架中settings文件的部署建议

为了更好地管理开发和生产环境的配置,建议将settings文件分为多个文件,分别用于不同的环境。然后,通过在启动应用程序时指定不同的settings文件,来加载相应的配置。在Django框架中,settings.py文件是非常重要的配置文件,它包含了项目的各种设置和选项。在Django框架中,settings.py文件是非常重要的配置文件,它包含了项目的各种设置和选项。可以使用Python的。为了更好地管理开发和生产环境的配置,建议将settings文件分为多个文件,分别用于不同的环境。

WELL_CODER的博客 129

jcabi-jdbc:项目的核心功能/场景

jcabi-jdbc:项目的核心功能/场景 jcabi-jdbc 是一个用于简化 JDBC 操作的流畅接口包装器。 项目介绍 jcabi-jdbc 是一个开源的 Java 库,旨在通过提供一个简单、易用的流畅接口(fluent interface)来简化 Java 数据库连接(JDBC)的操作。这个库使得数据库操作变得更加直观,易于编写和维护。它不仅支持标准 JDBC 操作,还提供了一些高级特性,...

gitblog_00995的博客 771

【芯片设计- RTL 编译与仿真 1.2 -- Visualizer 常用使用命令】

打开波形后,如果想要看到所有信号的数据,可以点击下图中红框中的按钮,因为默认verdi 默认并不是显示所用信号。如果想统计某一个信号中有多少笔数据时,可以使用 Expression->Edege Count 功能。如下图所示,如果没有打开前导0的功能时,当某一笔数据位0时,只会显示1个0。如果需要将波形的数据导出到文本文件时,可以按照下面步骤进行。打开前导0功能之后,会根据数据位宽来显示对应0的个数。

CodingCos的博客 2049

Amazon Web Services (AWS) JDBC Driver:解锁云数据库的无限可能

Amazon Web Services (AWS) JDBC Driver:解锁云数据库的无限可能 项目介绍 Amazon Web Services (AWS) JDBC Driver 是一款专为云数据库设计的先进JDBC包装器。它并非直接连接到任何数据库,而是通过扩展现有JDBC驱动程序的功能,使应用程序能够充分利用如Amazon Aurora等集群数据库的特性。该驱动程序支持与PostgreS...

gitblog_00088的博客 651

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[转载]使用通用 SQL 实体 EJB 包装器来简化 EJB 开发

使用通用 SQL 实体 EJB 包装器来简化 EJB 开发Enterprise JavaBeans(EJB)的设计旨在减少企业应用程序的开发时间,但是有可能因为滥用 EJB 而导致最终开发出来的应用程序难以维护而且性能低下。本...

congji3817的博客 207

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【亲测免费】 AWS Advanced JDBC Wrapper 使用教程

AWS Advanced JDBC Wrapper 使用教程 1. 项目介绍 AWS Advanced JDBC Wrapper 是一个高级的 JDBC 包装器,旨在扩展现有 JDBC 驱动程序的功能,帮助应用程序充分利用集群数据库(如 Amazon Aurora)的特性。该项目由 Amazon Web Services (AWS) 开发并开源,基于 Apache 2.0 许可证发布。 该包装器不...

gitblog_00309的博客 1207

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Clojure.java.jdbc社区生态:相关工具与扩展库完整指南

Clojure.java.jdbc作为Clojure生态系统中经典的JDBC数据库访问库,已经发展出一个丰富而成熟的工具生态系统。这个完整的指南将为您详细介绍围绕Clojure.java.jdbc构建的各种相关工具和扩展库,帮助您更好地利用这个强大的数据库访问解决方案。🎯 ## Clojure.java.jdbc简介与核心功能 Clojure.java.jdbc是一个低级的Clojure包装

gitblog_00930的博客 378

一个简单实用的数据库操作框架

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 539

AWS Advanced JDBC Wrapper 使用教程

AWS Advanced JDBC Wrapper 使用教程 1. 项目介绍 AWS Advanced JDBC Wrapper 是一个高级的 JDBC 包装器,旨在扩展现有 JDBC 驱动程序的功能,使应用程序能够充分利用 Amazon Aurora 等集群数据库的特性。该包装器不直接连接到任何数据库,而是在用户选择的底层 JDBC 驱动程序之上提供对 AWS 和 Aurora 功能的增强支持。...

gitblog_01159的博客 538

JDBC 规范与 ShardingSphere 是什么关系?

JDBC 规范简介 ShardingSphere 提供了与 JDBC 规范完全兼容的实现过程,在对这一过程进行详细展开之前,先来回顾一下 JDBC 规范。JDBC(Java Database Connectivity)的设计初衷是提供一套用于各种数据库的统一标准,而不同的数据库厂家共同遵守这套标准,并提供各自的实现方案供应用程序调用。作为统一标准,JDBC 规范具有完整的架构体系,如下图...

qq_29860591的博客 758

【JDBC4.2】Wrapper和AutoCloseable

java.sql.Wrapper接口Wrapper接口可以把一个非JDBC标准的接口(第三方驱动提供的)包装成标准接口。许多 JDBC 驱动程序实现使用包装器模式提供超越传统 JDBC API 的扩展,传统 JDBC API 是特定于数据源的。开发人员可能希望访问那些被包装(代理)为代表实际资源代理类实例的资源。此接口描述访问那些由代理代表的包装资源的标准机制,以允许对资源代理的直接访问。 下面JD

要啥自行车 3041

java 操作mysql框架_一个简单实用的数据库操作框架(JAVA)

前言这个小小的数据库操作封装框架是参考IBM开发网上的两篇文章并在其基础上扩充了一些功能而得到的。所以首先要感谢两篇文章的作者。学习JDBC以来一直想实现一个简单的封装来方便编程但是由于水平有限一直没有较好的办法,看了IBM开发网上的两篇文章以后感觉作者的设计思想很好一定能扩充成一个实用的JDBC封装。所以我在文章提供的源码基础上加了一些功能这些功能包括支持多种数据类型,处理了空值,利用反射方便的...

weixin_33138569的博客 1066

Spring Roo 简介,第 5 部分: 编写 Spring Roo 的高级附加组件和包装器附加组件

本系列 “Spring Roo 简介” 的 Spring Roo 简介,第 3 部分:开发 Spring Roo 的附加组件 讨论了 Spring Roo 附加架构,以及如何使用 addon create 命令创建国际化的、简单的附加组件。本文主要关注 Spring Roo 支持的其余两种类型的附加组件,即高级附加组件和包装器附加组件。建议您在开始阅读本文之前先阅读第 3 部分的文章。 高级附...

lgshendy的专栏 275

JDBC 4.2 Specifications 中文翻译 -- 第二章 目标

2.1 JDBC API 的历史 JDBC API 是一种成熟的技术,1997 年, 首次提出了 JDBC 规范,初始的版本中, JDBC API 仅提供一套针对数据库的调用级别接口。 从 2.0 版本和 2.1 版本开始,JDBC API 的功能得到增强,它能够支持更高级别的应用程序, 也提供一些高级特性,供开发应用服务器的开发者使用。...

weixin_33785108的博客 241
上一篇: Java指南第二版
下一篇: Servlet技术及其与CGI的比较
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值