当前位置: 首页 > news >正文

吉安市建设技术培训中心网站做图片类型网站需要什么服务器

吉安市建设技术培训中心网站,做图片类型网站需要什么服务器,做网站创意,有赞商城官网登录通过本章需要理解JDBC的核心设计思想以及4种数据库访问机制#xff0c;理解数据库连接处理流程#xff0c;并且可以使用JDBC进行Oracle数据库的连接#xff0c;理解工厂设计模式在JDBC中的应用#xff0c;清楚地理解DriverManager类的作用#xff0c;掌握Connection、Prep…通过本章需要理解JDBC的核心设计思想以及4种数据库访问机制理解数据库连接处理流程并且可以使用JDBC进行Oracle数据库的连接理解工厂设计模式在JDBC中的应用清楚地理解DriverManager类的作用掌握Connection、PreparedStatement、Result等核心接口的使用柄可以实现数据的增、删、改、查操作掌握JDBC提供的提供的数据批处理操作的实现掌握数据库事物的作用并可以利用JDBC实现数据库是控制。 在现代的程序开发中大量的开发都是基于数据库尔德是用数据库可以方便的实现数据的存储及查找本章将就Java的数据库操作技术--JDBC进行讲解。 20.1 JDBC简介 JDBC(Java Database Connectivity,Java数据库连接)提供了一个与平台无关的用于执行SQL语句的标准Java API可以方便的实现多中国关系型数据库的统一操作他有一组用Java语言编写的类和接口组成。不同的数据库如果想要使用Java开发就必须实现这些接口的标准。但是JDBC严格来说不属于技术而是一种服务即所有的操作步骤完全固定。 提示如果要学习本章首先要具备基本的SQL语法知识同时本书使用的是Oracle数据库可以参照《Oracle开发实战经典》 JDBC本身提供的是一套数据库操作标准而这些标准有需要各个数据库厂商实现所以针对每个数据库厂商都会提供一个JDBC的驱动程序。目前就比较常见的JDBC驱动程序可以分为以下四类 1 JDBC-ODBC桥驱动 JDBC-ODBC是SUN提供的一个标准JDBC操作直接利用微软的ODBC进行数据库的连接操作其桥接模式如图 但是由于此种模式需要通过JDBC访问ODBC,再通过SQL数据库访问SQL数据库所以在数据量较大时这种操作性能较低所以在通常情况下不推荐使用这种方式进行操作。 提示关于ODBC ODBC(Open Database Connectivity开发数据库连接)是微软公司提供的一套数据库操作的编程接口SUN的JDBC实现实际上也是模仿了ODBC的设计。 2 JDBC本地驱动 直接使用各个数据库生产上升提供的程序库操作但是由于其智能应用在特定的数据库上会丧失程序的可移植性与JDBC-ODBC桥接模式相比较此类操作模式的性能较高但其最大的缺点在于无法进行网络分布式存储 3JDBC网络驱动 这种驱动程序将JDBC转换为与DBMS无关的网络协议之后这种协议又被某台服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯java客户机链接到多种不同的数据库上如下所示所用的具体协议取决于提供者JDBC网络驱动是最为灵活的JDBC驱动程序 4 本地协议纯JDBC驱动 这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。这将允许从客户机上直接调用DBMS服务器是Internet访问的一个很实用的解决方法。         JDBC中的·核心组成在java.sql包中定义该包中的核心类结构为DriverManager类Connection接口、Statement接口、PreparedStatement接口、ResultSet接口 20.2 连接Oracle数据库 oracle数据库安装全步骤详解 - 知乎 JDBC可以通过标准连接支持JDBC的SQL数据库本节将利用JDBC实现Oracle数据库的连接。数据库的连接操作主要是用DriverManager.getConnection()方法完成此类可以获取多个数据库的连接每一个数据库链接都是用Connectio接口描述方法如下oracle数据库安装全步骤详解 - 知乎 提示JDBC连接准备 在通过JDBC连接SQL数据库首先必须保证连接的SQL数据库的服务进程已经开启例如本次链接的事Oracle数据库必须开启监听与数据库实例服务JDBC属于Java提供的服务标准对于所有的服务都有着固定的操作步骤。JDBC操作步骤如下 1加载数据库驱动程序。各个数据库都会提供JDBC的驱动程序开发包直接把JDBC操作所需要的开发包(一般为*.jar或*.zip)配置到CLASSPATH路径即可。         提示Oracle驱动程序路径 一般像Oracle或DB2这种大型数据库在安装后在安装目录中都会提供数据库厂商提供的相应数据库驱动程序开发者需要将驱动程序设置到CLASSPATH中(如果是Eclipse则需要通过Java Builder Path配置扩展*.jar文件). 2连接数据库 根据不同数据库提供的连接信息、用户名与密码建立数据库连接通道。 Oracle连接地址结构jdbc:oracle:thin:主机名称:端口号:SID.例如连接本机MLDN数据库 jdbc:oracle:thinlocalhost:1521:mldn; 用户名scott 密码tiger 3使用语句进行数据库操作。数据库操作分为更新和查询两种操作除了可以使用标准的SQL语句外对于各个数据库也可以使用其自己提供的各种命令。 4关闭数据库连接。数据库操作完毕后需要关闭连接以释放资源。 范例连接Oracle数据库 package cn.mldn.demo; import java.sql.Connection; import java.sql.DriverManager; public class JDBCDemo { private static final String DATABASE_DRIVERoracle.jdbc.driver.OracleDriver; private static final String DATABASE_URLjdbc:oracle:thin:localhost:1521; private static final String DATABASE_USERscott; private static final String DATABASE_PASSWORDtiger; public static void main(String[]args)throws Exception { Connection connnull;//保存数据库的连接 Class.forName(DATABASE_DRIVER);//加载数据库驱动程序 connDriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD); System.out.println(conn); conn.close(); } } 本程序将数据库连接的相关信息定义为常量随后进行数据库驱动程序加载加载成功后会根据连接地址、用户名、密码获取连接。由于本程序已经连接成功所以输出得conn对象不为null数据库连接属于资源所以在最后需要使用close()方法进行关闭。 提示JDBC使用了工厂模式 在JDBC开发中Connection是一个数据库连接的标准接口而程序要想获取Connection接口实例则必须通过DriverManager类获取 通过上图可以发现程序通过DriverManager类可以在不清楚子类具体实现的情况下获取任意数据库的Connection接口实例所以DriverManager类的作用相当于工厂类。 20.3 Statement数据操作接口 Statement是JDBC中提供的数据库操作接口利用其可以实现数据的更新与查询的处理操作。该接口定义如下         public interface Statement extends Wrapper,AutoCloseable{} 开发者可以通过Connection接口提供的createStatement()方法创建Statement接口实例随后利用下表的接口进行SQL数据操作下面将通过Statement实现数据表的增加、修改、删除、查询等常见操作本次所使用的数据表创建脚本如下 范例数据库创建脚本 DROP TABLE news PURGE; DROP SEQUENCE news_seq; CREATE SEQUENCE news_seq; CREATE TABLE news(nid Number,title VARCHAR(30),read NUMBER,price NUMBER,content CLOB,pubdate DATE,CONSTRAINT pk_nid PRIMARY KEY(nid)); 在给定的数据库脚本中包含数据库开发中的常见数据类型(NUMBER,VARCHAR2,DATE,CLOB),且使用序列(SEQUENCE进行nid列数据生成). 20.3.1 数据更新操作 在SQL语句中数据的更新操作一共分为三种增加(INSERT)、修改(UPDATE)、删除(DELETE).Statement接口的最大特点是可以直接执行一个标准的SQL语句 范例实现数据增加 SQL语法INSERT INTO 表名称(字段字段,...)values(值值) package cn.mldn.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class JDBCDemo { private static final String DATABASE_DRIVERoracle.jdbc.driver.OracleDriver; private static final String DATABASE_URLjdbc:oracle:thin:localhost:1521; private static final String DATABASE_USERscott; private static final String DATABASE_PASSWORDtiger; public static void main(String[]args)throws Exception { String sqlINSERT INTO news(nid,title,price,content,pubdate)values(news_seq.nextval,aaa,10,9.15, 啊啊啊啊, TO-DATE(2015-02-17,yyyy-mm-dd))//SQL语句 Connection connnull;//保存数据库的连接 Class.forName(DATABASE_DRIVER);//加载数据库驱动程序 connDriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD); Statement stmtconn.createStatement();//数据库操作对象 int countstmt.executeUpdate(sql);//返回更新操作数 System.out.println(更新操作的数据行数count);//输出数据行数 conn.close(); } } 本程序通过Connection连接对象创建了Statement接口实例这样就可以利用executeUpdate()方法直接执行SQL更新语句当执行完成后会返回更新的数据行数由于只增加一行数据所以最终取得更新行数为1. 范例实现数据修改 SQL语法UPDATE 表名称 SET 字段 字段值,...WHERE 更新条件 public class JDBCDemo { public static void main(String[]args)throws Exception { String sqlUPDATE news set titleaaaa,contentBBB, read999 WHERE nid5; } } 范例实现数据删除 SQL语法DELETE FROM 表名称 WHERE 删除条件(s) DELETE FROM news WHERE nid IN (11,13,15) 20.3.2 数据查询操作 数据查询操作会利用SQL语句向数据库发出SELECT查询指令而查询的结果如果要返回给程序进行处理就必须通过ResultSet接口进行封装。ResultSet是一种可以保存任意查询结果的集合结构所有查询结果会通过ResultSet在内存中形成一张虚拟表而后开发者可以根据数据行的缩影按照数据类型获得列数据内容其处理流程如下 当所有的记录返回到ResultSet的时候所有的内容都是按照表结构的形式存放的所以用于只需要按照数据类型从每行取出所需要的数据即可 范例实现数据查询 public class JDBCDemo { public static void main(String[]args)throws Exception { //此处编写的        SQL语句明确写明了要查询的列名称这样查询结果就可以根据列索引顺序获取内容。 String sqlSELECT nid,title,read,price,content,pubdate FROM news; Connection connnull;//保存数据库连接 Class.forName(DATABASE_DRIVER);//加载数据库驱动程序 connDriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);//连接数据库 Statement stmtconn.createStatement();//数据库操作对象 ResultSet rsstmt.executeQuery(sql);//执行查询 while(rs.next()) { //循环获取结果集数据 int nidrs.getInt(1);//获取第一个查询列结果 String titlers.getString(2);//第二个 int readrs.getInt(3);//第3个 double pricers.getDouble(4); String contentrs.getString(5); Date pubdaters.getDate(6); } } } 本程序通过ResultSet集合保存了JDBC查询结果由于ResultSet以表的形式返回所以可以利用next()方法修改数据索引(同时也可以判断数据行是否全部读取完毕)随后利用getXxx方法获取数据列类型读取数据内容。 提问SQL使用“*”查询不是更方便 在本程序中编写SQL查询语句使用“*”不是更方便吗 String sqlSELECT *FROM news; 为什么在本程序中不使用*通配符而写上具体列的名称呢 回答使用具体列名称的查询更加适合于程序维护 在本程序中如果在查询语句上使用了*,那么在使用ResultSet依据索引获得内容时就必须根据查询列的默认顺序进行定义这样势必会造成代码的开发与维护的困难。在这种情况下为了可以清晰地读取数据就需要明确的使用列名称进行数据读取 String sqlSELECT *FROM news; while(rs.next()) { //循环获取结果集数据 int nidrs.getInt(1);//获取第一个查询列结果 String titlers.getString(2);//第二个 int readrs.getInt(3);//第3个 double pricers.getDouble(4); String contentrs.getString(5); Date pubdaters.getDate(6); } 虽然以上代码可以实现读取但是也需要注意内存占用的问题数据查询时如果返回了过多的无用数据会造成内存占用导致性能下降所以在使用JDBC进行数据查询时最好只查询需要的数据内容。 20.4 PreparedStatement数据操作接口 PreparedStatement是Statement的子接口属于SQL预处理操作与直接使用Statement不同的是PreparedStatement在操作时是先在数据表中准备好了一条待执行的SQL语句随后在设置具体的内容这样的处理模型使得数据库操作更加安全为了解释PreparedStatement的作用下面首先通过Statement模拟一个数据增加操作。 范例观察Statement接口使用问题 public class JDBCDemo { public static void main(String[]args)throws Exception { String titlemldn; int read99; double price99.8; String contentAAA; String pubdate2017-09-15; String sqlINSERT INTO news(nid,title,read,price,content,pubdate) VALUES (news seq.nextval,title ,read,price,content , TO DATE(pubdate,,yyyy-mm-dd));//拼凑执行SQL System.out.println(sql);//输出拼凑后的SQL Connection connnull;//保存数据库连接 Class.forName(DATABASE_DRIVER);//加载数据库连接 connDriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);//连接数据库 Statement stmtconn.createSatement();//数据库操作对象 int countstmt.executeUpdate(sql);//返回更新数据行数 System.out.println(count); conn.close(); } } 本程序通过变量的形式定义了SQL要插入的数据内容而通过本程序的执行可以发现statement有如下三个问题 Statement在数据库操作中需要一个完整的SQL明玲玲一旦需要通过变量进行内容接收则需要进行SQL语句的拼接而这样的代码不方便阅读也不方便维护执行的SQL语句中如果出现一些限定符号则拼凑SQL执行时就会引发SQL标记异常。 进行日期数据定义时只能够使用String类型而后通过数据库函数转换。 综合以上几个问题就可以得出结论Statement接口只适用于简单执行SQL语句的情况而要想更加安全可靠的进行数据库操作就必须通过PreparedStatement接口完成。 20.4.1PreparedStatement数据更新 在PreparedStatement进行数据库操作时可以再便携SQL语句时通过“?”占位符的设计Connection接口会根据磁SQL语句通过preparedStatement()方法实例化PreparedStatement接口实例此时并不是到具体数据内容在进行更新或查询擦左前利用setXxx方法依据设置的占位符所言顺醋进行内容设置。常用方法如下 范例使用PreparedStatement接口实现数据增加操作 public class JDBCDemo { public static void main(String[]args)throws Exception { String titlemldn; int read99; double price99.8; String contentAAA; java.util.Date pubdatenew java.util.Date();//定义日期对象 //需要先定义SQL语句后才可以创建PreparedStatement接口实例定义时可以采用占位符 String sqlINSERT INTO news(nid,title,read,price,content,pubdate) VALUES (news_seq.nextval,?,?,?,?,?);使用?作为占位符 Connection connnull;//保存数据库连接 Class.forName(DATABASE_DRIVER);//家在数据库驱动程序 connDriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);//连接数据库 pstmt.setString(1,title);//设置索引内容 pstmt.setInt(2,read);//设置索引内容 pstmt.setDouble(3,price); pstmt.setString(4,content); pstmt.setDate(5,new java.sql.Date(pubdate.getTime())); int countpstmt.executeUpdate();//返回影响的行数 System.out.println(更新操作影响的数据行数:count); conn.close(); } } 本程序在定义SQL语句的时候使用若干个“”进行要操作数据的占位符定义这样在执行更新前就必须利用setXxx方法根据索引和列类型进行数据内容的设置由于此类方式没有采用拼凑式的SQL定义所以程序编写简介数据的处理更加安全程序开发也更加灵活。 本程序在定义SQL语句的时候使用若干个?进行要操作数据的占位符定义这样在执行更新前就必须利用setXxx()方法依据索引和列类型进行数据内容的设置由于此类方法没有采用拼凑式的SQL定义所以程序编写简洁数据的处理更加安全程序的开发也更加灵活。 提示关于日期时间型数据在JDBC中的描述 在本程序中使用setDate()方法设置日期数据时执行了以下的代码pstmt.setDate(5,new java.sql.Date(pubdate.getTime()));         此代码的核心意义在于将java.util.Date类的实例转化为了java.sql.Date类的实例之所以这样转换是因为在JDBC中PreparedStatement、ResultSet操作的日期类型为java.sql.Date 由于JDBC并没有与java.util.Date类产生任何直接关联所以在使用PreparedStatement进行内容设置时就需要将java.util.Date的时间错数据去除并使用java.sql.Date、java.sql.Time、java.sql.Timestamp的构造方法将时间戳变为各自的子类实例化才可以通过setXxx()方法设置。而在使用ResultSet获取数据时所有的日期时间类实例都可以自动向上转型为java.util.Date类实例 20.4.2 PreparedStatement数据查询 查询是在实际开发中最复杂也是项目中使用最多的数据库操作利用PreparedStatement也可以通过占位符实现数据查询操作。 范例查询表中全部数据 public class JDBCDemo { public static void main(String[]args)throws Exception { String sqlSELECT nid,title,read,price,content,pubdate FROM news; Connection connnull;//保存数据库连接 Class.forName(DATABASE_DRIVER);//加载数据库驱动程序 connDriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD        );//连接数据库 PreparedStatement pstmtconn.preparedStatement(sql); ResultSet rspstmt.executeQuery();//执行查询 while(rs.next()) { int nidrs.getInt(1); String titlers.getString(2); int readrs.getInt(3); double pricers.getDouble(4); String contentrs.getString(5); Date pubdaters.getDate(6); } } } 本程序对news数据表数据实现了简单查询由于查询SQL语句中并没有使用占位符设计所以可以直接使用executeQuery()方法执行查询。 范例根据id进行查询 public class JDBCDemo { public static void main(String []args)throws Exception { String sqlSELECT nid,title,read,price,content,pubdate FROM news WHERE nid?; PreparesStatement pstmtconn.prepareStatement(sql);//数据库的操作对象 pstmt.setInt(1,5);//设置nid的数据 ResultSet rspstmt.executeQuery();//执行查询 if(rs.next()) {} conn.close(); } } 本程序查询了指定编号的新闻数据在定义SQL查询语句时使用了限定符进行查询条件数据设置。由于此类查询最多只会返回1行数据所以在使用ResultSet获取数据时利用if语句对查询结果进行判断如果查询结果存在则进行输出。 范例实现数据模糊查询同时进行分页控制 public class JDBCDemo { public static void main(String[]args)throws Exception { int currentPage2;//当前页 int lineSize5;//每页显示的数据行 String columntitle; String keyWordmldn; String sqlSELECT * FROM (SELECT nid,title,read,price,content,pubdate,ROWNUM rn FROM news WHERE column LIKE ? AND ROWNUM? ORDER BY nid)temp WHERE temp.rn?; PreparedStatement pstmtconn.prepareStatement(sql);//数据库的操作对象 pstmt.sednString(1,%keyWord%);//设置占位符数据 pstmt.setInt(2,currentPage*linSize);//设置占位符数据 pstmt.setInt(3,(currentPage-1)*lineSize);//设置占位符数据 ResultSet rspstmt.executeQuery(); while(rs.next()) {} conn.close(); } } 本程序实现了一个开发中最为重要的数据分页模糊查询操作将利用Oracle数据库提供的分页语法实现指定数据列上的数据模糊匹配由于匹配的数据可能出现在数据的任意匹配位置上所以在设置查询关键字时使用%%匹配符 注意不要在列名称上使用占位符 在使用PreparedStatement进行占位符定义式只允许在列内容上使用儿不允许在列名称上使用。以本程序为例FROM news WHERE ? LIKE ? AND ROWNUM? PRDER BY nid在SQL语句中限定查询的语法需要通过列名称匹配内容如果此时将列名称也设置为?.则代码执行时将出现错误。 范例数据统计查询 public class JDBCDemo { public static void main(String []args)throws Exception { String columntitle; String keyWordmldn; String sqlSELECT COUNT(*) FROM news WHEREcolumnLIKE ?; PreparedStatement pstmtconn.preparedStatement(sql);//数据库的操作对象 pstmt.setString(1,%keyWord%);//设置占位符数据 ResultSet rspstmt.executeQuery();//执行查询 if(rs.next()) { long countrs.getLong(1); System.out.println(count); } } } 在SQL查询中使用COUNT(*)方法可以实现指定数据表中的数据统计并且不管表中是否有数据行都一定会返回COUNT()函数的统计查询结果即rs.next()方法判断的结果一定为true在进行数据统计时由于表中数据行较多往往会通过getLong()方法接收统计结果。 20.5 数据批处理 JDBC随着JDK每次版本的更新也在不断地完善。从JDBC2.0开始为了方便操作者进行数据库的开发提供了许多更加方便的操作包括可滚定的结果集、使用结果集更新数据、批处理其中批处理在开发中使用较多 范例使用Statement实现批处理 public class JDBCDemo { public static void main(String[]args)throws Exception { Statement stmtconn.createStatement();//创建数据库的操作对象 stmt.addBatch(INSERT INTO news (nid,title)VALUES (news_seq.nextval,MLDN-A)); stmt.addBatch(INSERT INTO news (nid,title)VALUES (news_seq.nextval,MLDN-B)); stmt.addBatch(INSERT INTO news (nid,title)VALUES (news_seq.nextval,MLDN-C)); stmt.addBatch(INSERT INTO news (nid,title)VALUES (news_seq.nextval,MLDN-D)); int result[]stmt.executeBatch(); } } 本程序通过Statement提供的addBatch()方法加入了5条数据更新语句这样当执行executeBatch()方法时会一次性提交多条更新指令并且所有更新语句影响的数据行数将通过数组返回给调用处此类操作在大规模数据更新时会提高处理性能。 范例使用PreparedStatement执行批处理 public static void main(String[]args)throws Exception { String sqlINSERT INTO news(nid,title) VALUES(news_seq.nextval,?); String title[]new String[]{A,B,C,D}; PreparedStatement pstmtconn.prepareStatement(sql);//创建数据库的操作对象 for(String title:titles) { pstmt.setString(1,title);//设置占位符数据 pstmt.addBatch();//追加批处理 } int result[]pstmt.executeBatch(); } 20.6 事务控制 事务处理在数据库开发中有着非常重要的作用所谓的事务就是所有的操作要么一起成功要么一起失败。事务本身具有原子性(Atomicity)、一致性(Consistency)、隔离性或独立性(Isolation)、持久性(Durability)4个特征又称ACID特征 原子性:原子性时事务最小的单元是不可再分的单元相当于一个个小的数据库操作这些操作必须同时完成如果有一个失败则一切操作将全部失败如上图所示用户A转账和用户B转账分别是两个不可再分的操作但是如果用户A的转账失败则用户B的转账操作也肯定无法成功。 一致性:是指在数据库操作的前后是完全一致的保证数据的有效性如果事务正常操作则系统会维持有效性如果事务出现了错误则回到最原始状态也要维持其有效性这样保证事务开始和结束时系统处于一致状态如上图如果用户A和用户B转账成功则保持其一致性如果现在A和B转账失败则保持操作之前的一致性即用户A的钱不会减少用户B的钱不会增加。 隔离性:多个事务可以同时进行且彼此之间无法访问只有当事务完成最终操作的时候才可以看到结果。 持久性当一个系统崩溃时一个事物依然可以坚持提交当一个事务完成后操作的结果保存在磁盘中永远不会被回滚如上图所示所有的资金数都保存在磁盘中所以即使系统发生了错误用户的资金也不会减少。 在JDBC中事务控制需要通过Connection接口中提供的方法来实现由于JDBC中已经默认开启了事物的自动化提交模式所以为了保证事务处理的一致性就必须调用setAutoCommit()方法取消事务自动提交随后再根据SQL的执行结果来决定实物是否需要提交commit()或回滚(rollback()) 范例使用JDBC实现事务控制(利用Statement批处理进行演示) public static void main(String[]args)throws Exception { Connection connnull;//保存数据库连接 Class.forName(DATABASE_DRIVER);//加载数据库驱动程序 conn.DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);//连接数据库 Statement stmtconn.createStatement();//创建数据库的操作对象 stmt.addBatch(INSERT INTO news(nid,title)VALUES(news_seq.nextval,B)); stmt.addBatch(INSERT INTO news(nid,title)VALUES(news_seq.nextval,C)); int result[]stmt.executeBatch();//执行批处理 conn.commit();//事务提交 }
http://www.hkea.cn/news/14440926/

