【澳门葡京备用网址】配备文件,php源码建博客4

主要:

主要:

一、什么是Hibernate
Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关周到据库ORM框架
*(struts2 是轻量级JavaEE应用的表现层解决方案 )

ThinkPHP框架学习整理2:

  1. 重整框架
  2. 建库建表
  3. 安顿文件类
  4. 不当日志记录

    ————–本篇后文件结构:————————————–
    blog
    ├─App
    │ ├─Model 模型目录
    │ ├─View 视图目录
    │ │ ├─Admin后台目录
    │ │ └─Home前台目录
    │ ├─Common 配置目录
    │ │ └─config.php 配置文件
    │ ├─Log 日志目录
    │ │ └─log.txt 日志文件
    │ ├─Controller 控制器
    │ │ ├─Admin后台
    │ │ │ └─DemoController.class.php 测试控制器
    │ │ └─Home前台
    ├─Public 静态公共文件(js,css,images)
    │ ├─Plugins 插件
    │ ├─Back后台
    │ └─Home前台
    ├─Frame 公共使用的类
    │ ├─BaseModel.class.php 数据库连接类
    │ ├─BaseController.class.php 控制器公共操作(设置编码,音信跳转)
    │ ├─FactoryModel.class.php 模型工厂类
    │ ├─Log.class.php 日志厂类
    │ ├─Config.class.php 配置文件读取类
    │ ├─Init.class.php 开首化应用类
    │ └─MySQLDB.class.php 数据库操作工具类

    └─index.php 入口文件

  1. 常量优化路径
  2. 电动加载类
  3. 优化进口文件
  4. 有惊无险访问项目目录

何以关系型数据库 ? MySQL 、Oracle 、SQLServer 、 DB2
数据运用表格局存储的,表与表之间外键关联
怎么是 ORM ? Object Relational Mapping, 对象关联映射
ORM
就是通过将Java对象映射到数量库表,通过操作Java对象,就足以成功对数据表的操作

Thinkphp是十足入口方式,也就是说所有流程都是从index.php发轫的。项目目录下的index.php大家誉为入口文件。你所编纂的Action,使用

 


Hibernat 完全ORM的,只须要对 对象举办操作,生成底层SQL语句 !!!!!

一)构建项目:


--------------文件结构:--------------------------------------
blog
├─App
│  ├─Model 模型
│  │  └─UserModel.class.php 用户模型类    
│  ├─View 视图
│  │  ├─Back后台
│  │  │  └─Index
│  │  │          └─index.html  后台首页面
│  │  └─Home前台
│  │      └─User 用户视图目录
│  │             └─login.html  登录表单页面
│  ├─Controller 控制器
│  │  ├─Back后台
│  │  │  └─IndexController.class.php 后台首页控制器
│  │  └─Home前台
│  │      └─UserController.class.php 用户控制器
├─Public   静态公共文件(js,css,images)
│  ├─Plugins 插件
│  │  └─layui 前端框架插件
│  ├─Back后台
│  │    ├─js/   js文件
│  │    ├─css/  css样式文件
│  │    └─image img图片 
│  └─Home前台
│      ├─js/   js文件
│      ├─css/  css样式文件
│      └─image img图片 
├─Frame 公共使用的类
│   ├─BaseModel.class.php 数据库连接类
│   ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│   ├─FactoryModel.class.php  模型工厂类
│   ├─Init.class.php  初始化应用类
│   └─MySQLDB.class.php 数据库操作工具类
└─index.php  入口文件
-----------------------------------------------------------------

*** echo2 框架(生成HTML) 、 DWR (开发AJAX,生成JS代码)、
Hibernate (操作数据库生成SQL )

  ThinkPHP
具有项目目录自动成立效用,因而创设项目应用程序万分不难,您只须求定义好项目标输入文件,在首先次访问入口文件的时候,系统就会活动依照你在入口文件中所定义的目录路径,飞快为你创立好项目标有关目录结构。

行使上篇中搭建好的mvc框架结构,正式开端支付博客项目。首先建立数据表,然后开首搭建后台,数据前台浮现,完结博客首要模块浮现。


风行数据库框架
1、 JPA Java Persistence API 通过申明描述对象与数量表映射关系
(唯有接口规范)
2、 Hibernate 最流行ORM框架,通过对象-关系映射配置,可以完全剥离底层SQL
, Hibernate完结JPA规范
3、 MyBatis 本是apache的一个开源项目 iBatis,协理一般
SQL查询,存储进度和高档映射的上佳持久层框架 (公司主流)
* MyBaits 并不是截然ORM , 须要在xml中配备SQL语句
4、 Apache DBUtils 、Spring JDBCTemplate

那边以 Myapp
为项目名称举办出现说法,先创设好目录结构后,再逐一为您介绍各目录功功能途。

下载查看该品种源码

上一篇中,提议4个难题待解决,本篇集中化解那4个难点,最后形成完全的微型MVC框架结构,
后续博客项目,或其他门类,均可以直接行使该框架结构举办付出学习。

SQL语句封装程度 Hibernate > MyBatis > Apache DBUtils 、Spring
JDBCTemplate

具体操作步骤:

整治框架

下载查看该项目源码:

二、 为何要运用Hibernate
Hibernate对JDBC访问数据库的代码做了打包,大大简化了数额访问层繁琐的重复性代码
Hibernate是一个基于jdbc的主流持久化框架,是一个可观的orm完成,它很大程度的简化了dao层编码工作
Hibernate使用java的反光机制,而不是字节码增强程序类已毕透明性
Hibernate的属性尤其好,因为它是一个轻量级框架。映射的油滑很可观。它援救广大关系型数据库,从一对一到多对多的各类复杂关系

1>. 在 www 根目录下新建一个文件夹,起名为 Myapp。

  清理测试页面

    1)前边创设框架结构,使用了用户登录测试页面以及后台首页页面。在此全体去掉,从新起来打造前台和后台页面。类似于我们下载了一个ThinkPHP或Laravel或其他的框架。
现在开头在那几个微型框架上来构建大家的品类

    2) 实际支付,会用前端人士办好的静态页面来进展付出。所以也得以在
【模板之家】或其余网站 下载
后台模板和前台博客静态页面。然后小心于后端开发,可以加火速度。本项目供就学研讨选用,也就不那么匆忙了。

澳门葡京备用网址 1澳门葡京备用网址 2

     原本是准备全部利用别人写好的前端页面(包括前端显示和后台页面),专注于后端逻辑的开发。而且已经把分类页面列表都做好了。还提交传送了。

     此刻,仔细想想,要是这样玩,那我直接用框架更好了。既然做后端开发,自己写个后端页面+程序处理,没什么问题吧..., 置于前端显示页面,那再用前辈写的前端页面倒是可以的

    于是乎,卷起柚子,说干就干,先来整理框架,开始搭建博客。。。。。

说一说

常量优化路径

预备: 创造分支

1 $ git checkout master
2 $ git checkout -b "MVC"
  • Hibernate本身质量并不是很好,存在重重优化手段
    (一级缓存、二级缓存、查询缓存、抓取策略)

2>. 下载 ThinkPHP 大旨文件,将其复制到 Myapp 目录下。

  框架结构:

--------------清理后MVC框架文件结构:--------------------------------------
blog
├─App
│  ├─Model 模型目录
│  ├─View 视图目录
│  │  ├─Back后台
│  │  └─Home前台
│  ├─Controller 控制器目录
│  │  ├─Back后台
│  │  └─Home前台
├─Public   静态公共文件(js,css,images)
│  ├─Plugins 插件
│  ├─Back后台
│  └─Home前台 
├─Frame 公共使用的类
│   ├─BaseModel.class.php 数据库连接类
│   ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│   ├─FactoryModel.class.php  模型工厂类
│   ├─Init.class.php  初始化应用类
│   └─MySQLDB.class.php 数据库操作工具类
└─index.php  入口文件
-----------------------------------------------------------------

  后续的开支只要求复制该目录结构文件, 就足以在此基础上进展开发了。

交付传送代码

git add -A
git commit -m "清理MVC结构"
git push origin master

  思路

  1)把常用的目录路径定义成常量。如 模型目录,控制器目录等
     2)引入类应用定义的常量替代部分路线。 如 include
FRAME.BaseModel.class.php
       3) 载入视图使用常量替代部分路线 如 include VIEW.’login.html’
简单款式

三、 使用Hibernate框架 火速入门
1、 去
http://sourceforge.net/projects/hibernate/files/hibernate3/
下载 hibernate3 开发包
hibernate 是 JBOSS 框架, JBOSS 是 EJB服务器, JBOSS 推出JBPM 工作流
同盟社主流 Hibernate 版本 : hibernate3.x
课程以 hibernate3.6.10 讲解

