国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

wordpress 渲染html石家莊關(guān)鍵詞優(yōu)化平臺(tái)

wordpress 渲染html,石家莊關(guān)鍵詞優(yōu)化平臺(tái),制作app的軟件有哪些,廊坊網(wǎng)站搜索優(yōu)化聲明式事務(wù) 一、簡(jiǎn)介1、準(zhǔn)備工作2、測(cè)試 二、聲明式事務(wù)概念1、編程式事務(wù)2、聲明式事務(wù)3、基于注解的聲明式事務(wù)1.測(cè)試無事務(wù)情況2.加入事務(wù)①Transactional注解標(biāo)識(shí)的位置②事務(wù)屬性:只讀③事務(wù)屬性:超時(shí)④事務(wù)屬性:回滾策略⑤事務(wù)屬性&…

聲明式事務(wù)

  • 一、簡(jiǎn)介
    • 1、準(zhǔn)備工作
    • 2、測(cè)試
  • 二、聲明式事務(wù)概念
    • 1、編程式事務(wù)
    • 2、聲明式事務(wù)
    • 3、基于注解的聲明式事務(wù)
      • 1.測(cè)試無事務(wù)情況
      • 2.加入事務(wù)
        • ①@Transactional注解標(biāo)識(shí)的位置
        • ②事務(wù)屬性:只讀
        • ③事務(wù)屬性:超時(shí)
        • ④事務(wù)屬性:回滾策略
        • ⑤事務(wù)屬性:事務(wù)隔離級(jí)別
        • ⑥事務(wù)屬性:事務(wù)傳播行為


一、簡(jiǎn)介

Spring 框架對(duì) JDBC 進(jìn)行封裝,使用 JdbcTemplate 方便實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)操作

1、準(zhǔn)備工作

①加入依賴

    <dependencies><!-- 基于Maven依賴傳遞性,導(dǎo)入spring-context依賴即可導(dǎo)入當(dāng)前所需所有jar包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.1</version></dependency><!-- Spring 持久化層支持jar包 --><!-- Spring 在執(zhí)行持久化層操作、與持久化層技術(shù)進(jìn)行整合過程中,需要使用orm、jdbc、tx三個(gè)jar包 --><!-- 導(dǎo)入 orm 包就可以通過 Maven 的依賴傳遞性把其他兩個(gè)也導(dǎo)入 --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>5.3.1</version></dependency><!-- Spring 測(cè)試相關(guān) --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.1</version></dependency><!-- junit測(cè)試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- MySQL驅(qū)動(dòng) --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- 數(shù)據(jù)源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.31</version></dependency></dependencies>

②創(chuàng)建jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3309/ssm?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456

在這里插入圖片描述
③配置Spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--    引入jdbc依賴--><context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><!-- 配置 JdbcTemplate用于test測(cè)試--><bean class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean>
</beans>

2、測(cè)試

①在測(cè)試類裝配 JdbcTemplate

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-jdbc.xml")
public class JDBCTemplateTest {
@Autowired
private JdbcTemplate jdbcTemplate;
}

②測(cè)試增刪改功能

@Test
//測(cè)試增刪改功能
public void testUpdate(){
String sql = "insert into t_emp values(null,?,?,?)";
int result = jdbcTemplate.update(sql, "張三", 23, "男");
System.out.println(result);
}

③查詢一條數(shù)據(jù)為實(shí)體類對(duì)象

@Test
//查詢一條數(shù)據(jù)為一個(gè)實(shí)體類對(duì)象
public void testSelectEmpById(){
String sql = "select * from t_emp where id = ?";
Emp emp = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>
(Emp.class), 1);
System.out.println(emp);
}

二、聲明式事務(wù)概念

1、編程式事務(wù)

事務(wù)功能的相關(guān)操作全部通過自己編寫代碼來實(shí)現(xiàn):

