1. 程式人生 > 資料庫 >mybatisPlus下mysql轉sqlServer 資料遷移和語法對比

mybatisPlus下mysql轉sqlServer 資料遷移和語法對比

分頁思想

  • 獲取當前頁碼的資料
頁碼		SQL語句
1			select * from products limit 0,10
2			select * from products limit 10,10
3			select * from products limit 20,30
  • 公式

    • $pageno 頁碼
    • $startno 起始位置
    • $pagesize=10 頁面大小
    • $startno= ($pageno- 1)* $pagesize;
  • 獲取頁碼

    • 使用者點選頁面底端頁碼,傳遞當前的頁面
  • 獲取總頁碼

記錄數			頁數			計算
60				6			60/10=6
51				6			ceil(51/10)=6
  • 公式

    • $rowcount 總記錄數
    • $pagecount 總頁數
    • $pagecount= ceil($rowcount/ $pagesize);
  • 獲取總記錄數

    • select count(*) from products;

實現方法

  • 步驟
    • 獲取總記錄數
    • 求出總頁數
    • 迴圈顯示頁碼
    • 通過當前頁面,求出起始位置
    • 獲取當前頁面資料,並遍歷顯示

程式碼實現

連線資料庫

# MySQLDB.class.php
<?php
class MySQLDB {
	private $host;				// 主機地址
	private $port;				// 埠號
	private $user;				// 使用者名稱
	private $pwd;				// 密碼
	private $dbname;			// 資料庫名
	private $charset;			// 字符集
	private $link;				// 連線物件
	private static $instance;
	private function __construct($param){
		$this->initParam($param);
		$this->initConnect();
	}
	private function __clone(){

	}
	// 獲取單例
	public static function getInstance($param= array()){
		if(!self::$instance instanceof self){
			self::$instance= new self($param);
		}
		return self::$instance;
	}
	// 初始化引數
	private function initParam($param){
		$this->host= $param['host']??'127.0.0.1';
		$this->port= $param['port']??'3306';
		$this->user= $param['user']??'';
		$this->pwd= $param['pwd']??'';
		$this->dbname= $param['dbname']??'';
		$this->charset= $param['charset']??'utf8';
	}
	// 連線資料庫
	private function initConnect(){
		$this->link= @mysqli_connect($this->host, $this->user, $this->pwd, $this->dbname, $this->port);
		if(mysqli_connect_error()){
			echo '資料庫連線失敗<br>';
			echo '錯誤資訊:'.mysqli_connect_error(),'<br>';
			echo '錯誤碼:'.mysqli_connect_errno(),'<br>';
			exit;
		}else{
			echo '資料庫連線成功!';
		}
		mysqli_set_charset($this->link, $this->charset);	
	}
	// 資料庫的增刪改查
	private function execute($sql){
		if(!$rs= mysqli_query($this->link, $sql)){
			echo 'SQL語句執行失敗<br>';
			echo '錯誤資訊:'.mysqli_error($this->link),'<br>';
			echo '錯誤碼:'.mysqli_errno($this->link),'<br>';
			echo '錯誤的SQL語句:'.$sql,'<br>';
			exit;
		}
		return $rs;
	}
	// 執行增刪改語句
	public function exec($sql) {
		$key=substr($sql,0,6);
		if(in_array($key,array('insert','update','delete')))
			return $this->execute($sql);
		else{
			echo '非法訪問<br>';
			exit;
		}
	}
	//獲取自動增長的編號
	public function getLastInsertId() {
		return mysqli_insert_id($this->link);
	}
	//執行查詢語句
	private function query($sql) {
		if(substr($sql,0,6)=='select' || substr($sql,0,4)=='show' || substr($sql,0,4)=='desc'){
			return $this->execute($sql);
		}else{
			echo '非法訪問<br>';
			exit;
		}
	}
	//匹配所有資料
	public function fetchAll($sql,$type='assoc') {
		$rs=$this->query($sql);
		$type=$this->getType($type);
		return mysqli_fetch_all($rs,$type);
	}
	//匹配一維陣列
	public function fetchRow($sql,$type='assoc') {
		$list=$this->fetchAll($sql,$type);
		if(!empty($list))
			return $list[0];
		return array();
	}
	//匹配一行一列
	public function fetchColumn($sql) {
		$list=$this->fetchRow($sql,'num');
		if(!empty($list))
			return $list[0];
		return null;
	}
	//獲取匹配型別
	private function getType($type) {
		switch($type){
			case 'num':
				return  MYSQLI_NUM;
			case 'both':
				return  MYSQLI_BOTH;
			default:
				return  MYSQLI_ASSOC;
		}
	}
}

顯示頁

# index.php
<?php
//自動載入類
spl_autoload_register(function($class_name){
	require "./{$class_name}.class.php";
});
//獲取單例
$param=array(
	'user'		=>	'root',
	'pwd'		=>	'',
	'dbname'	=>	'data'
);
$db= MySQLDB::getInstance($param);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>資料庫連線</title>
<style type="text/css">
	table{
		width:780px;
		border:solid #000 1px;
	}
	td,th{
		border:solid #000 1px;
	}
</style>
</head>

<body>
<?php
$pagesize= 5;		
//第一步:獲取總記錄數
$rowcount= $db->fetchColumn('select count(*) from products');
//第二步:求出總頁數
$pagecount= ceil($rowcount/$pagesize);
//第四步:通過當前頁面,求出起始位置
//$pageno=isset($_GET['pageno'])?$_GET['pageno']:1;
$pageno= $_GET['pageno']??1;
$pageno= $pageno<1?1:$pageno;
$pageno= $pageno>$pagecount?$pagecount:$pageno;
$startno= ($pageno-1)*$pagesize;
//第五步:獲取當前頁面資料,並遍歷顯示
$sql= "select * from products limit $startno,$pagesize";
$rs= $db->fetchAll($sql);
?>
<table>
	<tr>
		<th>編號</th>
		<th>商品名稱</th>
		<th>規格</th>
		<th>價格</th>
	</tr>
	<?php foreach($rs as $row):?>
	<tr>
		<td><?=$row['proID']?></td>
		<td><?=$row['proname']?></td>
		<td><?=$row['proguige']?></td>
		<td><?=$row['proprice']?></td>
	</tr>
	<?php endforeach;?>
</table>
<!--第三步:迴圈顯示頁碼-->
<span>一共有<?=$rowcount?>條記錄,每頁放<?=$pagesize?>條記錄,當前是<?=$pageno?>頁 <br></span>
【<a href="?pageno=1">首頁</a>】
【<a href="?pageno=<?=$pageno-1?>">上一頁</a>】
<?php for($i=1; $i<=$pagecount; $i++):?>
	<a href="?pageno=<?=$i?>"><?=$i?></a>
<?php endfor;?>
【<a href="?pageno=<?=$pageno+1?>">下一頁</a>】
【<a href="?pageno=<?=$pagecount?>">末頁</a>】
</body>
</html>

分頁優化

  • 概述

    • 在上面的分頁程式碼中,雖然SQL語句比較經典
    • 但是每次都要獲取不需要的資料,浪費資源
  • 優化

    • $sql="select * from products limit $startno,$pagesize";
    • $sql="select * from products where proid>=(select proid from products limit $startno,1) limit $pagesize";