3>. 在 Myapp 目录下,新建一个输入文件,起名为 index.php,代码如下:

  插件准备

    1) layui插件:
搭建后台程序,准备使用layui前端框架,这几个框架个人觉得做后台界面依然不错的。它还包涵部分比较使用模块。 

        用bootstrap也可以,我进一步倾向于用它来做前台页面。

      下载网址: 

    2) jQuery库:  更便于操作DOM, 更加是隔三差五使用ajax请求。

    3) 其余插件: 如Ueditor编辑器等
要求动用时再下载吧。一般插件都会有demo示例,
根据示例和手册,懂web开发为主能拔取。

    上述插件暂时不熟知没有涉及,官网上有手册,须要什么模块,便查手册便利用,就像是搭积木,即使要做得更好,当然要花越来越多的大运多磨炼。我本着后台给程序管理员使用,也不必然要至极出色,实用就好。

  代码完成

 1)操作步骤

澳门葡京备用网址 3澳门葡京备用网址 4

step 1: 在入口文件中定义所需要的常量

step 2: 控制器中引入视图时, 使用常量进行优化 

操作步骤思路

  2) 入口文件中定义常用路径常量 【index.php】

 1 <?php
 2 /**
 3  * 入口文件
 4  */
 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作
 8 
 9 define('PLAT', $p);  //平台常量
10 define('CTR', $c);  //控制器
11 define('ACTION', $a); //动作
12 
13 
14 define('DS', DIRECTORY_SEPARATOR); //目录分割符
15 define('ROOT', getcwd().DS);  //当前所在目录 项目目录
16 define('FRAME', ROOT.'Frame'.DS);
17 define('APP', ROOT.'App'.DS);
18 define('PUB', ROOT.'Public'.DS);
19 define('ADMIN', PUB.'Admin'.DS);
20 define('HOME', PUB.'Home'.DS);
21 
22 //MVC目录
23 define('MODEL', APP.'Model'.DS);
24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);
25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);
26 
27 $ctr = $c."Controller";
28 
29 require_once FRAME.'Db.class.php';  //数据库操作类
30 require_once FRAME.'BaseModel.class.php';  //基础模型类
31 require_once MODEL.'UserModel.class.php';  //用户模型类
32 require_once FRAME.'FactoryModel.class.php';//模型工厂类
33 require_once FRAME.'BaseController.class.php'; //基础控制器类
34 require_once CTRONLLER.$ctr.'.class.php';
35 
36 
37 //实例化控制器
38 $userCtr = new $ctr();
39 
40 $userCtr -> $a();

2) 常量的使用:

  后台首页控制器【App/Controller/Admin/IndexController.class.php】

澳门葡京备用网址 5澳门葡京备用网址 6

 1 <?php
 2 /**
 3  * IndexController控制器类
 4  * 后台相关操作
 5  * User: young
 6  */
 7 
 8 class IndexController extends BaseController
 9 {
10     //展示后台首页
11     public function index()
12     {
13         include VIEW.'index.html';
14     }
15 }

后台首页控制器引入视图路径修改

  用户控制器
登录视图引入路径【App/Controller/Home/UserController.class.php】

澳门葡京备用网址 7澳门葡京备用网址 8

 1 <?php
 2 /**
 3  * UserController.class.php 用户控制器
 4  */
 5 
 6 class UserController  extends  BaseController{
 7     /**
 8      * 展示登录界面
 9      * @access public
10      */
11     public function login()
12     {
13         include VIEW."login.html";
14     }
15 。。。
16 。。。
17 。。。

用户控制器登录视图引入路径

3)提交代码

$  git add -A
$  git commit -m "常量使用"

新颖hibernate版本 4.3测试版, hibernate4 和 hibernate3 开发有许多不一

<?php

建库建表

  准备: 创设分支

$ git checkout master
$ git checkout -b "start-admin-module"

活动加载类

***** hibernate 还有为数不少扩展技术 search 、 validator ….

// 定义项目名称

  建表思路:

    依照博客模板,从首页初叶分析, 
分析哪些需求动态数据,以便建立相应数据表。

      用户: 登录, 注册, 修改, 删除

      小说: 分类管理, 博文管理, 评论管理

      角色管理: 管理员,普通用户

      菜单管理: 差距权限人士,对应菜单栏也有分别

    建表工具得以无限制选拔。初期手工写建表语句,熟悉后直接使用工具。
本项目中选取 Navicat 建立数据库和表

   思路

  难题: 入口文件中早已require_once
引入6个类,既增添一个要求引入一个,不难遗漏,重复和失误。

  解决形式:自动加载类文件

     方式1: 使用电动加载类函数__autoload()能够完毕自动加载
          情势2: 实际项目中,五个人付出,按照实用性,愈多的是拔取sql_autoload_register()注册函数自动加载

  依据目录的特征达成机关加载
          Model类文件特点,以Model结尾的类名  substr($className,-5)
          Controller文件特点: 以Controller结尾的类名,
substr($class,-10)

    公共类:
类名没有统一式样,可以将Fame下的公共类放入到数组中,然后判断类是不是在数组中,
从而自动加载该目录下的类公事

下载 hibernate-distribution-3.6.10.Final-dist.zip

define (‘APP_NAME’,’Myapp’);

   数据库,表

    1) 创设数据库:php_blog

create database php_blog charset utf8

    2) 用户表: y_users 

澳门葡京备用网址 9澳门葡京备用网址 10

CREATE TABLE `y_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户主键',
  `username` varchar(20) NOT NULL COMMENT '用户名',
  `password` char(32) NOT NULL COMMENT '密码',
  `email` varchar(50) NOT NULL DEFAULT '' COMMENT '注册邮箱',
  `token_email` varchar(32) NOT NULL DEFAULT '' COMMENT '邮箱验证',
  `status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '状态, 0-正常,1-禁用',
  `gid` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '角色id,1-管理员,2-普通用户,0-无效',
  `login_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后登录的ip地址',
  `login_times` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '登录次数',
  `created_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '注册时间',
  `updated_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后一次登录时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='用户表';

用户表SQL

    3)角色表: y_user_group

澳门葡京备用网址 11澳门葡京备用网址 12

CREATE TABLE `y_user_group` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色id',
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '角色名称',
  `auths` varchar(255) NOT NULL DEFAULT '' COMMENT '角色权限',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

角色表SQL

    4) 菜单表: y_menus

澳门葡京备用网址 13澳门葡京备用网址 14

CREATE TABLE `y_menus` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '菜单id',
  `title` varchar(20) DEFAULT '' COMMENT '菜单名称',
  `controller` varchar(30) DEFAULT '' COMMENT '控制器名称',
  `action` varchar(30) DEFAULT '' COMMENT '操作名称',
  `status` tinyint(1) unsigned DEFAULT '1' COMMENT '状态,1-正常,0-禁用',
  `is_hidden` tinyint(1) unsigned DEFAULT '0' COMMENT '是否隐藏,0-正常显示,1-隐藏',
  `sort` int(10) unsigned DEFAULT '0' COMMENT '排序',
  `pid` int(10) unsigned DEFAULT '0' COMMENT '上一级菜单',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';

菜单表SQL

    5) 文章表 y_article

澳门葡京备用网址 15澳门葡京备用网址 16

CREATE TABLE `y_article` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章id',
  `title` varchar(60) NOT NULL DEFAULT '' COMMENT '标题',
  `description` varchar(200) NOT NULL DEFAULT '' COMMENT '文章简介',
  `content` text NOT NULL COMMENT '内容',
  `cid` int(10) unsigned NOT NULL COMMENT '文章类别',
  `pic` varchar(150) NOT NULL DEFAULT '' COMMENT '文章封面图',
  `pic_watermark` varchar(150) NOT NULL DEFAULT '' COMMENT '水印图',
  `pic_thumb` varchar(150) NOT NULL DEFAULT '' COMMENT '缩略图',
  `uid` int(10) unsigned NOT NULL COMMENT '作者',
  `clicks` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '阅读数(点击数)',
  `updated_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
  `created_at` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
  PRIMARY KEY (`id`),
  KEY `title` (`title`),
  KEY `uid` (`uid`),
  KEY `clicks` (`clicks`),
  KEY `cid` (`cid`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='文章表';

文章表SQL

    6) 作品种类表 y_category

澳门葡京备用网址 17澳门葡京备用网址 18

CREATE TABLE `y_category` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '分类id',
  `catename` varchar(15) NOT NULL COMMENT '分类名',
  `description` varchar(255) NOT NULL DEFAULT '' COMMENT '简介',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='文章类别表';

小说系列表SQL

    7) 评论(回复)表 y_comment

澳门葡京备用网址 19澳门葡京备用网址 20