Connection conn = ...;try {
// 開啟事務(wù):關(guān)閉事務(wù)的自動(dòng)提交conn.setAutoCommit(false);
// 核心操作
// 提交事務(wù)conn.commit();}catch(Exception e){
// 回滾事務(wù)conn.rollBack();}finally{// 釋放數(shù)據(jù)庫(kù)連接conn.close();}

編程式的實(shí)現(xiàn)方式存在缺陷:
細(xì)節(jié)沒有被屏蔽:具體操作過程中,所有細(xì)節(jié)都需要程序員自己來完成,比較繁瑣。
代碼復(fù)用性不高:如果沒有有效抽取出來,每次實(shí)現(xiàn)功能都需要自己編寫代碼,代碼就沒有得到復(fù)
用。

2、聲明式事務(wù)

既然事務(wù)控制的代碼有規(guī)律可循,代碼的結(jié)構(gòu)基本是確定的,所以框架就可以將固定模式的代碼抽取出來,進(jìn)行相關(guān)的封裝。
封裝起來后,我們只需要在配置文件中進(jìn)行簡(jiǎn)單的配置即可完成操作。

  • 好處1:提高開發(fā)效率
  • 好處2:消除了冗余的代碼
  • 好處3:框架會(huì)綜合考慮相關(guān)領(lǐng)域中在實(shí)際開發(fā)環(huán)境下有可能遇到的各種問題,進(jìn)行了健壯性、性
    能等各個(gè)方面的優(yōu)化
    所以,我們可以總結(jié)下面兩個(gè)概念:
  • 編程式:自己寫代碼實(shí)現(xiàn)功能
  • 聲明式:通過配置讓框架實(shí)現(xiàn)功能

3、基于注解的聲明式事務(wù)

①加入依賴
準(zhǔn)備工作已加(同簡(jiǎn)介中的準(zhǔn)備工作)
②創(chuàng)建jdbc.properties
準(zhǔn)備工作 已加(同簡(jiǎn)介中的準(zhǔn)備工作)
③配置Spring的配置文件
準(zhǔn)備工作 已加(同簡(jiǎn)介中的準(zhǔn)備工作)
④創(chuàng)建表

CREATE TABLE `t_book` (
`book_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`book_name` varchar(20) DEFAULT NULL COMMENT '圖書名稱',
`price` int(11) DEFAULT NULL COMMENT '價(jià)格',
`stock` int(10) unsigned DEFAULT NULL COMMENT '庫(kù)存(無符號(hào))',
PRIMARY KEY (`book_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert into `t_book`(`book_id`,`book_name`,`price`,`stock`) values (1,'斗破蒼
穹',80,100),(2,'斗羅大陸',50,100);
CREATE TABLE `t_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`username` varchar(20) DEFAULT NULL COMMENT '用戶名',
`balance` int(10) unsigned DEFAULT NULL COMMENT '余額(無符號(hào))',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
insert into `t_user`(`user_id`,`username`,`balance`) values (1,'admin',50);

⑤創(chuàng)建組件
創(chuàng)建BookController:

@Controller
public class BookController {
@Autowired
private BookService bookService;
public void buyBook(Integer bookId, Integer userId){
bookService.buyBook(bookId, userId);
}
}

創(chuàng)建接口BookService:

public interface BookService {/*** 買書* @param userId* @param bookId*/void buyBook(Integer userId, Integer bookId);
}

創(chuàng)建實(shí)現(xiàn)類BookServiceImpl:

@Service
public class BookServiceImpl implements BookService {@Autowiredprivate BookDao bookDao;@Override/*** Transactional參數(shù)含義:* readOnly:只讀* timeout:超時(shí)時(shí)間,超過設(shè)定的時(shí)間強(qiáng)制回滾*/@Transactional(//readOnly = true//timeout = 3//noRollbackFor = ArithmeticException.class//noRollbackForClassName = "java.lang.ArithmeticException"//isolation = Isolation.DEFAULTpropagation = Propagation.REQUIRES_NEW)public void buyBook(Integer userId, Integer bookId) {//SECONDS:秒 MINUTES:分鐘 DAYS:天 HOURS:小時(shí)try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}//查詢圖書的價(jià)格Integer price = bookDao.getPriceByBookId(bookId);//更新圖書的庫(kù)存bookDao.updateStock(bookId);//更新用戶的余額bookDao.updateBalance(userId, price);//System.out.println(1/0);}
}

創(chuàng)建接口BookDao:

public interface BookDao {/*** 根據(jù)圖書的id查詢圖書的價(jià)格* @param bookId* @return*/Integer getPriceByBookId(Integer bookId);/*** 更新圖書的庫(kù)存* @param bookId*/void updateStock(Integer bookId);/*** 更新用戶的余額* @param userId* @param price*/void updateBalance(Integer userId, Integer price);
}

創(chuàng)建實(shí)現(xiàn)類BookDaoImpl:

@Repository
public class BookDaoImpl implements BookDao {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic Integer getPriceByBookId(Integer bookId) {String sql = "select price from t_book where book_id = ?";return jdbcTemplate.queryForObject(sql, Integer.class, bookId);}@Overridepublic void updateStock(Integer bookId) {String sql = "update t_book set stock = stock - 1 where book_id = ?";jdbcTemplate.update(sql, bookId);}@Overridepublic void updateBalance(Integer userId, Integer price) {String sql = "update t_user set balance = balance - ? where user_id = ?";jdbcTemplate.update(sql, price, userId);}
}

1.測(cè)試無事務(wù)情況

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:tx-annotation.xml")
public class TxByAnnotationTest {@Autowiredprivate BookController bookController;@Testpublic void testBuyBook(){bookController.buyBook(1, 1);//bookController.checkout(1, new Integer[]{1,2});}}

2.加入事務(wù)

在Spring的配置文件中添加配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--    掃描組件--><context:component-scan base-package="org.example.spring"></context:component-scan>
<!--        導(dǎo)入外部組件--><context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--    配置數(shù)據(jù)庫(kù)--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean>
<!--    配置測(cè)試數(shù)據(jù)庫(kù)的bean--><bean class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean>
<!--    配置事務(wù)管理器--><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean>
<!--    開啟事務(wù)注解--><tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>

注意:導(dǎo)入的名稱空間需要 tx 結(jié)尾的那個(gè)。
在這里插入圖片描述
②添加事務(wù)注解
因?yàn)閟ervice層表示業(yè)務(wù)邏輯層,一個(gè)方法表示一個(gè)完成的功能,因此處理事務(wù)一般在service層處理
在BookServiceImpl的buybook()添加注解@Transactional
③觀察結(jié)果
由于使用了Spring的聲明式事務(wù),更新庫(kù)存和更新余額都沒有執(zhí)行

①@Transactional注解標(biāo)識(shí)的位置

@Transactional標(biāo)識(shí)在方法上,只會(huì)影響該方法
@Transactional標(biāo)識(shí)的類上,會(huì)影響類中所有的方法

②事務(wù)屬性:只讀

①介紹
對(duì)一個(gè)查詢操作來說,如果我們把它設(shè)置成只讀,就能夠明確告訴數(shù)據(jù)庫(kù),這個(gè)操作不涉及寫操作。這
樣數(shù)據(jù)庫(kù)就能夠針對(duì)查詢操作來進(jìn)行優(yōu)化。
②使用方式

@Transactional(readOnly = true)
public void buyBook(Integer bookId, Integer userId) {
//查詢圖書的價(jià)格
Integer price = bookDao.getPriceByBookId(bookId);
//更新圖書的庫(kù)存
bookDao.updateStock(bookId);
//更新用戶的余額
bookDao.updateBalance(userId, price);
//System.out.println(1/0);
}

③注意
對(duì)增刪改操作設(shè)置只讀會(huì)拋出下面異常:
Caused by: java.sql.SQLException: Connection is read-only. Queries leading to data modification
are not allowed

③事務(wù)屬性:超時(shí)

①介紹
事務(wù)在執(zhí)行過程中,有可能因?yàn)橛龅侥承﹩栴},導(dǎo)致程序卡住,從而長(zhǎng)時(shí)間占用數(shù)據(jù)庫(kù)資源。而長(zhǎng)時(shí)間占用資源,大概率是因?yàn)槌绦蜻\(yùn)行出現(xiàn)了問題(可能是Java程序或MySQL數(shù)據(jù)庫(kù)或網(wǎng)絡(luò)連接等等)。
此時(shí)這個(gè)很可能出問題的程序應(yīng)該被回滾,撤銷它已做的操作,事務(wù)結(jié)束,把資源讓出來,讓其他正常程序可以執(zhí)行。
概括來說就是一句話:超時(shí)回滾,釋放資源。
②使用方式

@Transactional(timeout = 3)
public void buyBook(Integer bookId, Integer userId) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
//查詢圖書的價(jià)格
Integer price = bookDao.getPriceByBookId(bookId);
//更新圖書的庫(kù)存
bookDao.updateStock(bookId);
//更新用戶的余額
bookDao.updateBalance(userId, price);
//System.out.println(1/0);
}

③觀察結(jié)果
執(zhí)行過程中拋出異常:
org.springframework.transaction.TransactionTimedOutException: Transaction timed out:

④事務(wù)屬性:回滾策略

①介紹
聲明式事務(wù)默認(rèn)只針對(duì)運(yùn)行時(shí)異?;貪L,編譯時(shí)異常不回滾。
可以通過@Transactional中相關(guān)屬性設(shè)置回滾策略

  • rollbackFor屬性:需要設(shè)置一個(gè)Class類型的對(duì)象(回滾)
    舉例:
 @Transactional(rollbackFor = CustomException.class) 

通過將rollbackFor屬性設(shè)置為CustomException.class,告訴Spring只有當(dāng)CustomException異常發(fā)生時(shí)才回滾事務(wù)。

  • rollbackForClassName屬性:需要設(shè)置一個(gè)字符串類型的全類名(回滾)
    舉例:
@Service
@Transactional
public class UserService {@Transactional(rollbackForClassName = "java.lang.RuntimeException")public void saveUser(User user) {// 保存用戶信息的代碼throw new RuntimeException("保存用戶信息失敗");}
}

rollbackForClassName屬性接受一個(gè)字符串類型的異常類名。當(dāng)在事務(wù)執(zhí)行期間拋出與指定異常類名匹配的異常時(shí),事務(wù)將會(huì)回滾。如果拋出的異常不匹配,則事務(wù)不會(huì)回滾。
在上面的例子中,如果saveUser()方法拋出RuntimeException異常,事務(wù)將會(huì)回滾。
需要注意的是,rollbackForClassName屬性接受異常類名的字符串表示,類名需要包含完整的包路徑。另外,也可以通過rollbackFor屬性來指定異常類的Class對(duì)象,實(shí)現(xiàn)相同的效果。

  • noRollbackFor屬性:需要設(shè)置一個(gè)Class類型的對(duì)象(針對(duì)某個(gè)類不回滾)
  • noRollbackForClassName屬性:需要設(shè)置一個(gè)字符串類型的全類名
⑤事務(wù)屬性:事務(wù)隔離級(jí)別

①介紹
數(shù)據(jù)庫(kù)系統(tǒng)必須具有隔離并發(fā)運(yùn)行各個(gè)事務(wù)的能力,使它們不會(huì)相互影響,避免各種并發(fā)問題。一個(gè)事務(wù)與其他事務(wù)隔離的程度稱為隔離級(jí)別。SQL標(biāo)準(zhǔn)中規(guī)定了多種事務(wù)隔離級(jí)別,不同隔離級(jí)別對(duì)應(yīng)不同的干擾程度,隔離級(jí)別越高,數(shù)據(jù)一致性就越好,但并發(fā)性越弱。
隔離級(jí)別一共有四種:

  • 讀未提交:READ UNCOMMITTED
    允許Transaction01讀取Transaction02未提交的修改。
  • 讀已提交:READ COMMITTED、
    要求Transaction01只能讀取Transaction02已提交的修改。
  • 可重復(fù)讀:REPEATABLE READ
    確保Transaction01可以多次從一個(gè)字段中讀取到相同的值,即Transaction01執(zhí)行期間禁止其它事務(wù)對(duì)這個(gè)字段進(jìn)行更新。
  • 串行化:SERIALIZABLE
    確保Transaction01可以多次從一個(gè)表中讀取到相同的行,在Transaction01執(zhí)行期間,禁止其它事務(wù)對(duì)這個(gè)表進(jìn)行添加、更新、刪除操作。可以避免任何并發(fā)問題,但性能十分低下。
    各個(gè)隔離級(jí)別解決并發(fā)問題的能力見下表:
隔離級(jí)別臟讀不可重復(fù)讀幻讀
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
②使用方式
@Transactional(isolation = Isolation.DEFAULT)//使用數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別
@Transactional(isolation = Isolation.READ_UNCOMMITTED)//讀未提交
@Transactional(isolation = Isolation.READ_COMMITTED)//讀已提交
@Transactional(isolation = Isolation.REPEATABLE_READ)//可重復(fù)讀
@Transactional(isolation = Isolation.SERIALIZABLE)//串行化
⑥事務(wù)屬性:事務(wù)傳播行為

①介紹
當(dāng)事務(wù)方法被另一個(gè)事務(wù)方法調(diào)用時(shí),必須指定事務(wù)應(yīng)該如何傳播。例如:方法可能繼續(xù)在現(xiàn)有事務(wù)中
運(yùn)行,也可能開啟一個(gè)新事務(wù),并在自己的事務(wù)中運(yùn)行。
②測(cè)試
創(chuàng)建接口CheckoutService:

public interface CheckoutService {
void checkout(Integer[] bookIds, Integer userId);
}

創(chuàng)建實(shí)現(xiàn)類CheckoutServiceImpl:

@Service
public class CheckoutServiceImpl implements CheckoutService {@Autowiredprivate BookService bookService;@Override@Transactional//一次購(gòu)買多本圖書public void checkout(Integer[] bookIds, Integer userId) {for (Integer bookId : bookIds) {bookService.buyBook(bookId, userId);}}
}

在BookController中添加方法:

@Autowired
private CheckoutService checkoutService;
public void checkout(Integer[] bookIds, Integer userId){
checkoutService.checkout(bookIds, userId);
}

在數(shù)據(jù)庫(kù)中將用戶的余額修改為100元
③觀察結(jié)果
可以通過@Transactional中的propagation屬性設(shè)置事務(wù)傳播行為
修改BookServiceImpl中buyBook()上,注解@Transactional的propagation屬性

@Transactional(propagation = Propagation.REQUIRED),默認(rèn)情況,表示如果當(dāng)前線程上有已經(jīng)開
啟的事務(wù)可用,那么就在這個(gè)事務(wù)中運(yùn)行。經(jīng)過觀察,購(gòu)買圖書的方法buyBook()在checkout()中被調(diào)
用,checkout()上有事務(wù)注解,因此在此事務(wù)中執(zhí)行。所購(gòu)買的兩本圖書的價(jià)格為80和50,而用戶的余額為100,因此在購(gòu)買第二本圖書時(shí)余額不足失敗,導(dǎo)致整個(gè)checkout()回滾,即只要有一本書買不
了,就都買不了。

@Transactional(propagation = Propagation.REQUIRES_NEW),表示不管當(dāng)前線程上是否有已經(jīng)開啟的事務(wù),都要開啟新事務(wù)。同樣的場(chǎng)景,每次購(gòu)買圖書都是在buyBook()的事務(wù)中執(zhí)行,因此第一本圖書購(gòu)買成功,事務(wù)結(jié)束,第二本圖書購(gòu)買失敗,只在第二次的buyBook()中回滾,購(gòu)買第一本圖書不受影響,即能買幾本就買幾本。

http://aloenet.com.cn/news/41609.html

相關(guān)文章:

  • 大石橋網(wǎng)站地推app接任務(wù)平臺(tái)
  • 湛江網(wǎng)站建設(shè)外包武漢百度seo排名
  • 成都網(wǎng)站維護(hù)公司百度營(yíng)銷推廣官網(wǎng)
  • 能24小時(shí)掛機(jī)的云電腦網(wǎng)站優(yōu)化關(guān)鍵詞價(jià)格
  • 數(shù)字化文化館網(wǎng)站建設(shè)系統(tǒng)優(yōu)化助手
  • 環(huán)境保護(hù)局網(wǎng)站管理制度建設(shè)磁力搜索引擎下載
  • 網(wǎng)站seo應(yīng)用微信營(yíng)銷軟件排行榜
  • 免費(fèi)python在線正常網(wǎng)站識(shí)圖
  • 建設(shè)網(wǎng)站網(wǎng)站名推廣軟文300字
  • 南昌加盟網(wǎng)站建設(shè)免費(fèi)發(fā)布信息的平臺(tái)
  • 在線做春節(jié)網(wǎng)站百度廣告銷售
  • 在線制作logo圖標(biāo)軟件seo服務(wù)外包報(bào)價(jià)
  • 重慶建工建設(shè)工程信息網(wǎng)關(guān)鍵詞排名優(yōu)化易下拉排名
  • 網(wǎng)站管理的內(nèi)容接單平臺(tái)
  • 常州網(wǎng)站價(jià)格免費(fèi)留電話的廣告
  • 零食b2c網(wǎng)站濟(jì)南網(wǎng)絡(luò)優(yōu)化哪家專業(yè)
  • 請(qǐng)人做彩票網(wǎng)站多少錢b2b電商平臺(tái)有哪些
  • 企業(yè)網(wǎng)站html源碼網(wǎng)站排名優(yōu)化工具
  • 都蘭縣建設(shè)局交通局網(wǎng)站seo工具優(yōu)化軟件
  • 服裝網(wǎng)站欄目在線的crm系統(tǒng)軟件
  • 網(wǎng)站建設(shè)推廣技術(shù)網(wǎng)絡(luò)營(yíng)銷策劃書的主要內(nèi)容
  • 好單庫(kù)如何做網(wǎng)站長(zhǎng)沙網(wǎng)站制作公司哪家好
  • 網(wǎng)站做動(dòng)態(tài)圖片不顯示邯鄲seo優(yōu)化公司
  • 做月亮的網(wǎng)站背景圖片怎樣建立網(wǎng)站平臺(tái)
  • 企業(yè)網(wǎng)站托管運(yùn)營(yíng)it菜雞網(wǎng)seo
  • 濰坊做網(wǎng)站免費(fèi)拓客軟件排行榜
  • 附近有學(xué)電腦培訓(xùn)班嗎天津seo網(wǎng)站管理
  • 做算命類網(wǎng)站違法嗎站長(zhǎng)seo軟件
  • 網(wǎng)站建設(shè)套餐報(bào)價(jià)百度競(jìng)價(jià)排名魏則西事件分析
  • 網(wǎng)站seo優(yōu)化包括哪些方面排名第一的手機(jī)清理軟件