目录

写在前面

nhibernate文档

搭建项目

映射文件

持久化类

辅助类

数据库设计与连接配置

测试

总结

写在前面

一年前刚来这家公司,发现项目中使用的ORM是Nhibernate,这个之前确实没接触过,EF多少在项目中用过,想着既然都是ORM,应该语法上都差不多。当时也就是硬着头皮上的,刚开始也只能通过模仿别人的代码,再加上自己的理解,一些增删改查的方法,确实也被自己给搞出来了,现在回头想想,在项目中,用到的那些方法基本上就一个样,很少有变化。除非有些业务逻辑非常强的,自己搞不定,问一下同事,还是可以解决的。到现在使用Nhibernate也很长时间,中间多少也查过一些资料,从网上下的nhibernate文档.docx,但是每次想去找的时候,总的在电脑上去找,比较麻烦,就干脆记录在博客中了,当时就是有哪些不明白的,可以很方便的从里面查,比如参数是什么含义。也总结了一些,在使用过程遇到的问题。

现在项目告一段落,坐等为客户去部署了,也就有那么点空闲时间,那就要系统的学习一下了。

发现在写这篇文章的时候,说了自己的一些学习方式,发现越写越多,就单独成篇了,也就有了这篇文章——如何高效的利用博客园?

上篇文章,也算是nhibernate学习的开篇吧。

nhibernate文档

[Nhibernate]体系结构

[NHibernate]ISessionFactory配置

[NHibernate]持久化类(Persistent Classes)

[NHibernate]O/R Mapping基础

[NHibernate]集合类(Collections)映射 

[NHibernate]关联映射

[NHibernate]Parent/Child

[NHibernate]缓存(NHibernate.Caches)

[NHibernate]NHibernate.Tool.hbm2net

[NHibernate]Nullables

[NHibernate]Nhibernate如何映射sqlserver中image字段

搭建项目

项目结构和映射文件

项目结构说明

采用传统三层架构

Wolfy.Shop.Domain:数据实体和数据库映射文件。也有人叫做领域层。

Wolfy.Shop.Data:数据层,存放数据库的操作及Nhibernate辅助类。引用Iesi.Collections.dll,NHibernate.dll和类库Wolfy.Shop.Domain

Wolfy.Shop.Business:业务逻辑类。引用类库项目Wolfy.Shop.Domain,Wolfy.Shop.Data

Wolfy.Shop.WebSite:测试项目。需引用Iesi.Collections.dll,NHibernate.dll和类库项目Wolfy.Shop.Domain,Wolfy.Shop.Business

Nhibernate最新版本为4.0.1.GA,下载地址:http://nhforge.org/

解压NHibernate-4.0.1.GA-bin.zip压缩包,内容如下:

其中Confiuration_Templates文件夹内包括:

这些xml内为数据库连接配置文件模版,通过上图也可以发现nhibernate支持的数据库种类还是很全的。主流的数据库已经都包括在内了。

那么,咱们打开MSSQL.cfg的文件看一下

 <?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<!-- This is the System.Data.dll provider for SQL Server -->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
Server=(local);initial catalog=nhibernate;Integrated Security=SSPI
</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
</session-factory>
</hibernate-configuration>

通过上面的注释部分咱们可以得到一个信息,就是在项目中使用的话,需要将文件重命名为hibernate.cfg.xml.

添加引用

同样可以通过Nuget进行添加,如图:

持久化类

为客户实体创建持久化类

 namespace Wolfy.Shop.Domain.Entities
{
/// <summary>
/// 描述:客户实体,数据库持久化类
/// 创建人:wolfy
/// 创建时间:2014-10-16
/// </summary>
public class Customer
{
/// <summary>
/// 客户id
/// </summary>
public virtual Guid CustomerID { get; set; }
/// <summary>
/// 客户名字
/// </summary>
public virtual string CustomerName { get; set; }
/// <summary>
/// 客户地址
/// </summary>
public virtual string CustomerAddress { get; set; }
}
}

