天天看點

spring.net實作通路資料庫,對表增、删、改、查支援事務攔截

作者:海闊憑魚躍,天高任鳥飛!

搜尋了很多資料終于把spring.net 對oracle的操作實作(winform),并且事務的控制很好。在這裡把源碼貼出來,友善大家。

spring.net 版本為1.3.1

1:項目引用元件:

其中common.loggin.dll為必要的元件,因為spring.net的相關日志輸入都是基于該元件

2:項目結構

實作簡單的層級entity、dao、biz、impl、service

3:配置檔案

//app.config 檔案

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

<sectionGroup name="spring">

<section name="context" type="Spring.Context.Support.ContextHandler,Spring.Core"/>

<section name="objects" type="Spring.Context.Support.DefaultSectionHandler,Spring.Core" />

<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>

</sectionGroup>

</configSections>

<startup>

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />

</startup>

<!--Spring.Net節點配置-->

<spring>

<parsers>

<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>

<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>

</parsers>

<context>

<!--容器配置-->

<resource uri="config://spring/objects"/>

<!--注入spring配置-->

<resource uri="~/config/Objects.xml"/>

</context>

<!--必要的-->

<objects xmlns="http://www.springframework.net"></objects>

</spring>

</configuration>

//Objects.xml 此檔案和app.config檔案配置的注入檔案名稱保持一緻

<?xml version="1.0" encoding="utf-8" ?>

<objects xmlns="http://www.springframework.net"

xmlns:aop = "http://www.springframework.net/aop"

xmlns:db="http://www.springframework.net/database"

xmlns:tx="http://www.springframework.net/tx">

<!--spring.net的事務管理器 但是要用到spring.net自身dao實作-->

<!--<db:provider id="dbProvider"

provider="System.Data.SqlClient"

connectionString="server=資料庫位址;database=LeHuoTest;user id=sa;password=Lh123$%^;Pooling=true;Min Pool Size=10;Max Pool Size=50;Connection Lifetime=30;Connection Timeout=30;"/>-->

<!--spring.net通路oracle的配置方法 -->

<db:provider id="dbProviderOracle"

provider="System.Data.OracleClient"

connectionString="Data Source=資料庫位址/ORCL;User ID=cvnx2;Password=thinkpad#$#;"/>

<!-- 注入連接配接 -->

<object id="adoTemplate" type="Spring.Data.Core.AdoTemplate, Spring.Data">

<property name="DbProvider" ref="dbProviderOracle"/>

<property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>

</object>

<!--dao 注入-->

<object id="StudentDao" type="springAdoStudyDao.StudentDao,springAdoStudyDao">

<!--注入 AdoTemplate,名稱必須為AdoTemplate,不能改變-->

<property name="AdoTemplate" ref="adoTemplate" />

</object>

<!--impl 注入-->

<object id="StudentImpl" type="springAdoBiz.StudentImpl,springAdoBiz">

<!--name屬性為 StudentImpl的屬性,必須和StudentImpl類下面的屬性保持一緻, ref為應用注入-->

<property name="StudentDao" ref="StudentDao"></property>

</object>

<!--service 注入-->

<object id="StudentService" type="springAdoStudyService.StudentService,springAdoStudyService">

<!--name屬性為 StudentService的屬性,必須和StudentService類下面的屬性保持一緻, ref為應用注入-->

<property name="StudentImpl" ref="StudentImpl"></property>

</object>

<!--事務管理器-->

<object id="transactionManager"

type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data">

<property name="DbProvider" ref="dbProviderOracle"/>

</object>

<!--自定義驅動方式(根據方法的名字判斷事務的類型——oracle)-->

<tx:advice id="txAdviceOracle" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="*" no-rollback-for="ErrorException" rollback-for="BussinessException" isolation="ReadCommitted" timeout="120" />

</tx:attributes>

</tx:advice>

<!--事務切面-->

<tx:attribute-driven/>

</objects>

4:dao通路類

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Spring.Data.Core;//使用此引用

using System.Data;

using springAdoStudyEntity;

