PER_FIRST_NAMEnvarchar40not null
PER_LAST_NAMEnvarchar40not null
PER_BIRTH_DATE DateTime8
PER_WEIGHT_KGfloat8
PER_HEIGHT_Mfloat8
3. 为了在开发过程更加直观,我们需要将ibatisnet日志打开以便观察ibatinets运作的细节。
ibatisnet采用
IBatisNet.Common.Logging.Log4Net,就是使用Log4Net纪录日志的包装。在Web.config中增加下面的配置内容:
<configSections>
<sectionGroupname="iBATIS">
<sectionname="logging"type="IBatisNet.Common.Logging.ConfigurationSectionHandler, IBatisNet.Common" />
</sectionGroup>
<sectionname="log4net"type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<iBATIS>
<logging>
<logFactoryAdaptertype="IBatisNet.Common.Logging.Impl.Log4NetLoggerFA, IBatisNet.Common.Logging.Log4Net">
<argkey="configType"value="inline" />
<arg key ="showLogName" value="true" />
<arg key ="showDataTime" value="true" />
<arg key ="level" value="ALL" />
<arg key ="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:SSS" />
</logFactoryAdapter>
</logging>
</iBATIS>
<!-- This section contains the log4net configuration settings -->
<log4net>
<!-- Define some output appenders -->
<appendername="RollingLogFileAppender"type="log4net.Appender.RollingFileAppender">
<paramname="File"value="log.txt" />
<paramname="AppendToFile"value="true" />
<paramname="MaxSizeRollBackups"value="2" />
<paramname="MaximumFileSize"value="100KB" />
<paramname="RollingStyle"value="Size" />
<paramname="StaticLogFileName"value="true" />
<layouttype="log4net.Layout.PatternLayout">
<paramname="Header"value="[Header]\r\n" />
<paramname="Footer"value="[Footer]\r\n" />
<paramname="ConversionPattern"value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<appendername="ConsoleAppender"type="log4net.Appender.ConsoleAppender">
<layouttype="log4net.Layout.PatternLayout">
<paramname="ConversionPattern"value="%d [%t] %-5p %c [%x] <%X{auth}> - %m%n" />
</layout>
</appender>
<!-- Set root logger level to ERROR and its appenders -->
<root>
<levelvalue="DEBUG" />
<appender-refref="RollingLogFileAppender" />
<appender-refref="ConsoleAppender" />
</root>
<!-- Print only messages of level DEBUG or above in the packages -->
<loggername="IBatisNet.DataMapper.Configuration.Cache.CacheModel">
<levelvalue="DEBUG" />
</logger>
<loggername="IBatisNet.DataMapper.Configuration.Statements.PreparedStatementFactory">
<levelvalue="DEBUG" />
</logger>
<loggername="IBatisNet.DataMapper.LazyLoadList">
<levelvalue="DEBUG" />
</logger>
<loggername="IBatisNet.DataAccess.DaoSession">
<levelvalue="DEBUG" />
</logger>
<loggername="IBatisNet.DataMapper.SqlMapSession">
<levelvalue="DEBUG" />
</logger>
<loggername="IBatisNet.Common.Transaction.TransactionScope">
<levelvalue="DEBUG" />
</logger>
<loggername="IBatisNet.DataAccess.Configuration.DaoProxy">
<levelvalue="DEBUG" />
</logger>
</log4net>
构建Ibatisnet基础代码
IBatisNet 基础代码包括:
1. IBatisNet 实例配置
一个典型的配置文件如下(具体配置项目的含义见后):
<?xml version="1.0" encoding="utf-8"?>
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<!-- Rem : If used via a DataAccess context, properties tag will be ignored
<properties resource="http://www.cnblogs.com/database.config"/> -->
<properties embedded="database.config, IBatisNetDemo"/>
<settings>
<setting useStatementNamespaces="${useStatementNamespaces}"/>
<setting cacheModelsEnabled="true"/>
<setting validateSqlMap="false"/>
</settings>
<!-- Optional if resource -->
<providers embedded="providers.config,IBatisNetDemo"/>
<!-- ==== SqlClient configuration ========= -->
<!-- Rem : If used via a DataAccess context, database tag will be ignored -->
<database>
<!-- Optional ( default ) -->
<provider name="sqlServer1.1"/>
<dataSource
name="iBatisNet" connectionString="data
source=localhost;database=Northwind;user id=sa;password=;connection
reset=false;connection lifetime=5; min pool size=1; max pool
size=50"/>
</database>
<sqlMaps>
<!-- user via embedded-->
<sqlMap embedded="Map.SqlClient.Person.xml,IBatisNetDemo"/>
</sqlMaps>
</sqlMapConfig>
2. PO(Plain Ordinary Object)
下面是我们用作示例的一个PO:
[Serializable]
public class Person
{
private int id;
private string firstName;
private string lastName;
private DateTime? birthDate;
private double? weightInKilograms;
private double? heightInMeters;
public Person() { }
public int Id
{
get { return id; }
set { id = value; }
}
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public DateTime? BirthDate
{
get { return birthDate; }
set { birthDate = value; }
}
public double? WeightInKilograms
{
get { return weightInKilograms; }
set { weightInKilograms = value; }
}
public double? HeightInMeters
{
get { return heightInMeters; }
set { heightInMeters = value; }
}
}
3.映射文件
与Hibernate 不同。因为需要人工编写SQL 代码,IBatisNet 的映射文件一般采
用手动编写(通过Copy/Paste,手工编写映射文件也并没想象中的麻烦)。
针对上面PO 的映射代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<alias>
<typeAlias alias="Person" type="IBatisNetDemo.Domain.Person,IBatisNetDemo" />
</alias>
<resultMaps>
<resultMap id="SelectAllResult" class="Person">
<result property="Id" column="PER_ID" />
<result property="FirstName" column="PER_FIRST_NAME" />
<result property="LastName" column="PER_LAST_NAME" />
<result property="BirthDate" column="PER_BIRTH_DATE" />
<result property="WeightInKilograms" column="PER_WEIGHT_KG" />
<result property="HeightInMeters" column="PER_HEIGHT_M" />
</resultMap>
</resultMaps>
<statements>
<select id="SelectAllPerson" resultMap="SelectAllResult">
select
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
from PERSON
</select>
<select id="SelectByPersonId" resultClass="Person" parameterClass="int">
select
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
from PERSON
where PER_ID = #value#
</select>
<insert id="InsertPerson"parameterclass="Person" >
<selectKey property="Id" type="post" resultClass="int">
${selectKey}
</selectKey>
insert into Person
( PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M)
values
(#FirstName#,#LastName#,#BirthDate#, #WeightInKilograms#, #HeightInMeters#)
</insert>
<update id="UpdatePerson"
parameterclass="Person">
<![CDATA[ update Person set
PER_FIRST_NAME =#FirstName#,
PER_LAST_NAME =#LastName#,
PER_BIRTH_DATE =#BirthDate#,
PER_WEIGHT_KG=#WeightInKilograms#,
PER_HEIGHT_M=#HeightInMeters#
where
PER_ID = #Id# ]]>
</update>
<delete id="DeletePerson" parameterclass="Person">