注意NHibernate默认使用代理功能,要求持久化类不是sealed的,而且其公共方法、属性和事件声明为virtual。在这里,类中的字段要设置为virtual,否则出现“

“NHibernate.InvalidProxyTypeException”类型的异常在 Wolfy.Shop.Data.dll 中发生,但未在用户代码中进行处理

其他信息: The following types may not be used as proxies:

Wolfy.Shop.Domain.Entities.Customer: method get_CustomerID should be 'public/protected virtual' or 'protected internal virtual'

Wolfy.Shop.Domain.Entities.Customer: method set_CustomerID should be 'public/protected virtual' or 'protected internal virtual'

Wolfy.Shop.Domain.Entities.Customer: method get_CustomerName should be 'public/protected virtual' or 'protected internal virtual'

Wolfy.Shop.Domain.Entities.Customer: method set_CustomerName should be 'public/protected virtual' or 'protected internal virtual'

”异常。

编写映射文件

编写NHibernate配置文件智能提示的功能。只要在下载的NHibernate里找到configuration.xsd和nhibernate-mapping.xsd两个文件并复制到vs安装目录下,如C:\Program  Files\Microsoft Visual Studio 9.0\Xml\Schemas目录即可。

此时,你在nhibernate的配置文件中就有智能提示功能了。

nhibernate如何知道持久化类和数据库表的对应关系的呢?这就要通过映射文件来完成这个任务了,映射文件包含了对象/关系映射所需的元数据。元数据包含持久化类的声明和属性到数据库的映射。映射文件告诉nhibernate它应该访问数据库里面的哪个表及使用表里面的哪些字段。

那么我们编写Customer持久化类的映射文件,注意映射文件以.hbm.xml结尾。如Customer.hbm.xml

 <?xml version="1.0" encoding="utf-8" ?>
<!--assembly:程序集,namespace:命名空间-->
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Wolfy.Shop.Domain" namespace="Wolfy.Shop.Domain.Entities">
<class name="Wolfy.Shop.Domain.Entities.Customer,Wolfy.Shop.Domain" table="TB_Customer">
<!--主键-->
<id name="CustomerID" type="Guid" unsaved-value="null">
<column name="CustomerID" sql-type="uniqueidentifier" not-null="true" unique="true"/>
<generator class="assigned"></generator>
</id>
<property name="CustomerName" type="String">
<column name="CustomerName" sql-type="nvarchar" not-null="false"/>
</property>
<property name="CustomerAddress" type="String">
<column name="CustomerAddress" sql-type="nvarchar" not-null="false"/>
</property> </class>
</hibernate-mapping>

这些东西该怎么记?记住根节点hibernate,并且映射文件中要有主键id和property节点就可以了,其他的依赖vs的智能提示,就可以了。
这里需要养成一个习惯,就写好映射文件,需要修改它的属性

否则会出现,如下错误,而这个错误也是使用nhibernate最常见,所以养成一个好习惯,能提高你的开发效率:

辅助类

在使用之前,需要通过ISessionFactory获得ISession,ISessionFactory的详细介绍可以参考文档[NHibernate]ISessionFactory配置 ,ISessionFactory是线程安全的,而ISession是非线程安全的。很多线程可以同时访问ISessionFactory,所以ISession要通过ISessionFactory打开,在所有的工作完成后,需要关闭。ISessionFactory通常是个线程安全的全局对象,只需要被实例化一次(可以使用单例模式)。这里编写一个简单的辅助类NHibernateHelper,用于创建ISessionFactory和配置ISessionFactory,并打开一个新的ISession的方法。代码如下:

 using NHibernate;