using Spring.Data.Common;

using springAdoStudyDao.utils;

namespace springAdoStudyDao

{

/// <summary>

/// 設定參數oracle為特殊符号: sqlserver是@符号

/// </summary>

public class StudentDao : AdoDaoSupport

{

/// <summary>

/// 建立student表

/// </summary>

public void AddStudentTable()

{

StringBuilder sb = new StringBuilder();

sb.Append("CREATE TABLE Student(");

sb.Append(" id NUMBER(14) NOT NULL,");

sb.Append(" name VARCHAR2(20) NOT NULL,");

sb.Append(" age INT NOT NULL,");

sb.Append(" sex VARCHAR2(2) NOT NULL,");

sb.Append(" mobile VARCHAR2(14) NOT NULL,");

sb.Append(" address VARCHAR2(100) NOT NULL");

sb.Append(" )");

AdoTemplate.ExecuteNonQuery(CommandType.Text, sb.ToString());

}

/// <summary>

/// * 新增學生

/// </summary>

/// <param name="studentObj">學生資訊</param>

/// <returns>插入成功或者失敗</returns>

public bool AddStudent(StudentEntity studentObj)

{

StringBuilder sql = new StringBuilder();

sql.Append("INSERT INTO STUDENT (ID, NAME, AGE, SEX, MOBILE, ADDRESS)");

sql.Append(" VALUES (:ID, :NAME, :AGE, :SEX, :MOBILE, :ADDRESS)");

IDbParameters p = CreateDbParameters();

p.Add(":ID", DbType.Int64).Value = studentObj.Id;

p.Add(":NAME", DbType.String, 20).Value = studentObj.Name;

p.Add(":AGE", DbType.Int32).Value = studentObj.Age;

p.Add(":SEX", DbType.String, 2).Value = studentObj.Sex;

p.Add(":MOBILE", DbType.String, 14).Value = studentObj.Mobile;

p.Add(":ADDRESS", DbType.String, 100).Value = studentObj.Address;

return AdoTemplate.ExecuteNonQuery(CommandType.Text, sql.ToString(), p) > 0;

}

/// <summary>

/// 修改學生資訊

/// </summary>

/// <param name="studentObj">學生資訊</param>

/// <returns>修改成功或者失敗</returns>

public bool UpdateStudent(StudentEntity studentObj)

{

StringBuilder sql = new StringBuilder();

sql.Append("UPDATE STUDENT a SET a.NAME=:NAME,A.AGE=:AGE,A.SEX=:SEX,A.MOBILE=:MOBILE,A.ADDRESS=:ADDRESS WHERE A.ID=:ID");

IDbParameters p = CreateDbParameters();

p.Add(":ID", DbType.Int64).Value = studentObj.Id;

p.Add(":NAME", DbType.String, 20).Value = studentObj.Name;

p.Add(":AGE", DbType.Int32).Value = studentObj.Age;

p.Add(":SEX", DbType.String, 2).Value = studentObj.Sex;

p.Add(":MOBILE", DbType.String, 14).Value = studentObj.Mobile;

p.Add(":ADDRESS", DbType.String, 100).Value = studentObj.Address;

return AdoTemplate.ExecuteNonQuery(CommandType.Text, sql.ToString(), p) > 0;

}

/// <summary>

/// 删除學生資訊

/// </summary>

/// <param name="id">學生ID</param>

/// <returns>删除成功或者失敗</returns>

public bool DelStudent(long id)

{

StringBuilder sql = new StringBuilder();

sql.Append("DELETE FROM STUDENT WHERE ID=:ID");

IDbParameters p = CreateDbParameters();

p.Add(":ID",DbType.Int64,14).Value=id;

return AdoTemplate.ExecuteNonQuery(CommandType.Text, sql.ToString(), p) > 0;

}

/// <summary>

/// 擷取單個學生資訊

/// </summary>

/// <param name="id">學生ID</param>

/// <returns>學生資訊</returns>

public StudentEntity GetStudent(long id)

{

StringBuilder sql = new StringBuilder();

sql.Append("SELECT ID, NAME, AGE, SEX, MOBILE, ADDRESS");

sql.Append(" FROM STUDENT WHERE ID=:ID and rownum=1");

IDbParameters p = CreateDbParameters();

p.Add(":ID", DbType.Int64).Value = id;

Object obj = AdoTemplate.QueryWithRowMapperDelegate(CommandType.Text, sql.ToString(), delegate(IDataReader dataRead, int rowNum)

{

StudentEntity entity = new StudentEntity();

entity.Id = dataRead.GetInt64(0);

entity.Name = dataRead.GetString(1);

entity.Age = dataRead.GetInt32(2);

entity.Sex = dataRead.GetString(3);

entity.Mobile = dataRead.GetString(4);

entity.Address = dataRead.GetString(5);

return entity;

}, p);

if(obj!=null){

IList<StudentEntity> list=DataConvertList<StudentEntity>.SpingListConvert(obj as Spring.Collections.LinkedList);

if(list!=null && list.Count>0)

return list[0];

}

return null;

}

/// <summary>

/// 擷取所有學生資訊

/// </summary>

/// <returns>學生集合</returns>

public IList<StudentEntity> GetStudentList()

{

StringBuilder sql = new StringBuilder();

sql.Append("SELECT ID, NAME, AGE, SEX, MOBILE, ADDRESS");

sql.Append(" FROM STUDENT ");

Object obj= AdoTemplate.QueryWithRowMapperDelegate(CommandType.Text, sql.ToString(), delegate(IDataReader dataRead,int rowNum)

{

StudentEntity entity = new StudentEntity();

entity.Id = dataRead.GetInt64(0);

entity.Name = dataRead.GetString(1);

entity.Age = dataRead.GetInt32(2);

entity.Sex = dataRead.GetString(3);

entity.Mobile = dataRead.GetString(4);

entity.Address = dataRead.GetString(5);

return entity;

});

return DataConvertList<StudentEntity>.SpingListConvert(obj as Spring.Collections.LinkedList);

}

}

}