CREATE TABLE `y_comment` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '评论id',
  `uid` int(10) unsigned NOT NULL COMMENT '评论者',
  `created_at` int(11) DEFAULT NULL COMMENT '评论时间',
  `content` varchar(255) NOT NULL DEFAULT '' COMMENT '评论内容',
  `aid` int(10) unsigned NOT NULL COMMENT '被评论的文章',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='评论(回复)表';

评论(回复)表SQL

    8) session数据表 y_session  (其实可以绝不这么些,目的是为着操作
“将session写入数据库” )

澳门葡京备用网址 21澳门葡京备用网址 22

CREATE TABLE `y_session` (
  `sess_id` varchar(50) NOT NULL DEFAULT '' COMMENT 'session id',
  `data` text NOT NULL COMMENT 'session数据',
  `created_at` int(11) NOT NULL COMMENT 'session创建时间',
  PRIMARY KEY (`sess_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='session数据表';

session数据表SQL

    为了防止弄的太复杂,
暂时确立那一个数据表,字段后续可以举行调整。如若须求加入模块效用,可以对应扩充对应数据表。

  代码达成

   1) 入口文件落实类的自行加载

 1 <?php
 2 /**
 3  * 入口文件
 4  */
 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作
 8 
 9 define('PLAT', $p);  //平台常量
10 define('CTR', $c);  //控制器
11 define('ACTION', $a); //动作
12 
13 
14 define('DS', DIRECTORY_SEPARATOR); //目录分割符
15 define('ROOT', getcwd().DS);  //当前所在目录 项目目录
16 define('FRAME', ROOT.'Frame'.DS);
17 define('APP', ROOT.'App'.DS);
18 define('PUB', ROOT.'Public'.DS);
19 define('ADMIN', PUB.'Admin'.DS);
20 define('HOME', PUB.'Home'.DS);
21 
22 //MVC目录
23 define('MODEL', APP.'Model'.DS);
24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);
25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);
26 
27 $ctr = $c."Controller";
28 
29 spl_autoload_register('autoload'); //注册自动加载函数
30 //自动加载类
31 /**
32  * 实自动加载类文件
33  * @param  string $className 类名
34  */
35 function autoload($className)
36 {
37     $upperClassName = strtoupper($className);
38     $frame = array('BaseController','BaseModel','Db','FactoryModel');
39     if(in_array($className, $frame)) {  //加载公共Frame目录中的类文件
40         require_once FRAME."$className.class.php";
41     } elseif(substr($upperClassName, -5) == 'MODEL'){  //加载模型Model目录中的类文件
42         require_once MODEL."$className.class.php";
43     } elseif(substr($upperClassName, -10) == 'CONTROLLER'){  //加载控制器目录中的类文件
44         require_once CTRONLLER."$className.class.php";
45     }
46 }
47 
48 //实例化控制器
49 $userCtr = new $ctr();
50 $userCtr -> $a();

2) 提交代码

1 $  git add -A
2 $  git commit -m "自动加载类完成"

2、 目录结构
documentation :文档
lib : 开发jar包
project : hibernate源码

//定义项目路线

  连接数据库

    在badeModel中修改数据连接的数组信息【Frame/BaseModel.class.php】  (假诺采用安插文件类,此处就足以简不难单了)

澳门葡京备用网址 23澳门葡京备用网址 24

 1 class BaseModel {
 2     。。。
 3     。。。
 4     。。。
 5     function __construct(array $config=null)
 6     {
 7         $conf = array(
 8             'host'=>'localhost',
 9             'user'=>'root',
10             'pwd'=>'root',
11             'port'=>'3306',
12             'charset'=>'utf8',
13             'dbname'=>'php_blog',
14         );
15         $conf = empty($config)? $conf : array_merge($conf,$config);
16         $this->db = Db::getDb($conf);
17     }
18 }

安装连接数据库音信

优化进口文件

hibernate3.jar : hibernate框架开发焦点jar包

define(‘APP_PATH’,’./ Myapp /’);

计划文件类

  思路

  难题:
此时,入口文件代码零碎增多,随着再三再四代码的加码,入口文件会愈来愈臃肿复杂,不易管理

  解决措施:
封装入口文件中的操作称为一个类,这样只需求在输入文件调用类的措施即可

    创建Init.class.php类文件,放入到Frame中
         将进口文件所有操作封装成类方法
              loadClass() 设置自动加载函数
              autoload()自动加载类
              setConst()  定义常量
              dispatch()  前端分发器

3、 导入jar包
hibernate3.jar 核心jar包
lib/required/*.jar
lib/jpa/hibernate-jpa-2.0-api-1.0.1.Final.jar
(用于jpa评释开发,web开发)
数据库驱动 mysql驱动

// 加载入口文件

  需要分析:

    为了框架便于数据库连接以及福利读取配置文件。如 希望在
App/Common/config.php 做一些配备项,需要能读取这么些安插并利用到项目

  代码已毕

   1) 在Frame目录中创造Init.class.php文件,
将进口文件index中的代码复制进行修改为类

  【Frame/Init.class.php】

 1 <?php
 2 /**
 3  * 应用初始化操作类
 4  * User: young
 5  */
 6 
 7 class Init
 8 {
 9     protected static $frame = array('BaseController','BaseModel','Db','FactoryModel'); //Frame目录公共操作类
10     public static function run()
11     {
12         //平台
13         self::dispatch();
14 
15         //定义常量
16         self::setConst();
17 
18         //自动加载类
19         self::loadClass();
20 
21         $ctr = CTR."Controller";  //拼接控制器名称
22 
23         //实例化控制器
24         $ctrObj = new $ctr();
25         $a = ACTION;
26         $ctrObj -> $a();
27     }
28     /**
29      * 设置自动加载类方法
30      */
31     private static function loadClass()
32     {
33         spl_autoload_register('self::autoload');
34     }
35 
36     /**
37      * 实现自动加载
38      * @param  string $className 类名
39      */
40     private static function autoload($className)
41     {
42         $upperClassName = strtoupper($className);
43         if(in_array($className, static::$frame)) {
44             require_once FRAME."$className.class.php";
45         } elseif(substr($upperClassName, -5) == 'MODEL'){
46             require_once MODEL."$className.class.php";
47         } elseif(substr($upperClassName, -10) == 'CONTROLLER'){
48             require_once CTRONLLER."$className.class.php";
49         }
50     }
51 
52     /**
53      * 定义常量
54      */
55     private static function setConst()
56     {
57         define('DS', DIRECTORY_SEPARATOR); //目录分割符
58         define('ROOT', getcwd().DS);
59         define('FRAME', ROOT.'Frame'.DS);
60         define('APP', ROOT.'App'.DS);
61         define('PUB', ROOT.'Public'.DS);
62         define('ADMIN', PUB.'Admin'.DS);
63         define('HOME', PUB.'Home'.DS);
64 
65 
66         define('MODEL', APP.'Model'.DS);
67         define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);
68         define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);
69     }
70 
71     /**
72      * 获取 p c a 的GET值,并设置为常量
73      * @return void
74      */
75     private static function dispatch()
76     {
77         $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
78         $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
79         $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作
80 
81         define('PLAT', $p);
82         define('CTR', $c);
83         define('ACTION', $a);
84     }
85 }

2) 入口文件引入初阶化类,并调用其方法 【index.php】

1 <?php
2 /**
3  * 入口文件
4  */
5 
6 require_once './Frame/Init.class.php';
7 Init::run();

3) 提交代码

1 $  git add -A
2 $  git commit -m "优化入口文件,封装初始化类"

=====================================================================================================
hibernate 3.x版本 默许选用日志技术 slf4j
(即简单日志门面(SimpleLoggingFacadeforJava))
,不是有血有肉的日志解决方案,它只服务于种种种种的日记系统。

require (‘./ThinkPHP/ThinkPHP.php’);

  思路:

澳门葡京备用网址 25澳门葡京备用网址 26

step 1:  创建文件  App/Common/config.php  并将数据库连接信息写入该配置文件

step 2:  在Frame/目录下创建读取配置文件类 Config.class.php

step 3: 设置自动加载 读取配置类

step 4: 基础模型类实例化 读取配置类。 操作数据库必须要经过基础模型类

step 5:  调整数据库工具类获取配置信息,既 其构造方法中通过传递进来的数据配置信息对象获取

step 6: 测试连接数据结果,验证获取配置

兑现连接数据库-读取数据库配置音讯思路

康宁访问项目目录

  • 澳门葡京备用网址 ,利用slf4j 好处,很不难整合其余日志技术

?>

  代码完毕

    1) 创造布局文件config.php  【App/Common/Config.php】

澳门葡京备用网址 27澳门葡京备用网址 28

<?php
/**
 * 配置文件
 * User: young
 */
return [
    //数据库连接配置
    'host'=>'localhost',
    'user'=>'root',
    'pwd'=>'root',
    'port'=>'3306',
    'charset'=>'utf8',
    'dbname'=>'php_blog',
];

布置文件-数据库配置消息

    2) 创造读取配置文件类 【Frame/Config.class.php】

 1 <?php
 2 /**
 3  * 配置文件读取类
 4  * User: young
 5  */
 6 
 7 class Config
 8 {
 9     protected static $ins = null;  //本类实例
10     protected $cfg = array(); //存储配置项
11 
12     /**
13      *  获取本类实例
14      * @access public
15      * @return  object     本类的单例对象
16      */
17     public static function getIns() {
18         if(false === (self::$ins instanceof self)){
19             self::$ins = new self();
20         }
21         return self::$ins;
22     }
23 
24     /**
25      *  构造方法: 读取配置项
26      * @access public
27      * @return  void
28      */
29     final protected function __construct() {
30         require APP.'Common'.DS.'config.php'; //读取配置项
31         $this->cfg = $cfg;
32     }
33 
34     /**
35      * 根据指定的配置项,返回该配置项的值
36      * @param string $k  配置项
37      * @return mixed|null 返回配置项的数据
38      */
39     public function __get($k) {
40         if(!isset($this->cfg[$k])) {
41             return null;
42         }
43         return $this->cfg[$k];
44     }
45 
46 
47     /**
48      * 根据指定的配置项,返回配置项的值
49      * @param  string $k 配置项名称
50      * @param string $v 配置项对应的值
51      */
52     public function __set($k,$v) {
53         $this->cfg[$k] = $v;
54     }
55 }

    3)  自动加载配置类

      需要活动加载该类, 该类在Frame目录下, 所以可以写入到
Init.class.php 类中的属性数组中   【Frame/Init.class.php】

澳门葡京备用网址 29澳门葡京备用网址 30

 1 <?php
 2 /**
 3  * 初始化应用类
 4  * User: young
 5  */
 6 
 7 class Init
 8 {
 9     protected static $frame = array('BaseController','BaseModel','Db','FactoryModel','Config');
10 。。。
11 。。。
12 。。。

自行加载配置类

    4)基础模型类实例化配置类【Frame/BaseModel.class.php】

 1 <?php
 2 
 3 /**
 4  * BaseModel.class.php 基础模型类
 5  *     连接数据库
 6  *  @author young
 7  */
 8 class BaseModel
 9 {
10     protected $db = null;
11     /**
12      * 构造方法: 实例化数据库类
13      * @access public
14      */
15     function __construct()
16     {
17        $conf =  Config::getIns(); //读取配置项实例
18         $this->db = Db::getDb($conf);
19     }
20 }

    5)数据库读取配置项音讯  【Frame/Db.class.php】     

澳门葡京备用网址 31澳门葡京备用网址 32

 1 <?php
 2 /**
 3  * Db.class.php 数据库操作工具类
 4  * @author young
 5  */
 6 
 7 class Db {
 8 。。。
 9 。。。
10 。。。
11     /**
12      * 构造方法: 保存数据库连接信息,连接数据库
13      * @access private
14      * @param array $conf 数据库连接信息
15      */
16     private function __construct($conf)
17     {
18         $this->host = $conf->host;
19         $this->user = $conf->user;
20         $this->pwd = $conf->pwd;
21         $this->port = $conf->port;
22         $this->charset = $conf->charset;
23         $this->dbname = $conf->dbname;
24         $this->connect();
25     }
26 。。。
27 。。。
28 。。。
29 }

数据库工具类获取配置音信

    6) 测试 在App/Controller/Home/DemoController.class.php 
用于测试数据库连接景况

澳门葡京备用网址 33澳门葡京备用网址 34

<?php
/**
 * 测试控制器类
 * User: young
 */

class DemoController extends BaseController
{
    public function test()
    {
        $db = new BaseModel();
        $data = $db->db->getAllRows("select * from y_user");
        var_dump($data);
    }
}

测试控制器类测试连接数据库

  注:
前提,须要将BaseModel.class.php中的$db属性先暂时改动为public公开,才能测试成功
(原因:在Demo控制器中实例化的底子模型类,数据库操作实例是放在类的习性db中,外部不可能访问protected属性),
本节所有测试,可以暂时将db设置为公开的。

澳门葡京备用网址 35

还足以选择安排如:
上传目录,网站配置音讯等,依照须要自定义配置要求,再经过读取配置类读取配置的数据

付出代码

git add -A
git commit -m "完成读取配置文件类"

   思路

  难点:
此时,项目中负有目录都是足以由此浏览器访问的,如直接访问Frame/Db.class.php文件
直接可以去查看数据库登录音信,分明是不安全的。

  解决方法:

    格局1:
在可以访问的公文开始处定义常量,访问是判断是还是不是定义常量defined(..),
没有概念指定常量则间接exit(‘Access Deny’);

    格局2: 开启分布式权限配置,编写.htaccess文件, 如禁止访问,
将该文件放置在查禁访问的目录中

公司java开发 最主流日志技术 log4j

4>.
打开浏览器,访问该品种的入口文件:那时可以观看项目创设成功后的提示画面,并且在
Myapp目录下,已为您创设好了项目目录。

荒谬日志记录

  除了开发阶段调试错误,
项目上线一般会将错误信息写入指定文件中。安全性更好。

   实现

  1)使用上述办法2的样式来完毕,
站点配置中进入一项(环境搭建时一度投入了):
详细见:PHP源码搭建博客1-环境搭建

  apache配置文件httpd-vhosts.conf 中站点布局

1  #允许分布式权限配置(允许重写)(.htacess)
2   AllowOverride All

  2) 重启apache后,编写 .htaccess文件, 该文件内容:

deny from all

   3) 将.htaccess文件放置禁止访问的目录中。  如App/ ,  Frame/
目录下。只用放在第一层即可,内层目录自动不允许直接访问。

                               
澳门葡京备用网址 36

  4) 访问测试

                   
澳门葡京备用网址 37

slf4j-api-1.6.1.jar 没有日记完结,只是接口,整合log4j

注意:如果是 Linux
环境上面布置,必要给项目入口文件之中指定的不二法门设置可写权限。那一个目录仅仅针对项目目录,系统目录无需安装任何可写权限,因为每个项目的沙盘缓存和多少缓存,以及日志文件都是单身的。

  须要分析:

    将错误写入日志文件中,那里暂时主要记录数据库操作的错误。
如:默许将错误记录在App/log/logError.txt。
假诺在布置文件中展开了配备,则将日志音信写入到布署项log指定的目录中

小结:

重中之重已毕了 引入路径优化, 类的电动加载, 封装优化进口文件,目录访问限制

MVC微型框架到此基本形成。其实还有许多或者得以持续伸张,如

  1, 类文件命名此处都用了 .class.php结尾,
实质可以优化直接动用.php结尾

  2, 引入命名空间,更便宜的加载类

       3, 项目中出现谬误,此时是一贯显示在浏览器上的,
可以写一个日志类,暴发错误写入文件或数据库都可

  4, 数据库连接音讯此处是平素写在DB类和BaseModel中了, 是不安全的。
可以创制一个布局目录,将那个消息写入配置文件,再写一个加载配置文件的类。

  5.   此架构目录 ,是在C,V中分平台,如Controller/Home,
Controller/Admin;  实际也足以写成 平台下分MVC结构, 如Admin/Controller,
Admin/Model, Home/Controller,Home/View .. 
这么些是比较灵活的,可以依据要求选用越发方便的不二法门

  实际上线项目,仍旧指出采纳框架,安全便捷;
自己模仿定义的框架结构适合学习研讨采纳,简单遗漏,造成安全隐患,操作困难等题材

下一步:按照博客前端模板,分析成立数据表,
开首搭建博客后台程序,后续首先准备实现“分类模块”。既分类的显得,修改,添加,删除功效

导入 slf4j-log4j12-1.7.2.jar (slf4j对log4j 框架整合 )
导入 log4j-1.2.16.jar (log4j的日志jar包 )

 

  思路:

澳门葡京备用网址 38澳门葡京备用网址 39

step 1: 制作日志类Frame/Log.class.php, 用于将错误信息写入到指定文件中。  (设置日志文件位置,正好可以利用上面写的配置项,通过读取配置来实现)

step 2: 在基础模型类BaseModel中,读取配置项后, 可以将日志目录路径写入常量。 使用try..catch 捕捉异常,将错误写入日志

step 3: 实现日志类自动加载。Log类在Frame目录中,所以只要在初始化应用类Init中的属性$frame数组中加入 “Log”

step 4: 记录错误。 数据库连接可能失败, sql语句可能执行失败

step 5: 测试错误日志记录功

兑现错误日志记录进程思路

   代码达成

  1) 制作错误日志类 【Frame/Log.class.php】

 1 <?php
 2 /**
 3  * 日志类
 4  * User: young
 5  */
 6 
 7 class Log
 8 {
 9     /**
10      * 记录错误信息到文件中
11      * @param string $err 错误信息
12      */
13     public static function write($err)
14     {
15         date_default_timezone_set('PRC'); //时区设置
16         //打开文件
17         $fh = fopen(LOG.'log.txt','a'); // 追加方式打开
18 
19         //拼接信息
20         $err = date('Y年m月d日 H:i:s',time()) . "\t\r\n" . $err . "\t\r\n";
21 
22         //写入
23         fwrite($fh,$err);
24 
25         //关闭
26         fclose($fh);
27     }
28 }

  2)  读取日志地方,捕捉错误  【Frame/BaseModel.class.php】

    暴发错误记录后,这里只是简单使用exit(..)退出,
可以自定error错误页面会更好

澳门葡京备用网址 40澳门葡京备用网址 41

 1 <?php
 2 
 3 /**
 4  * BaseModel.class.php 基础模型类
 5  *     连接数据库,捕捉记录错误
 6  *  @author young
 7  */
 8 class BaseModel
 9 {
10     Public $db = null;
11     /**
12      * 构造方法: 实例化数据库类
13      * @access public
14      */
15     function __construct()
16     {
17         $conf =  Config::getIns(); //读取配置项实例
18 
19         //读取日志配置项目 并写成常量
20         $logPath = $conf->log;
21         $logPath = !isset($logPath) ? APP."log".DS  : $logPath;
22         define('LOG',$logPath);
23 
24         //监控数据库操作
25         try {
26             $this->db = Db::getDb($conf);
27         }catch(Exception $e) {
28             $err = '';
29             $err .= '错误代码:' . $e->getCode() . "\r\n";
30             $err .= '错误信息:' . $e->getMessage() . "\r\n";
31             $err .=  '文件:' . $e->getFile() . "\r\n";
32             $err .=  '行号:' . $e->getLine() . "\r\n\r\n";
33             Log::write($err);
34             exit("<h2>客官!页面暂时无法响应,请稍后访问</h2>");
35         }
36     }
37 }

点击查看【基础模型类中监测并记录错误】

  3)自动加载日志记录类 【Frame/Init.class.php】

澳门葡京备用网址 42澳门葡京备用网址 43

 1 <?php
 2 /**
 3  * 初始化应用类
 4  * User: young
 5  */
 6 
 7 class Init
 8 {
 9     protected static $frame = array('BaseController','BaseModel','Db','FactoryModel','Config','Log');
10 。。。
11 。。。
12 。。。

点击查阅【自动加载日志类】

  4) 记录错误  【Frame/Db.class.php】

数据库连接可能发生错误处理

澳门葡京备用网址 44澳门葡京备用网址 45

 1  class Db
 2 {
 3 。。。
 4 。。。
 5 。。。
 6     /**
 7      * 连接数据库,设置编码,选库
 8      * @access private
 9      */
10     private function connect()
11     {
12         $this->link = @ mysql_connect("{$this->host}:{$this->port}", "$this->user", "$this->pwd") ;
13         if(!$this -> link) {
14             $error = new Exception("数据库连接不上",10000);
15             throw $error;
16         }
17         $this->setCharset($this->charset);
18         $this->useDb($this->dbname);
19     }
20 。。。
21 。。。
22 。。。

点击查阅【数据库连接错误抛出】

sql语句发生错误处理

澳门葡京备用网址 46澳门葡京备用网址 47

 1  class Db 
 2 {
 3 。。。
 4 。。。
 5 。。。
 6     /**
 7      * 执行sql语句
 8      * @param  string $sql sql语句
 9      * @return mixed
10      */
11     private function query($sql)
12     {
13         $result = mysql_query($sql, $this->link);
14 //        if(false === $result) {
15 //            echo "<p>sql执行失败!<br>";
16 //            echo "<br>失败语句:".$sql;
17 //            echo "<br>错误代号".mysql_errno();
18 //            echo "<br>错误提示: ".mysql_error()."</p>";
19 //            exit();
20 //        }
21         if(false === $result) {
22             $err = "sql执行失败!\r\n失败语句:".$sql."\r\n错误代号:".mysql_errno()."\r\n错误提示:".mysql_error()."\r\n\r\n";
23             Log::write($err);
24             exit("<h2>查询出错,请稍后访问</h2>");
25         }
26         return $result;
27     }
28 。。。
29 。。。
30 。。。

点击查阅【执行SQL错误处理】

======================================================================================================
log4j 是集团主流日志技术 ,是Apache公司提供的
1) 什么是日记技术,开发中缘何要用日志技术
日志 : 在系统运作进程中,记录关键音信,记录错误相当音讯的技巧

二)ThinkPHP 框架目录结构:

  测试

  可以在【App/Common/config.php】中配置日志文件目录。 假诺不开展布署,
默许记录在App/log/目录中

澳门葡京备用网址 48澳门葡京备用网址 49

 1 <?php
 2 /**
 3  * 配置文件
 4  * User: young
 5  */
 6 return [
 7     //数据库连接配置
 8     。。。
 9 、 。。。
10     。。。
11 
12     //日志文件位置配置
13     'log' => APP,
14 ];

点击查看【日志文件配置】

  以下测试可以 开启配置项中的配置log  和关闭后分别测试。  注意:
假设没有做安插log, 则要率先在App目录下创制一个log目录

   1. 在布局文件中故意写错数据库连接音信,如密码写错

澳门葡京备用网址 50

   2. 执行sql错误

澳门葡京备用网址 51

末段证实:
配置目录,日志目录都是不期待浏览器直接访问的,所以要求将.htaccess文件放入目录中
(由于App目录中已经存在,故也可以省略)

提交传送代码

git add -A
git commit -m "完成日志类"
git checkout master
git merge start-admin-module
git push origin master

 小结: 本篇首要落成了
框架清理,博客数据库表搭建,创制布局读取类,日志记录类。

    实际上,到此仍然只是越发完善了一下框架结构,伸张了2个效能。正如前篇所提,还有为数不少是足以改正的。那里就暂时不再继续加码效果了。

  • 分歧 System.out 和 日志技术
  • System.out 向控制台输入新闻,一定输出
  • 日志技术 存在级别,通过级别决定日志是不是输出,输出的详细程度,
    输出的目标地(控制台、文件、发送邮件)

ThinkPHP.php : ThinkPHP 公共文件。

提议难题:

  1. 怎么选取该自制框架搭建项目 ==> 用户操作+mvc已毕

【澳门葡京备用网址】配备文件,php源码建博客4。  2. 哪些入手接纳ajax已毕后台登录功能  ==> ajax应用

  3. 怎样入手落成分类模块作用,它有哪些操作 ==> 增删改查

下一步: 后台模板视图制作,后台登录,小说分类模块成效。

行使日志: 首要用以开发进度中调剂 和 项目上线后的爱护(记录bug)

Common 目录 : 系统共用文件目录

2) 使用log4j 通过计划文件 ,配置日志框架使用
src/log4j.xml
src/log4j.properties (简单)

Lang 目录 : 系统语言包目录

配备log4j.properties 有多个零部件
组件一: 记录器(Loggers) 用来安顿日志输出级别,使用什么输出源 格式:
记录器名 = 级别, 输出源1 , 输出源2 …
* 一个记录器 指定 八个输出源
log4j.rootLogger=info, stdout info是日记级别 , stdout是输出源名称
* log4j提供日志级别 由高到低 :fatal(致命错误), error(普通错误),
warn(警告),info(音讯), debug(调试), trace(堆栈 )
* log4j记录日志时,只会记录 配置级别更高级其他信息
零件二 : 输出源(Appenders) 在log4j中得以定义三个出口源
(控制台、日志文件、邮件、数据库 )
* log4j.appender.输出源名称 = 达成类
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 向决定台出口
log4j.appender.file=org.apache.log4j.FileAppender 向文件输出
组件三 : 布局(Layouts) 在日记中都记录哪些音讯
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 自定义布局
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L

Lib 目录 : 系统基类库目录

  • %m%n 自定义布局格式

Tpl 目录 : 框架种类模版目录

3)、 在程序中采纳log4j 记录日志
手续一 :定义记录器
private static final Logger LOG = Logger.getLogger(Log4jTest.class);
手续二 :使用 log4j提供每个级别方法 记录日志
LOG.fatal(“致命错误”);
LOG.error(“普通错误”);
LOG.warn(“警告音信”);
LOG.info(“普通音信”);
LOG.debug(“调试音讯”);
LOG.trace(“堆栈音信”);
* 常用 : error、warn、info、debug

Vendor 目录 : 第三方类库目录

=============================================================================================================================
4、 编写数据表和 实体类
create table customer(
id int primary key auto_increment,
name varchar(20),
age int ,
city varchar(20)
);

其它系统基类库目录 Lib 文件夹下,还有连带的子目录:

public class Customer {
private int id;
private String name;
private int age;
private String city;

}
create table user (
id INT NOT NULL AUTO_INCREMENT,
name varchar(20),
password varchar(20),
birthday date,
age int ,
primary key (id)
);
hibernate 完全ORM,只须要操作Customer类对象, 自动生成SQL 操作customer

Think 文件夹:系统运行库目录(必须)

  • 亟待为 实体类 和 数据表 举行关联映射配置
    1) 在类具有包,创制 类名.hbm.xml 文件 (Customer.hbm.xml )
    2) hibernate3.jar org/hibernate/hibernate-mapping-3.0.dtd
    配置属性到列映射时,指定项目,类型有二种写法
    第一种 java类型 java.lang.String
    第二种 hibernate类型 string
    第三种 SQL类型 varchar(20)

ORG 文件夹:增加类库目录( 非必须) 

5、配置hibernate大旨配置文件
在src下创建 hibernate.cfg.xml
规则参见 hibernate3.jar /org/hibernate/hibernate-configuration-3.0.dtd

具体内容可以打开目录查看结构和文件组成。

布署hibernate基本特性,参考 解压目录/project/etc/hibernate.properties
1) JDBC连接属性
2)数据库方言
3)其余性质
4)加载hbm映射文件

 

6、 编程操作hibernate框架(模板)
// 实例化配置对象,加载配置文件 hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
// 创制会话连接工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 创立会话
Session session = sessionFactory.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
… 这里可以编写hibernate操作代码逻辑
(********************************************************)
// 提交业务,释放资源
transaction.commit();
session.close();
sessionFactory.close();

=》再来看看系统自动生成的Myapp项目目录结构

7、 达成customer表增删改查操作
1) 使用 session对象 save方法 完成 insert 操作
session.save(customer);
2) 使用 session对象 get或者load 达成根据 id 查询
(Customer) session.get(Customer.class, id);
3) 使用session对象 update方法 完结 修改操作
session.update(customer); 按照id修改其余具有字段内容
(幸免修改为null的情形)
4) 使用session对象 delete方法 已毕 删除操作
session.delete(customer); 根据id删除
5) 查询所有数据
Session对象提供了多个办法可以取得Query对象 — 完毕查询
Query createQuery(String queryString) 接受HQL
SQLQuery createSQLQuery(String queryString) 接受SQL
* createQuery 重临Query对象,接收HQL查询语言 (Hibernate Query Language
) —- 语法类似SQL,面向类和属性的询问
* 使用HQL查询,面向类和性质,生成底层SQL 重回结果 封装类对象中
* 使用SQL查询,面向数据表,SQL无需转变,默许重回结果 每条记下
Object[] ——- 通过 addEntity(Customer.class) 指定将回到数据封装对象

Cache 目录:项目自动生成的沙盘缓存

==========================================================================================================================
二、 Hibernate 宗旨配置 和 主题API
1、 hibernate种类布局
hibernate 位于应用程序 和 数据库 之间 ,将数据库底层 完全封装,
应用程序只必要操作 Persistent Objects
(持久化对象),通过Hibernate生成SQL语句,达成对 数据表中著录的操作

Common 目录:项目中动用的公家文件,寻常包罗 common.php 公共函数文件。

hibernate 援救两种为主配置文件
src/hibernate.properties (key-value文件 键值对,紧要布局
hibernate基本属性 )
hibernate.connection.driver_class=com.mysql.jdbc.Driver
src/hibernate.cfg.xml (已毕主题属性配置,加载hbm映射文件)
<property
name=”hibernate.connection.driver_class”>com.mysql.jdbc.Driver</property>
<mapping resource=”cn/itcast/domain/Customer.hbm.xml”/>
加载hbm映射

Conf 目录: 项目各项安顿文件。

  • hibernate.properties 不可能加载 hbm映射 ,
    采取properties格局,必须手动编程加载 hbm文件或者 持久化类

Data 目录:项目的数量缓存目录。

2、 hibernate的常用属性
务必属性
hibernate.dialect 操作数据库方言
hibernate.connection.driver_class 连接数据库驱动程序
hibernate.connection.url 连接数据库URL
hibernate.connection.username 数据库用户名
hibernate.connection.password 数据库密码

Lang 目录:项目的语言包文件。

可选属性
hibernate.show_sql true 在控制台上输出SQL语句
* hibernate 自己达成的,并从未使用日志系统
,当关闭日志后,控制台照旧有SQL语句
hibernate.format_sql true 格式化控制台出口的SQL语句
* SQL 会自动换行,对于比较长的sql 查看方便

Lib 目录:应用类库目录,在那文件夹内经常包括两个子目录:Action 和
Model,Action 目录放置命名控制器文件,Model
目录放置模块类文件。除此之外,还是可以停扬弃何的品系列库。

hibernate.hbm2ddl.auto create/create-drop/update/validate DDL策略
* DDL 首要建表语句,和表结构立异语句
create:表示启动的时候先drop,再create (测试人士 准备标准测试数据)
create-drop: 也象征创设,只可是再系统关闭前执行一下drop
(测试程序是否科学)
update:
那个操作启动的时候会去检查schema是不是一致,如果差距会做scheme更新
(建表,更新表结构【只好加】)
validate:
启动时验证现有schema与你安插的hibernate是或不是相同,假若不雷同就抛出格外,并不做立异

Logs 目录:项目标日志文件。

*** 在产品开发中 update 和 validate 使用较多

Temp 目录:数据缓存目录,存放项目缓存文件。

hibernate.connection.autocommit true 事务是或不是自动提交
* 用于解决 没有拉开事务的操作时,事务如何自动处理
* 默许事务 自动回滚

Tpl 目录:项目模板文件,按风格创设对应的子目录。

专注:在 Linux 环境下,项目目录的
Cache(模版缓存目录)、Data(数据缓存目录)、Temp(编译缓存目录)、Logs(日志文件目录)必须设置为可写。

 

三)创制数据表和连串布局:

1) 创造数据库

2) 在 config.php 配置文件中装置数据库访问的连年音讯

3) 在 项目/Lib/Model
目录下,建立模型文件,就可以直接对数据表进行增删改查等操作了。

具体操作步骤:(以 MySQL 为例,假使是别的数据库请修改后再履行)

1) 创设一个数据库,名为 myapp

2) 运行上面的 sql 增添一个 think_message 表。

3) 在 Myapp/Conf 目录下边创制一个 config.php 项目安排文件,代码如下:

<?php

return array(

// 定义数据库连接音讯

‘DB_TYPE’=> ‘mysql’, // 指定数据库是 mysql

‘DB_HOST’=> ‘localhost’,//服务器地址

‘DB_NAME’=>’myapp’,  // 数据库名

‘DB_USER’=>‘root’,  //用户名

‘DB_PWD’=>’123456’,  //您的数据库连接密码

‘DB_PORT’=>‘3306’,  //端口

‘DB_PREFIX’=>’think_’,//数据表前缀(与数据库 myapp 中的表
think_message 对应)

 

 //’配置项’=>’配置值’
 ‘APP_GROUP_LIST’ => ‘Index,Admin’,
 ‘DEFAULT_GROUP’ => ‘Index’,

 ‘APP_GROUP_MODE’ => 1,
 
 //独立分组,此文件夹名称可以修改为别的
 ‘APP_GROUP_PATH’ => ‘Modules’,
   
 ‘TMPL_VAR_IDENTIFY’ => ‘array’,
 ‘TMPL_FILE_DEPR’ => ‘_’,

);

?>

留神:请保管布局文件之中的设置和您本地的数据库连接音信相同。

4) 在 Myapp/Lib/Model/目录下,新建一个文件
MessageModel.class.php,代码如下:

class MessageModel extends Model{ }    

 

四)ThinkPHP 的表和模型的命名规则:

ThinkPHP
须要数据库的表名和模型类(model)的命名要遵守一定的正规化,首先数据库的表名采纳小写方式,模型类公事名的命名规则是:

不含前缀的数码表表名(采纳驼峰命名法)+Model

在创造 message 表时,大家应用的名号是
think_message,think_尽管多少表前缀。在配备文件中大家已利用’DB_PREFIX’=>’think_’
作出了指定。

例如:MessageAction.class.php

 

五)控制器和 URL 访问:

如何定义一个用到模块?

在项目目录/Lib/Action
文件夹下,建立一个“模块名+Action.class.php”文件,并三番五次 Action 类则可。 

怎么定义一个操作?

在选取模块类的代码中,添加一个 function 方法则可

何以访问具体操作?

什么样通过 URL 传递变量?

1/变量值 1/变量名
2/变量值 2/ 

 

六)ThinkPHP的数额操作:

  • 行使 ThinkPHP 开发时,项 目中每一个持续了 Model 的模子类,都
    会对应着一个数据表(或者视图),模型与数据表存在一种炫耀关系。(
    例如此前大家所定义的 MessageModel 类, 对应的就是think_message
    表)。
  • 支付进程中,只要不难地定义好与数据表对应的模子类(xxxModel.class.php),甚至无需增加其他性质和方法就足以拓展对数据操作了。
  • ThinkPHP
    提供了灵活和有利的多少操作方法,不仅完毕了对数据库操作的三个基本操作(CURD):创建、更新、读取和删除的落到实处,还放置了重重实用的数量操作方法。

哪些添加记录到数量库表?

1) 获取(设置)要抬高的数据内容。

2) 实例化数据模型,调用 Model 类的 add( )方法即可添加。

具体操作实践一 添加数据 :数据对象赋值

1.1> 在 Index 模块中新添一个办法 add1,代码如下:

public function add1(){

// 使用 D 函数实例化新闻模型类

$Message = D(‘Message’);

// 然后给多少对象赋值

$Message->title = ‘ThinkPHP’;

$Message->email = ‘ThinkPHP@gmail.com’;

// 使用 add 方法保存内容

$Message->add();

// 使用 select 方法开展数量查询

$rs = $Message->select();

// 使用 dump 函数 输出查询数据查看

dump ( $rs );

}

 

1.2> 在浏览器中做客

array(1) {

[0] => array(6) {

[“id”] => string(1) “1”

[“title”] => string(8) “ThinkPHP”

[“content”] => string(0) “”

[“create_time”] => string(1) “0”

[“email”] => string(18) ThinkPHP@gmail.com

[“status”] => string(1) “1”

}

}

D( ) 函数 平日要实例化一个类,都是导入这些类公事,然后拔取 new
关键字进展实例化    相当于new Model(‘message’);

dump( ) 函数是 ThinkPHP 内置的对浏览器友好的变量输出函数。

 

操作实践二 添加数据 :数组赋值

1> 在 Index 模块中再添加一个艺术 add2,代码如下:

public function add2(){

// 使用 D 函数实例化一个模型类

$dao = D(‘Message’);// 然后给多少对象赋值

$data[‘title’] = ‘敏捷式开发框架 ThinkPHP!’;

$data[’email’] = [email=]’TP@thinkphp.cn’;[/email]

$data[‘create_time’] = time();

$data[‘content’] = ‘使用 ThinkPHP 进行多少操作’;

// 使用 add 方法保存内容

// 不需求传入主键的值就可以新建数据

$dao->add($data);

// 使用 select 方法举行数据查询

$rs = $dao->select();

header(“ContentType:text/html;charset=utf8”);

dump ( $rs );

}

 

2> 在浏览器中走访

add( ) 方法

加上数量可以经过 add(
)方法开展落到实处,如若表的主键是自行增加类型,不须要传入主键的值就足以新建数据,并且只要插入数据成功的话,add
方法的重返值就是流行插入的主键值,可以间接获取。

例如:$insertId = $dao->add($data);

select( ) 方法

对数码举行询问利用 select(
)方法,当该方法没有传到任何参数时,会得到全部数额。

具体操作实践三    添加数据 :利用表单创设数量并添加记录

诚如的话,在表中添加多少都是经过表单来确立,上面咱们使用 Message
模块举办实施经验。

1> 打开 Myapp/Lib/Action/MessageAction.class.php
文件,将原先的操作方法代码删去,并新添一个办法
add(),代码很简短,只要渲染模板进行输出则可,如下所示:

public function add() {

$this->assign(‘title’,’添加数据’);

$this->display( );

}

 

2> 对应 Message 应用模块,我 们在 Myapp/Tpl/目录下新建一个文件夹,起
名为 Message,

并在 Myapp/Tpl/Message 目录下新添一个模板文件 add.html,关键代码如下:

<form action=”__URL__/insert” method=”post” >

标题:<input name=”title” type=”text” />

邮箱:<input name=”email” type=”text” />

内容:<textarea name=”content” rows=”6″ cols=”50″
></textarea>

<input type=”submit” value=”提交” />

</form>

3> 在 MessageAction.class.php 中添加一个表单处理的法子
insert,代码如下:

// 处理表单数据的点子

public function insert() {

$dao = D(‘Message’);

// 调用 Model 类的 create 方法创建通过表单提交的数额对象

$vo = $dao->create();

// 创立失利提示

if(false === $vo) {

exit($dao->getError().’ [ <a >返 回</a> ]’);

}

//
当主键是机关增加类型时,方法的重临值就是风靡插入的主键值,可以平素获得

$rs = $dao->add();

// 添加数据失利提醒

if (!$rs) {

exit($dao->getError().’ [ <a >返 回</a> ]’);

}

// 成功唤醒并赶回,使用了函数 redirect($url,$time=0,$msg=”)

redirect(‘add’,2,’数据增进成功!’);  }

4> 接着,通过走访
举行表单数据交到测试。

地方示例中的action 提交到的拍卖地点是__URL__/insert 
模板引擎会自动将那句替换为/index.php/Message/insert

广大模板使用的差异平时变量还有:

__ROOT__ 网站根目录地址

__APP__ 当前项目(入口文件)地址

__URL__ 当前模块地址

__ACTION__ 当前操作地址

__SELF__ 当前 URL 地址

__PUBLIC__ 公共文件夹 Public 地址

create( ) 方法

create
方法用来创建数量对象,当参数为空时,默许是由此表单提交的数码。调用该方法后,就能够直接动用
add()方法开展添加数据,而不用再安装插入数据的内容。

getError( ) 方法

用来捕获数据库操作进程中的出错提示。

1> 页面 Trace

页面 Trace 效能提供了很好的 SQL
调试方法,而且可以很直观的在当前页面查看到 SQL
语句音讯,大家只必要设置参数:’SHOW_PAGE_TRACE’ =>
TRUE,那样,大家可以在页面来看类似上边的新闻:

SQL 记录 : 1 条 SQL

[ 09040805:38:13 ] RunTime:0.000238s SQL = SELECT * FROM
think_message

2> 开启 SQL 日志

页面 Trace 新闻尽管直观,不过只可以突显当前页面的 SQL
执行新闻,即使你使用了 Ajax 操作,那么后台的执行 SQL
可能就不会来得,大家不得不通过翻看 SQL 日志了。可以在配置参数里面开启SQL
日志记录。

‘SQL_DEBUG_LOG’ => TRUE,

咱俩得以在 Logs 目录下边的 sql 日志文件之中来看:

[ 09040805:50:12 ]

RunTime:0.000238s SQL = SELECT * FROM think_message WHERE id in
(1,2,5)

那般的笔录音信,可以分析现实举行的 SQL
语句是不是有标题,以及执行时间,便于优化。

3> 使用 getLastSql 方法

假若你没有打开 SQL 日志,也尚未选用页面 Trace
新闻体现效果,那么还是能调剂可能现身错误的 SQL 语句,我们可以在询问办法的前面使用 getLastSql 方法来查阅最终两遍施行的 SQL
语句。

有利于分析错误可能的因由。

$dao->find(8);

echo $dao->getLastSql();

 

4> 使用调试配置文件

单身定义调试配置文件,可以给您的项目安装最合理的参数。而且你还足以给调试情势扩充单独的数据库连接。

大家可以在类型的 Conf 目录上面扩张调试配置,内容如下:

‘SHOW_RUN_TIME’ => TRUE, // 开启运行时刻突显

‘SHOW_ADV_TIME’ => TRUE, // 呈现详细运行时刻音信

‘SHOW_DB_TIMES’ => TRUE, // 展现数据库查询和写入次数

‘SHOW_RUN_TIME’ => TRUE, // 开启运行时刻突显

5> 开启调试情势

假使在配备中装置’DEBUG_MODE’=>true,就可以拉开调试情势。

系统默许是调用 ThinkPHP/Common/debug.php
的布置安装。要活动定义时,只要在项目Myapp/Conf/目录下,添加 debug.php
文件,然后根据需求开展安装。

 

七)Thinkphp 的数目查询:

怎么样询问记录?

1> 设置查询条件 (即使是寻找所有记录,这一步可粗略)

2>
使用最直观易懂的操作办法:要开展数据操作的模子->对查询设定(连贯操作)->举办查询

例如:$User->where(‘name=thinkphp’)->find();

基础知识连贯操作

所谓连贯操作,是 ThinkPHP 使用了魔术点子来兑现的有些新鲜的 Model
类方法,可以对数码对象延续调用数个主意(参数)来设定一定的条件,然后实施最后所指定的操作,那类特定措施的命名都很直观易记,主要措施有:

field //要查询的字段名

table //数据表名称 不点名时,默许为当前多少对象所对应的表

where //查询条件

order // 排序

limit //结果限制

having //having 支持

group //group 支持

distinct //distinct 筛选扶助

贯通操作使用代码示例:

$User->where(‘status=1’)

->table(‘`other_db`.`think_user`’)

->order(‘create_time’)

->limit(10)

->select();

多少查询具体操作实践

大家新确立一个行使模块 Search 专门用来体验 ThinkPHP 的各个查询艺术。先在
Myapp/Lib/Action 目录下,新建一个 PHP
文件,命名为:SearchAction.class.php。并定义类:

<?php

// 数据查询体验

class SearchAction extends Action{

function _initialize( ) {

// 为了方便使用 dump 函数查看结果输出,先在初叶化方法里联合编码

header(“ContentType:text/html; charset=utf8”);

}

}//类定义 end

?>

 

1> 查询单条记下

当数据表的主键为 id 并且是自行增进时,可以向来动用 find(id
编号)进行询问。

1.1> 在 Search 应用模块中新添一个措施,代码如下:

// 使用 find 方法查询 1

public function find1(){

// 实例化模型

$dao = D(‘Message’);

// 查询 id 为 5 的记录

$rs = $dao->find(5);

// 输出结果

dump ($rs);

// 输出 sql 语句进行自查自纠

dump($dao->getLastSql());

}

2> 查询符合特定条件的单条数据

2.1> 新添一个艺术 find2,代码如下:

// 使用 find 方法查询 2

public function find2(){

// 实例化模型

$dao = D(‘Message’);

// 设置查询条件

$where[‘status’] = 1;

$where[’email’] = ‘TP@thinkphp.cn’;

// 需求查询的字段

$field = ’email,title’;

// 进行查询

$rs = $dao->where($where)->field($field)->find();

// 输出结果

dump($rs);

// 输出 sql 语句

dump($dao->getLastSql());

}

2.2> 访问 find2 操作

可以寓目那般进行询问的 sql 就是:

“SELECT `email`,`title` FROM `think_message` WHERE ( `status` =
1 ) AND ( `email` = ‘TP@thinkphp.cn’ ) LIMIT 1 “

专注:使用 find(
)方法开展询问,无论符合条件的结果有稍许个,都只会回来单条记录。

在贯穿操作中的参数(where,field,order
等)顺序是不分先后的,如本例,要是利用

$rs = $dao‐>field($field)‐>where($where)‐>find();

所得的操作结果完全一致,所以不用去记住顺序。

3> 获取具有记录

3.1> 添加一个艺术 select1,代码如下:

// 获取具有记录集

public function select1(){

// 实例化模型

$dao = D(‘Message’);

// 设置查询条件

$where[‘status’] = 1;

// 须求查询的字段

$field = ’email,title’;

// 进行查询

$rs = $dao->where($where)->field($field)->select();

// 输出结果

dump($rs);

// 输出 sql 语句举办

dump($dao->getLastSql());

}

3.2> 访问 select1 操作:

同 find 方法同样,连贯操作中,除了 select
方法必须置于最终,参数条件顺序不限。

选拔 select 方法开展询问,再次来到的是一个数码记录集。

select 方法也支撑 join,like 等更扑朔迷离的询问,具体运用可以参见相关手册。

select 方法还有一个别名 findall,使用方法是一样的。

$rs = $dao->where($where)->field($field)->findall();

 

八)ThinkPHP 的数目更新:

创新记录使用 save 方法:

$User->find(1); // 查找主键为 1 的数据

$User->email = ‘TOPThink@thinkphp.cn’; // 修改数据对象

$User->save(); // 保存当前多少对象

// 仍可以使用上边的点子立异

$User->score = array(‘exp’,'(score+1)’); // 对用户的积分加 1

$User-> save();

若是或不是运用数据对象的不二法门来保存,可以流传要保留的数据和标准

$data[‘id’] = 1;

$data[‘name’] = ‘TopThink’;

$User->save($data);

除去 save 方法外,你还足以选用 setField 方法来更新特定字段的值,例如:

$User->where(‘id=1’)->setField(‘name’,’TopThink’);

行使原生 sql

透过 execute 方法执行 sql 语句,

$User->execute(“UPDATE __TABLE__ SET name=’thinkPHP’ WHERE
status=1”);

 

九)ThinkPHP 的数目删除:

去除记录使用 delete 方法

删去单条记录

$User->find(2);

$User->delete(); // 删除查找到的记录

去除多条记下

$where[‘id’] = array(‘in’,’1,2,3,4,6,8’);

$User->where($where)->delete();

应用原生 sql

$User->execute(“DELETE FROM __TABLE__ WHERE name=’thinkPHP'”);

 

十)ThinkPHP 的模板使用:

平日一个选取模块中,会有几多操作(function)须求有与用户交互的页面,这就须求使用模板输出,ThinkPHP
本身已停放了一套拥有 ThinkPHP
特色的,很有力易扩充且使用很是便宜的模版引擎。

何以利用模板?

仅需一步,在类型/Tpl/风格目录/下,建立一个 html
文件与操作名称相对应就可以了。

具体操作实践

1 在
Myapp/Tpl/下树立一个目录,依照使用模块的称号,大家将以此文件夹命名为
Index。

2 在 Myapp/Tpl/Index/目录下树立一个 html
文件,按照操作名称,大家命名该公文为index.html。

3 打开 Myapp/Lib/Action/IndexAction.class.php 文件,将 index
操作的代码修改为。

<?php

class IndexAction extends Action{

public function index(){

$value = ‘hello,ThinkPHP’;

$this->assign(‘title’,$value);

$this->display( );

}

}

?>

4 打开 Myapp/Tpl/default/Index/index.html 文件,代码为:

<!DOCTYPE html PUBLIC “//W3C//DTD XHTML 1.0 Transitional//EN”

“;

<html xmlns=”;

<head>

<meta httpequiv=”ContentType” content=”text/html; charset=utf8″ />

<title>{$title}</title>

</head>

<body>

测试输出: {$title}

</body>

</html>

5 在浏览器中输入
,大家可以看看,在浏览器的标题栏和页面中,index方法所定义的模版变量$title
已成功地出口。

设若要同时输出多个模板变量,可以运用上边的主意:

$array = array();

$array[‘name’] = ‘thinkphp’;

$array[’email’] = ‘liu21st@gmail.com’;

$array[‘phone’] = ‘12335678’;

$this->assign($array);

如此,就可以在模板文件中并且输出 name、email 和 phone 多个变量。

模板调用

1 直接调用 index 操作模板

$this->display();

// 对应 Myapp/Tpl/Index/index.html

2 调用 Index 模块的 test1 操作模板

$this->display(‘test1’);

//对应 Myapp/Tpl/Index/test1.html

2 调用 Message 模块的 test2 操作模板()

$this->display(‘Message:test2’);

//对应 Myapp/Tpl/Message/test2.html

3 调用 XP 大旨的 Message 模块的 test2 操作模板

$this->display(‘Xp@Message:test2’);

//对应 Myapp/Tpl/Xp/Message/test2.html

4 间接指定模板文件的姓名

$this->display(‘../Message/test3.html’);

//对应 Myapp/Tpl/Message/test3.html

模板变量循环输出

在模板中对数据开展巡回输出使用 iterate 标签。

模版变量赋值

$Message = D(‘Message’);

$list = $Message->select();

$this->assign(‘list’,$list);

模版定义

<iterate name=”list” id=”vo”>

{$vo.name}

</iterate>

留神 name 和 id 表示的意思,name 是已赋值的沙盘变量,id
是在那个轮回中所使用的变量。

id=’vo’中的 vo 即 foreach($list as $val)中的$val。

// 输出 list 的第 5~15 条记录

<iterate name=”list” id=”vo” offset=”5″ length=’10’>

{$vo.name}

</iterate>

// 输出偶数记录

<iterate name=”list” id=”vo” mod=”2″ >

<eq name=”mod” value=”1″>

{$vo.name}

</eq>

</iterate>

// 输出 key

<iterate name=”list” id=”vo” key=”k” >

{$k}.{$vo.name}

</iterate>

iterate 还有其它别名是 volist,sublist

子循环输出

<volist name=”list” id=”vo”>

<sublist name=”vo[‘sub’]” id=”sub”>

{$sub.name}

</sublist>

</volist>

 

 

 


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website