using NHibernate.Cfg;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.Shop.Data
{
/// <summary>
/// 描述:nhibernate辅助类
/// 创建人:wolfy
/// 创建时间:2014-10-16
/// </summary>
public class NHibernateHelper
{
private ISessionFactory _sessionFactory;
public NHibernateHelper()
{
//创建ISessionFactory
_sessionFactory = GetSessionFactory();
}
/// <summary>
/// 创建ISessionFactory
/// </summary>
/// <returns></returns>
public ISessionFactory GetSessionFactory()
{
//配置ISessionFactory
return (new Configuration()).Configure().BuildSessionFactory();
}
/// <summary>
/// 打开ISession
/// </summary>
/// <returns></returns>
public ISession GetSession()
{
return _sessionFactory.OpenSession();
}
} }

这里需引入命名空间:NHibernate和NHibernate.Cfg。

数据库设计与连接配置

数据表设计如图所示:

创建数据表的sql

 USE [master]
GO
/****** Object: Database [Shop] Script Date: 2014/11/2 11:28:05 ******/
CREATE DATABASE [Shop]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'Shop', FILENAME = N'F:\Database\Shop.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'Shop_log', FILENAME = N'F:\Database\Shop_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [Shop] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [Shop].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [Shop] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [Shop] SET ANSI_NULLS OFF
GO
ALTER DATABASE [Shop] SET ANSI_PADDING OFF
GO
ALTER DATABASE [Shop] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [Shop] SET ARITHABORT OFF
GO
ALTER DATABASE [Shop] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [Shop] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [Shop] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [Shop] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [Shop] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [Shop] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [Shop] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [Shop] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [Shop] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [Shop] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [Shop] SET DISABLE_BROKER
GO
ALTER DATABASE [Shop] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [Shop] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [Shop] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [Shop] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [Shop] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [Shop] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [Shop] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [Shop] SET RECOVERY FULL
GO
ALTER DATABASE [Shop] SET MULTI_USER
GO
ALTER DATABASE [Shop] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [Shop] SET DB_CHAINING OFF
GO
ALTER DATABASE [Shop] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [Shop] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
USE [Shop]
GO
/****** Object: Table [dbo].[TB_Customer] Script Date: 2014/11/2 11:28:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_Customer](
[CustomerID] [uniqueidentifier] NOT NULL,
[CustomerName] [nvarchar](16) NULL,
[CustomerAddress] [nvarchar](128) NULL,
[Version] [int] NOT NULL,
CONSTRAINT [pk_customerid] PRIMARY KEY CLUSTERED
(
[CustomerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO
/****** Object: Table [dbo].[TB_Order] Script Date: 2014/11/2 11:28:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_Order](
[OrderID] [uniqueidentifier] NOT NULL,
[CustomerID] [uniqueidentifier] NULL,
[OrderDate] [datetime] NULL,
CONSTRAINT [PK_TB_Order] PRIMARY KEY CLUSTERED
(
[OrderID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO
/****** Object: Table [dbo].[TB_OrderProduct] Script Date: 2014/11/2 11:28:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_OrderProduct](
[OrderID] [uniqueidentifier] NOT NULL,
[ProductID] [uniqueidentifier] NOT NULL
) ON [PRIMARY] GO
/****** Object: Table [dbo].[TB_Product] Script Date: 2014/11/2 11:28:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_Product](
[ProductID] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](128) NULL,
[Price] [decimal](18, 0) NULL,
CONSTRAINT [PK_TB_Product] PRIMARY KEY CLUSTERED
(
[ProductID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO
ALTER TABLE [dbo].[TB_Customer] ADD DEFAULT ((1)) FOR [Version]
GO
ALTER TABLE [dbo].[TB_Order] WITH CHECK ADD CONSTRAINT [FK_TB_Order_TB_Customer] FOREIGN KEY([CustomerID])
REFERENCES [dbo].[TB_Customer] ([CustomerID])
GO
ALTER TABLE [dbo].[TB_Order] CHECK CONSTRAINT [FK_TB_Order_TB_Customer]
GO
ALTER TABLE [dbo].[TB_OrderProduct] WITH CHECK ADD CONSTRAINT [FK_TB_OrderProduct_TB_Order] FOREIGN KEY([OrderID])
REFERENCES [dbo].[TB_Order] ([OrderID])
GO
ALTER TABLE [dbo].[TB_OrderProduct] CHECK CONSTRAINT [FK_TB_OrderProduct_TB_Order]
GO
ALTER TABLE [dbo].[TB_OrderProduct] WITH CHECK ADD CONSTRAINT [FK_TB_OrderProduct_TB_Product] FOREIGN KEY([ProductID])
REFERENCES [dbo].[TB_Product] ([ProductID])
GO
ALTER TABLE [dbo].[TB_OrderProduct] CHECK CONSTRAINT [FK_TB_OrderProduct_TB_Product]
GO
USE [master]
GO
ALTER DATABASE [Shop] SET READ_WRITE
GO

nhibernate配置,也就是数据库配置:

这里使用的是SQL Server2012,所以我们使用MSSQL.cfg.xml文件,重命名为hibernate.cfg.xml.

注意需根据自己数据库的实例名修改,并添加mapping节点,其他的设置,可根据需要进行添加。这里采用最简单的一种方式,关于nhibernate的配置参数,可参考文档中的说明。

  1 <?xml version="1.0" encoding="utf-8" ?>
2 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
3 <session-factory>
4 <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
5 <property name="connection.connection_string">
6 server=.;database=shop;uid=sa;pwd=sa
7 </property>
8 <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
9 <mapping assembly="Wolfy.Shop.Domain"/>
10 </session-factory>
11 </hibernate-configuration>

修改后,将hibernate.cfg.xml拷入Wolfy.Shop.WebSite项目,并修改其属性:

否则会出现如下异常:

数据层和业务逻辑层代码

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Wolfy.Shop.Domain.Entities;
using NHibernate;
using NHibernate.Linq;
using NHibernate.Cfg;
using System.Linq.Expressions;
namespace Wolfy.Shop.Data
{
/// <summary>
/// 描述:客户数据层类,操作数据库
/// 创建人:wolfy
/// 创建时间:2014-10-16
/// </summary>
public class CustomerData
{
/// <summary>
/// 添加客户
/// </summary>
/// <param name="customer">客户实体</param>
/// <returns>是否添加成功 </returns>
public bool AddCustomer(Customer customer)
{ try
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
var session = nhibernateHelper.GetSession();
session.SaveOrUpdate(customer);
session.Flush();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 根据条件得到客户信息集合
/// </summary>
/// <param name="where">条件</param>
/// <returns>客户信息集合</returns>
public IList<Customer> GetCustomerList(Expression<Func<Customer, bool>> where)
{
try
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
ISession session = nhibernateHelper.GetSession();
return session.Query<Customer>().Where(where).ToList();
}
catch (Exception ex)
{
throw ex;
}
}
}
}
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using Wolfy.Shop.Data;
using Wolfy.Shop.Domain.Entities; namespace Wolfy.Shop.Business
{ /// <summary>
/// 描述:客户信息业务逻辑层
/// 创建人:wolfy
/// 创建时间:2014-10-17
/// </summary>
public class CustomerBusiness
{
private CustomerData _customerData;
public CustomerBusiness()
{
_customerData = new CustomerData();
}
/// <summary>
/// 添加客户
/// </summary>
/// <param name="customer">客户实体</param>
/// <returns>是否添加成功 </returns>
public bool AddCustomer(Customer customer)
{
return _customerData.AddCustomer(customer);
}
/// <summary>
/// 根据条件得到客户信息集合
/// </summary>
/// <param name="where">条件</param>
/// <returns>客户信息集合</returns>
public IList<Customer> GetCustomerList(Expression<Func<Customer, bool>> where)
{
return _customerData.GetCustomerList(where);
}
}
}

测试

为了以后使用方便,在这里使用webform项目作为测试,通过单击“添加”按钮,向数据库中插入记录,

页面

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CustomerManager.aspx.cs" Inherits="Wolfy.Shop.WebSite.CustomerManager" %>

 <!DOCTYPE html>

 <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
.main {
border: 1px solid #0094ff;
margin: 50px auto;
width: 600px;
} .table {
border: 1px solid #0094ff;
border-collapse: collapse;
width: 98%;
text-align: center;
margin:5px auto;
} .table th {
background-color: lightgray;
}
.table tr td {
border: 1px solid #0094ff;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div class="main">
<asp:Button runat="server" ID="btnAdd" Text="添加" OnClick="btnAdd_Click" />
<div>
<asp:Repeater runat="server" ID="rptCustomerList">
<HeaderTemplate>
<table class="table">
<tr>
<th>姓名</th>
<th>姓名</th>
<th>地址</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%#Container.ItemIndex+1 %></td>
<td><%#Eval("CustomerName") %></td>
<td><%#Eval("CustomerAddress") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
</div>
</form>
</body>
</html>

CustomerManager。aspx

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Wolfy.Shop.Domain.Entities; namespace Wolfy.Shop.WebSite
{
public partial class CustomerManager : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
RepeaterDataBind();
}
}
private void RepeaterDataBind()
{
Business.CustomerBusiness customerBusiness = new Business.CustomerBusiness();
this.rptCustomerList.DataSource = customerBusiness.GetCustomerList(c => == );
this.rptCustomerList.DataBind();
}
/// <summary>
/// 添加客户信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnAdd_Click(object sender, EventArgs e)
{
var customer = new Customer() { CustomerName = "wolfy", CustomerAddress = "北京 海淀", CustomerID = Guid.NewGuid() };
Business.CustomerBusiness customerBusiness = new Business.CustomerBusiness();
if (customerBusiness.AddCustomer(customer))
{
this.RepeaterDataBind();
}
}
}
}

CustomerManager.aspx.cs

界面

通过SQL Server Profiler查看生成的sql语句

通过监控到的sql语句,也可以看到使用nhibernate插入数据时,数据库中是通过存储过程进行插入数据的。

总结

本文简单介绍了使用nhibernate的一些配置,给我的感觉是,在使用时只要配置正确,其他的增删改查什么的也就没什么难的了。在配置nhibernate的时候,有些细节需要注意。比如映射文件和nhibernate的配置文件的属性需要进行修改。

参考文章

http://www.cnblogs.com/lyj/archive/2008/10/14/1310913.html#comment_tip

最新文章

  1. js获取浏览器内核、类型、版本以及系统类型
  2. [LintCode] Toy Factory 玩具工厂
  3. Android-Activity使用(2) -传值
  4. Hudson(Jenkins)持续集成插件开发环境搭建
  5. js取配置文件内容
  6. POJ-2528 Mayor&#39;s posters (线段树区间更新+离散化)
  7. [POJ 1787]Charlie&#39;s Change (动态规划)
  8. MATLAB和c#混合编程实现心电图显示软件
  9. IDC机房动力环境设备维护
  10. Extjs6(一)——用sencha cmd建立一个ExtJs小项目
  11. 阿里Java开发手册1.3.0 文字版
  12. C#复习笔记(2)--C#1所搭建的核心基础
  13. HDU 1074 (DP + 状态压缩)
  14. VS项目启动后 提示ID为*******的进程当前未运行
  15. Crontab中的除号(slash)到底怎么用?(转载)
  16. 8-安装Kafka
  17. Python3实战系列之八(获取印度售后数据项目)
  18. 「THUPC2018」赛艇 / Citing
  19. pandas删除缺失数据(pd.dropna()方法)
  20. Linux内核分析作业 NO.1

热门文章

  1. Linux下通配符总结
  2. php使用$_SERVER[&quot;REMOTE_ADDR&quot;]获取访问IP地址
  3. diff/merge configuration in Team Foundation - common Command and Argument values - MSDN Blogs
  4. Android(Linux)控制GPIO的方法及实时性分析
  5. Hibernate 错题分析
  6. MVC 问答
  7. 《如何在大学里脱颖而出(How to Win at College)》读书笔记
  8. Codeforces Canda Cup 2016
  9. c++的一些陷阱(1)
  10. mysql的基本命令行操作