5:impl層代碼

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using springAdoStudyEntity;

using springAdoStudyDao;

using springAdoBiz.checkException;

using springAdoStudyCommon;

namespace springAdoBiz

{

public class StudentImpl : IStudentBiz

{

private StudentDao StudentDao { get; set; }

/// <summary>

/// 建立student表

/// </summary>

public void AddStudentTable()

{

StudentDao.AddStudentTable();

}

/// <summary>

/// * 新增學生

/// </summary>

/// <param name="studentObj">學生資訊</param>

/// <returns>插入成功或者失敗</returns>

public bool AddStudent(StudentEntity studentObj)

{

CheckStudentException.Check(studentObj);

StudentEntity model = null;

model = StudentDao.GetStudent(studentObj.Id);

if (model != null)

throw new ErrorException("StudentImpl.AddStudent.E0001", "已存在相同的學生資訊,不允許重複添加!");

StudentDao.AddStudent(studentObj);

throw new BussinessException("StudentImpl.AddStudent.B0001", "插入已復原");

return true;

}

/// <summary>

/// 修改學生資訊

/// </summary>

/// <param name="studentObj">學生資訊</param>

/// <returns>修改成功或者失敗</returns>

public bool UpdateStudent(StudentEntity studentObj)

{

StudentEntity model = null;

model = StudentDao.GetStudent(studentObj.Id);

if (model != null)

throw new Exception("更新失敗,記錄不存在!");

return StudentDao.UpdateStudent(studentObj);

}

/// <summary>

/// 删除學生資訊

/// </summary>

/// <param name="id">學生ID</param>

/// <returns>删除成功或者失敗</returns>

public bool DelStudent(long id)

{

StudentEntity model = null;

model = StudentDao.GetStudent(id);

if (model != null)

throw new Exception("删除失敗,記錄不存在!");

return StudentDao.DelStudent(id);

}

/// <summary>

/// 擷取單個學生資訊

/// </summary>

/// <param name="id">學生ID</param>

/// <returns>學生資訊</returns>

public StudentEntity GetStudent(long id)

{

return StudentDao.GetStudent(id);

}

/// <summary>

/// 擷取所有學生資訊

/// </summary>

/// <returns>學生集合</returns>

public IList<StudentEntity> GetStudentList()

{

return StudentDao.GetStudentList();

}

}

}