相关文章:

  • 网站做一个多少钱做网站需要租服务器
  • 网站建设信息模板开发app需要多少人
  • 网站策划方案如何做苏州知名高端网站建设机构
  • 网站项目开发流程及规范烟台快速建站公司
  • 北京网站开发浩森宇特h5免费制作平台无水印
  • 对比网站找项目
  • 那些网站可以接私活做百度广告竞价排名
  • 厦门建站比较好的公司app外包公司怎么找
  • 网站建设设计平台网站策划案需要包括哪些
  • 宜昌本地网站做导航网站用什么建站程序
  • 建设银行福州分行招聘网站阿帕奇网站搭建
  • 建设银行分期手机网站wordpress文章列表格子
  • 在线设计网站源码云南新闻最新消息今天
  • 锡林浩特网站建设注册城乡规划师考试教材
  • 澎湃动力网站建设公司品牌网站建设报价方案
  • 门户网站和社交网络的区别wordpress网站如何添加栏目
  • 网站数据库空间大小婚庆策划公司
  • 怎样注册一个自己的网站wordpress中的全站链接怎么改
  • 网页安全站点设置学校网站建设总结报告
  • 有哪些做软件的网站工地用木模板尺寸
  • 如何制作一般企业网站开发三味风车动漫无修
  • 建立学校网站如何建设一个子网站
  • 用dw怎么做用户登录页面的网站测评网站怎么做
  • 设计网站评分标准可信的邢台做网站
  • 浙江二建建设集团有限公司网站普洱网站建设
  • asp网站 访问 变慢 监测wordpress顶部菜单调用
  • js做网站登录框验证码企业网络搭建是什么
  • 东莞有哪些好的网站建设公司优惠券网站做淘客违规吗
  • 帝国网站调用图片集跨境电商网站如何做推广
  • 济宁建设网站首页南宁网站建设 超博网络