6:service層代碼

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using springAdoBiz;

using springAdoStudyEntity;

using Spring.Transaction.Interceptor;

using springAdoStudyCommon;

namespace springAdoStudyService

{

//如果要使用事務,方法必須使用接口實作才能生效,否則屬性StudentImpl會注入失敗為NULL

public class StudentService:StudentServiceBiz

{

public StudentImpl StudentImpl{ get; set; }

/// <summary>

/// 建立student表

/// </summary>

public void AddStudentTable()

{

StudentImpl.AddStudentTable();

}

/// <summary>

/// * 新增學生

/// </summary>

/// <param name="studentObj">學生資訊</param>

/// <returns>插入成功或者失敗</returns>

[Transaction(NoRollbackFor=new Type[]{typeof(ErrorException)},RollbackFor=new Type[]{typeof(BussinessException)})]

public bool AddStudent(StudentEntity studentObj)

{

return StudentImpl.AddStudent(studentObj);

}

/// <summary>

/// 修改學生資訊

/// </summary>

/// <param name="studentObj">學生資訊</param>

/// <returns>修改成功或者失敗</returns>

public bool UpdateStudent(StudentEntity studentObj)

{

return StudentImpl.UpdateStudent(studentObj);

}

/// <summary>

/// 删除學生資訊

/// </summary>

/// <param name="id">學生ID</param>

/// <returns>删除成功或者失敗</returns>

public bool DelStudent(long id)

{

return StudentImpl.DelStudent(id);

}

/// <summary>

/// 擷取單個學生資訊

/// </summary>

/// <param name="id">學生ID</param>

/// <returns>學生資訊</returns>

public StudentEntity GetStudent(long id)

{

return StudentImpl.GetStudent(id);

}

/// <summary>

/// 擷取所有學生資訊

/// </summary>

/// <returns>學生集合</returns>

public IList<StudentEntity> GetStudentList()

{

return StudentImpl.GetStudentList();

}

}

}

7:測試類

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using springAdoStudyService;

using springAdoStudyEntity;

using springAdoStudyDao;

using springAdoBiz;

using Spring.Context.Support;

namespace springAdoStudyUI

{

class Program

{

static void Main(string[] args)

{

Spring.Context.IApplicationContext context = Spring.Context.Support.ContextRegistry.GetContext();

StudentServiceBiz studentService = context.GetObject("StudentService") as StudentServiceBiz;

#region 增加student表

//studentService.AddStudentTable();

#endregion

#region 加入學生資訊 (帶事務控制)

try

{

StudentEntity entity = new StudentEntity();

entity.Id = 1001;

entity.Name = "迅雷003";

entity.Age = 20;

entity.Sex = "男";

entity.Mobile = "12434354a6";

entity.Address = "廣州天河1";

studentService.AddStudent(entity);

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

#endregion

#region 擷取單個學生資訊

//StudentEntity singleEntity=studentService.GetStudent(1000);

#endregion

#region 擷取所有學生清單

//IList<StudentEntity> list = studentService.GetStudentList();

#endregion

#region 更新單個學生資訊

//StudentEntity up_entity = new StudentEntity();

//up_entity.Id = 1000;

//up_entity.Name = "迅雷002";

//up_entity.Age = 20;

//up_entity.Sex = "男";

//up_entity.Mobile = "124343545";

//up_entity.Address = "廣州天河";

//bool update_success = studentService.UpdateStudent(up_entity);

#endregion

#region 删除單個學生資訊

//bool del_success = studentService.DelStudent(1000);

#endregion

Console.Read();

}

}

}

————————————————

版權聲明:本文為CSDN部落客「會彈鋼琴的工程師」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/zhuchenchangk163/article/details/79181987