개발 이야기/DB2012. 4. 27. 15:52

Declare @EndDate Varchar(8)

SET @EndDate = '20120401'

SELECT CONVERT(Datetime, @EndDate), DATEADD(D, 1, @EndDate)


조회결과


묵시적 형변환을 할 경우 시간이 00:00:00 이다.

BETWEEN 문에서는 하루를 더해서 조회하자.

WHERE @TargetDate BETWEEN StartDate AND DATEADD(D, 1, EndDate)



Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:40

동영상 참고 자료

l  [ORM Framework 동영상 강좌] 01. Entity Framework 들어가기

l  [ORM Framework 동영상 강좌] 02. Entity Framework 4.0 기능 살펴보기

l  [ORM Framework 동영상 강좌] 03. LINQ 알고가자

l  [ORM Framework 동영상 강좌] 04. Database-First VS Model-First

l  [ORM Framework 동영상 강좌] 05. Entity Framework Context

l  [ORM Framework 동영상 강좌] 06. Entity Framework - Entity CRUD

l  [ORM Framework 동영상 강좌] 07. Entity Framework - Entity Stored Procedure 활용(1)

l  [ORM Framework 동영상 강좌] 08. Entity Framework - Entity Stored Procedure 활용(2)

l  [ORM Framework 동영상 강좌] 09. Entity Framework – ASP.NET MVC(1)

l  [ORM Framework 동영상 강좌] 10. Entity Framework – ASP.NET MVC(2)

l  [ORM Framework 동영상 강좌] 11. Entity Framework – ASP.NET MVC(3)

l  [ORM Framework 동영상 강좌] 12. MyBatis.Net 들어가기

l  [ORM Framework 동영상 강좌] 13. MyBatis.NET 기본  환경 설정

l  [ORM Framework 동영상 강좌] 14. MyBatis.NET CRUD(1)

l  [ORM Framework 동영상 강좌] 15. MyBatis.NET CRUD(2)

l  [ORM Framework 동영상 강좌] 16. NHibernate 들어가기

l  [ORM Framework 동영상 강좌] 17. NHibernate xml 파일

l  [ORM Framework 동영상 강좌] 18. NHibernate 실전 - Object Relational Mapping

l  [ORM Framework 동영상 강좌] 19. NHibernate 실전 - CRUD(1)

l  [ORM Framework 동영상 강좌] 20. NHibernate 실전 - CRUD(2)






sqler에 올렸던 동영상을 공유합니다.


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:38

NHibernate 실전 - CRUD(2)

NHibernate CRUD 두번째 시간입니다이번에는 비지니스 로직을 부분을 어떻게 구현하는지 살펴보겠습니다. CRUD 기본만 잡고가면 그 외 확장기능은 충분히 개발 가능할 것을 확신하기에 기본에 중점을 두고 진행합니다.^^

 

조회 화면

조회하는 뷰페이지에 액션링크에 Shippers Id 키값을 설정해줍니다.

 

            @Html.ActionLink("Edit""Edit"new { id = item.ShipperID }) |

            @Html.ActionLink("Details""Details"new { id = item.ShipperID }) |

            @Html.ActionLink("Delete""Delete"new { id = item.ShipperID })

 

 

 

상세 화면

리스트에서 항목 클릭 시 이동되는 상세 화면을 구성해보겠습니다데이터의 키(id)값을 받아서 해당 데이터를 페이지에 출력하면 됩니다. Id를 인자로 받아서 ISession Get메서드를 사용하여 Shippers의 특정데이터를 조회합니다조회된 데이터는 뷰에 반환하여 페이지를 구성하게 됩니다.

 

        public ActionResult Details(int id)

        {

            ISession session = SessionProvider.Instance.GetSession();

            Shippers shipper = session.Get<Shippers>(id);

 

            return View(shipper);

        }

 

 

위의 Details 메서드가 구성되었다면 상세 뷰를 MVC 스캐폴링 옵션을 사용하여 페이지를 생성 해보겠습니다메서드에서 마우스 오른쪽을 클릭하여 뷰 추가를 선택하세요.

20_01.JPG

[그림 20-1] Controller 추가

 

화면에 매칭할 Model을 선택하고 스캐폴링 옵션에 Details로 선택합니다.

20_02.JPG

[그림 20-2] View 추가

 

추가를 하면 Detail이라는 뷰가 자동으로 생기며 뷰 코드를 보면 자동으로 데이터 상세 값이 출력되도록 구성된다실행 해보겠습니다.

20_03.JPG

[그림 20-3] 상세 화면

 

신규생성

뷰 구성은 위에 스캐폴링을 이용해서 생성해주시면 됩니다그 부분은 생략하고 실제 로직을 살펴보겠습니다데이터 추가하는 메서드입니다. Shippers 객체를 받아서 바로 처리합니다.

 

        [HttpPost]

        public ActionResult Create(Shippers shipper)

        {

            ISession session = SessionProvider.Instance.GetSession();

            ITransaction trans = null;

            try

            {

                trans = session.BeginTransaction();

                session.Save(shipper);

                session.Flush();

                trans.Commit();

                return RedirectToAction("Index");

            }

            catch

            {

                trans.Rollback();

                return View();

            }

        }

 

 

NHibernate는 자체 Transaction 처리가 가능합니다. ITransaction 객체를 사용하시면 됩니다데이터를 수정하거나 추가삭제처럼 데이터 변경이 발생하는 경우는 데이터베이스와 동기화를 위해 ISession.Flush()를 반드시 호출해줘야 합니다.

 

 

수정

다음은 수정입니다신규생성과 마찬가지로 Shippers 객체를 인자로 받아옵니다. ISession의 Merge메서드를 통해서 데이터 수정이 처리됩니다.

 

        [HttpPost]

        public ActionResult Edit(Shippers shipper)

        {

            ISession session = SessionProvider.Instance.GetSession();

            ITransaction trans = null;

            try

            {

                trans = session.BeginTransaction();

                session.Merge(shipper);

                session.Flush();

                trans.Commit();

            }

            catch

            {

                trans.Rollback();

            }

            return RedirectToAction("Index");

        }

 

 

 

삭제

마지막으로 데이터 삭제입니다. Shippers 테이블은 ShipperID Identity로 가지고 있기때문에 id를 인자로 받아와서 처리합니다.처리 후에 리스트화면으로 이동합니다데이터 삭제 시에는 ISession의 Delete 메서드를 이용합니다.

 

        public ActionResult Delete(int id)

        {

            ISession session = SessionProvider.Instance.GetSession();

            Shippers shipper = session.Get<Shippers>(id);

 

            ITransaction trans = null;

            try

            {

                trans = session.BeginTransaction();

                session.Delete(shipper);

                session.Flush();

                trans.Commit();

                return RedirectToAction("Index");

            }

            catch

            {

                trans.Rollback();

                return View();

            }

        }

 

 

실제로 화면 하나하나 캡처하면 내용이 길어져서 소스코드면 소개를 해드렸습니다소스를 첨부해드릴테니 받아서 한번씩 실행해보면 더 쉽게 이해되시리라 생각합니다. NHibernate는 견고하고 데이터 처리에 필요한 기본적인 기능들을 제공하고 있습니다. (트랜잭션 처리같은… ) Table과 Object의 매핑이라는 점이 핵심이라고 볼 수 있겠네요이렇게 잛게 기본적인 NHibernate 활용편을 살펴보았습니다읽어주셔서 감사합니다.^^

 

소스코드 : NHibernateDemo.zip



sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/402666



Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:37

NHibernate 실전 - CRUD(1)

MyBatis.Net 경우 쿼리의 결과를 Object로 가져온다면 NHibernate는 데이터 테이블을 Object로 가져오기때문에 앞에서 살펴봤던Entity Framework처럼 이해하면 쉬울 듯합니다이번은 앞세션에 이어서 Object 매핑 데이터를 조회하는 부분을 살펴보겠습니다.

 

NHibernate's ISession

NHibernate ISession 객체를 사용하여 데이터 저장소로 부터 원하는 데이터를 가져오겠습니다. ISessionFactory로부터ISession을 얻을 수 있다.

다음 2개의 네임스페이스를 추가해주세요.

using NHibernate;

using NHibernate.Cfg;

 

SessionProvider.cs 입니다.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using NHibernate;

using NHibernate.Cfg;

 

namespace NHibernateDemo

{

    public class SessionProvider

    {

        private ISession _session;

        private ISessionFactory _sessionFac;

        private bool _reuseSession;

 

        #region Thread-safe Singleton

 

        public static SessionProvider Instance

        {

            get

            {

                return Nested.TheSingleton;

            }

        }

 

        private SessionProvider()

        {

            // Read the configuration

            Configuration cfg = new Configuration();

            cfg.AddAssembly("NHibernateDemo");

 

            _sessionFac = cfg.BuildSessionFactory();

            _reuseSession = false;

        }

 

        private class Nested

        {

            static Nested() { }

            internal static readonly SessionProvider

                TheSingleton = new SessionProvider();

        }

 

        #endregion

 

 

        /// <summary>

        /// Should the session be reused? If

        /// this property is false (default), a Session-Per-Request

        /// is applied.

        /// </summary>

        public bool ReuseSession

        {

            get

            {

                return _reuseSession;

            }

            set

            {

                _reuseSession = value;

            }

        }

 

        /// <summary>

        /// Get the current session. If the session is null,

        /// Open a new Session

        /// </summary>

        /// <returns>ISession-Object</returns>

        public ISession GetSession()

        {

            if (_session == null)

                _session = _sessionFac.OpenSession();

 

            return _session;

 

        }

 

        /// <summary>

        /// Close a Session, if the flag ReuseSession is false

        /// </summary>

        public void CloseSession()

        {

            if (_session != null)

            {

                if (!_reuseSession)

                {

                    _session.Close();

                    _session = null;

                }

            }

        }

    }

}

 

 

 

빌드 리소스 포함

매핑 Xml 파일은 빌드 시 리소스에 포함되어야 합니다다음과 같이 설정해주세요.

19_01.JPG

[그림 19-1] xml 속성 메뉴

 

Xml 파일 속성에서 Build Action에서 리소스 포함을 선택해주세요그럼 빌드시 매핑 xml파일이 자동으로 포함됩니다.

19_02.JPG

[그림 19-2] xml 속성

 

조회 화면

~~ 기다리고 기다리던 조회화면입니다이것을 하기 위해 우린 위!~~~~ 많은것들을 설정했나봅니다ㅋㅋㅋㅋ MVC 프로젝트임으로 Controller를 하나 추가하겠습니다기본적인 메서드들을 자동 추가하겠습니다.

19_03.JPG

[그림 19-3] Controller 추가

 

ShipperController 클래스에 다음 네임스페이스를 추가해주세요.

using NHibernate;

using NHibernate.Cfg;

using NHibernateDemo.Entities;

 

리스트를 조회하는 코드를 다음과 같이 작성합니다코드를 살펴보면 SessionProvider에서 ISession을 얻어와서 CreateCriteria 메서드를 통해서 기본 Shippers 객체를 반환합니다받아온 객체를 바로 뷰에 반환해줍니다.

 

        public ActionResult Index()

        {

            IList<Shippers> list = null;

            try

            {

                ISession session = SessionProvider.Instance.GetSession();

                NHibernate.ICriteria ctiq = session.CreateCriteria(typeof(Shippers));

                list = ctiq.List<Shippers>();

            }

            catch (Exception ex)

            {

                throw;

            }

 

            return View(list);

        }

 

 

Index 뷰를 생성해보겠습니다모델 클래스를 Shippers로 설정 해주셔야 합니다.

19_04.JPG

[그림 19-4] View 추가

 

뷰에서 자동으로 리스트 코드가 작성됩니다. Shippers 클래스가 리스트에 매칭되었습니다웹 페이지를 실행해보겠습니다.

19_05.JPG

[그림 19-5] 리스트 화면 출력

 

리스트가 주~~욱 출력이 되고 있습니다그 어느때보다 기쁘네요^^ 사실 xml때문에 삽질을 한터라 ㅋㅋㅋ 따라하시느라 정신이 없을 수도 있지만 핵심은 데이터베이스의 테이블과 클래스 매핑을 xml파일에 정의되고 NHibernate Session을 통해서 실제 데이터를 조회하거나 액션을 취하게 됩니다다음 세션에서는 이번에 이어서 수정삭제신규생성 하는 비지니스 로직을 확인해보겠습니다감사합니다.^^


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/402636


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:37

NHibernate 실전 – Object Relational Mapping

벌써 18번째 세션을 진행하게 되었습니다. Entity Framework 4.0에서 MyBatis.Net 그리고 NHibernate까지 보통 ORM 프레임워크라고 불리는 것들에 대해서 살펴보았는데요이번에 알아볼 내용은 ORM!! NHibernate에서 말하는 Object Relational Mapping에 대해서 알아보겠습니다.

 

실전프로젝트 기본 구성

이번 세션부터 기본적인 사항들을 확인해서 실전으로 CRUD까지 작업을 해보겠습니다. MVC Razor 웹 프로젝트를 하나 생성해주세요. Entity Framework를 되새기면서 해주시면 됩니다.

18_01.JPG

[그림 18-1] 웹 프로젝트 추가

 

MVC 웹 프로젝트를 다음과 같이 구성하려합니다미리 참고해주세요.

18_02.JPG

[그림 18-2] 프로젝트 구성도

 

Web.config에 Database Connection 정보를 입력해주세요.

 

  <configSections>

    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>

  </configSections>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

    <session-factory name="NHibernateDemo">

      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

      <property name="connection.connection_string">

        Data Source=JISEON-PC\JISEON2;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=P@ssw0rd;

      </property>

      <property name="adonet.batch_size">10</property>

      <property name="show_sql">true</property>

      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>

      <property name="use_outer_join">true</property>

      <property name="command_timeout">60</property>

      <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>

      <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>

    </session-factory>

  </hibernate-configuration>

 

 

NHibernate 관련 DLL을 참조해주세요. NHibernate에서 다운받은 폴더에 있습니다.

l  NHibernate.dll

l  Iesi.Collections.dll

l  NHibernate.ByteCode.LinFu.dll

l LinFu.DynamicProxy.dll 

 

 

DataTable Object

NHibernate는 데이터 테이블을 기준으로 객체를 매핑합니다매핑은 xml파일에서 정의가 되어지며 앞세션에서 말했듯이<table>.hbn.xml으로 생성됩니다백마디 말보다 한번 보여드리는게 더 와닿지요~

Northwind 데이터베이스 Shippers 테이블 스키마입니다.

18_03.JPG

[그림 18-3] Shippers 테이블 구조

 

테이블 구조에 맞게 Shippers 클래스를 구성해보겠습니다.

18_04.JPG

[그림 18-4] Shippers 테이블 구조

 

Shippers 클래스입니다.

 

    public class Shippers

    {

        private int _shipperID;

        private string _companyName;

        private string _phone;

 

        public Shippers()

        {

        }

 

        public virtual int ShipperID

        {

            get { return _shipperID; }

            set { _shipperID = value; }

        }

 

        public virtual string CompanyName

        {

            get { return _companyName; }

            set { _companyName = value; }

        }

 

        public virtual string Phone

        {

            get { return _phone; }

            set { _phone = value; }

        }

    }

 

 

Database의 테이블과 객체 매핑을 해주는 아래 정의된 xml파일입니다파일명은 테이블명을 앞에두고 뒤에 hbn.xml로 설정하면 됩니다“Shippers.hbm.xml”

 

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

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernateDemo"assembly="NHibernateDemo">

 

  <class name="NHibernateDemo.Entities.Shippers" table="Shippers">

    <id name="ShipperID" column="ShipperID" type="Int32" unsaved-value="-1" access="field.camelcase-underscore">

      <generator class="identity" />

    </id>

    <property name="CompanyName" column="CompanyName" type="string" length="40" not-null="true"access="field.camelcase-underscore"/>

    <property name="Phone" column="Phone" type="string" length="24" access="field.camelcase-underscore"/>

 

  </class>

</hibernate-mapping>

 

 

 

Tip!

Visual Studio에 익숙한 여러분은 실제로 위에 xml파일들을 수동으로 설저아는게 결코 쉬운일은 아닐겁니다저 역시도 xml설정하는데 대소문자며 공백등으로 어려움이 있었고요 ㅋㅋㅋ NHibernate에서 다운받은 파일 중에 Required_Bins 폴더에 xsd 스키마 파일이 존재합니다.

 

Visual Studio 2010에서 XML 메뉴를 클릭합니다. Schemas.. 하위 메뉴를 클릭해서 위에서 봤던 스키마 파일을 추가하겠습니다.

18_05.JPG

[그림 18-5] XML 메뉴

 

2개 다 추가해주세요!

18_06.JPG

[그림 18-6] NHibernate에서 제공하는 스키마

 

로드된 xsd 파일을 인텔리센스에 적용합니다.

18_07.JPG 

[그림 18-7] XML Schemas

 

이제 xml 파일에서 문자를 입력하면 아래와 같이 인텔리센스 기능이 바로 사용됩니다. 후훗~

18_08.JPG 

[그림 18-8] XML Intellisense

 

이번 세션에서는 기본 프로젝트를 생성하고 Shippers 객체를 매핑해보았습니다다음 시간은 이 객체를 가져다 쓰는 방법에 대해서 알아보겠습니다끝까지 읽어주셔서 감사합니다.^^


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/402604

Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:36

NHibernate xml 파일

NHibernate ORM으로 XML에서 설정을 한다오늘은 NHibernate 프로젝트 관련하여 포함된 Config 파일 및 객체 정의하는xml파일들을 살펴보고자한다지난 세션에서 소개한 NHibernate 사이트에서 NH3.1.0 다운로드르 받으면 xml 파일 템플릿이 제공되고 있다.

 

Configuration_Templates

다운받은 파일의 \NHibernate-3.1.0.GA-bin\Configuration_Templates 폴더에 Database 설정 관련 xml이 존재한다.

17_01.jpg

[그림 17-1] Database 정의 xml

 

MSSQL.cfg.xml 파일을 열어보자. MS SQL Server 연결관련 정보가 설정되어 있다우리는 여기 정보를 프로젝트 app.config web.config에 정의하게 될 것이다.

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

<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="adonet.batch_size">10</property>

                           <property name="show_sql">false</property>

                           <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>

                           <property name="use_outer_join">true</property>

                           <property name="command_timeout">60</property>

                           <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>

                           <propertyname="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>

             </session-factory>

</hibernate-configuration>   

 

 

<table>.hbm.xml 정의

NHibernate는 테이블 기준으로 매핑을 합니다하여 테이블마다 xml 파일이 존재한다고 보시면 됩니다샘플로 하나 살펴보겠습니다구조만 확인을 해주세요저희가 자주사용하는 Northwind 데이터베이스 Shippers 테이블을 정의해놓은 파일입니다.Shippers.hbm.xml 으로 파일이 생성됩니다클래스와 데이블간의 매핑을 시켜주는 역할입니다.

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

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernateDemo"assembly="NHibernateDemo">

  <class name="NHibernateDemo.Entities.Shippers" table="Shippers">

    <id name="ShipperID" column="ShipperID" type="Int32" unsaved-value="-1" access="field.camelcase-underscore">

      <generator class="identity" />

    </id>

    <property name="CompanyName" column="CompanyName" type="string" length="40" not-null="true"access="field.camelcase-underscore"/>

    <property name="Phone" column="Phone" type="string" length="24" access="field.camelcase-underscore"/>

 

  </class>

</hibernate-mapping>

 

 

Generators 요소

모든 generators는 NHibernate.Id.IIdentifierGenerator에서 구현됩니다.

l Increment : 다른 프로세스에서 데이터가 추가되지 않는 경우 유니크하게 사용되는 식별자로 클러스터에서는 사용을 금지합니다.

l Identity : DB2, MySQL, MS SQL Server 그리고 Sybase 데이터 베이스에서 지원하는 식별자 컬럼입니다.

l Sequence : DB2, PostgreSQL, Oracle 또는 Firebird의 generator에서 사용되는 순서입니다이 식별자는 Convert.ChangeType속성 타입을 사용하여 변환합니다.

l Hilo : hi/lo 알고리즘 사용으로 integral 타입의 식별자를 효과적으로 생성합니다. hi/lo 알고리즘은 특정 데이터베이스에서 고유 식별자를 생성하기도 합니다.

l Seqhilo : hi/lo 알고리즘을 사용하여 효과적인 integral 타입의 식별자를 생성하며 데이터베이스 순서가 명명됩니다.

l uuid.hex : System.Guid와 ToString 메서드로 문자열 타입의 식별자를 생성합니다문자열 길이는 구성 포맷에 따릅니다.

l uuid.string : 새로운 System.Guid가 문자열로 변환되는 byte[]으로 생성합니다.

l Guid : 새로운 System.Guid 식별자입니다.

l guid.comb : Jimmy Nilsson이 설명한(http://www.informit.com/articles/article.asp?p=25862) 새로운 System.Guid을 생성하는 알고리즘을 사용합니다.

l Native : 기본적인 데이터베이스의 기능에 따라 지정됩니다.

l Assigned : 응용프로그램에서 Save()이 호출되기 전에 객체 식별자를 지정합니다.

l Foreign : 다른 연관된 객체의 식별자를 사용합니다일반적으로 <one-to-one> 기본키가 사용됩니다.

 

NHibernate Type

Xml 파일 컬럼에 타입을 정의할 때 NHibernate Type으로 정의해야한다닷넷 타입과 데이터베이스 타입을 정리해놓은 것이다기본적으로 자주 사용되는 항목만 표시합니다더 자세한 항목은 NHibernate 가이드 문서에 제공되고 있습니다.

NHibernate Type

.NET Type

Database Type

AnsiChar

System.Char

Db - Type.AnsiStringFixedL ength - 1 char

Boolean

System.Boolean

DbType.Boolean

Byte

System.Byte

DbType.Byte

Char

System.Char

Db- Type.StringFixedLengt h - 1 char

DateTime

System.DateTime

DbType.DateTime – ignores the milliseconds

Decimal

System.Decimal

DbType.Decimal

Double

System.Double

DbType.Double

Guid

System.Guid

DbType.Guid

Int16

System.Int16

DbType.Int16

Int32

System.Int32

DbType.Int32

Int64

System.Int64

DbType.Int64

PersistentEnum

System.Enum

The DbType for the underlying value.

Single

System.Single

DbType.Single

Ticks

System.DateTime

DbType.Int64

TimeSpan

System.TimeSpan

DbType.Int64

NHibernate 경우 선수지식이 필요한 프레임워크입니다이번 세션에서는 기본적으로 알아둬야하는 사항을 몇가지 정리하였습니다작업을 하시다가 필요할때마다 참고하시면 좋을것 같습니다.^^


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/402212


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:36

NHibernate 들어가기

오픈소스 ORM 프레임워크에서 손에 꼽히는 Hibernate 프레임워크에 대해서 알아보려 합니다. NHibernate는 Hibernate 닷넷 버전으로 NHibernate 경우 다양한 DBMS를 지원함으로 많은 프로젝트에서 ORM 프레임워크로 활용 되고 있습니다.

 

NHibernate 소개

NHibernate 공식 사이트 http://nhforge.org

메인 화면에서 관련 파일을 다운로드 받을 수 있습니다. NHibernate 3.1.0까지 릴리즈 되었네요!

16_01.JPG

[그림 16-1] NHibernate 공식 사이트

 

NHibernate Overview

NHibernate는 매우 높은 수준의 아키텍처입니다응용프로그램과 NHibernate사이에 영속 객체(Persistent Objects) Entity Framework 4.0에서 추가된 영속성을 지원하기 위한 객체입니다객체와 데이터베이스 테이블 간의 매핑을 XML로 관리합니다.

16_02.jpg

[그림 16-2] NHibernate 아키텍처

 

좀 더 구체적으로 살펴보겠습니다.

16_03.jpg

[그림 16-3] NHibernate Layer

 

ISessionFactory (NHibernate.ISessionFactory)

threadsafe 캐시로 단일 데이터베이스를 사용하는 경우 컴파일된 매핑을 캐시하여 사용가능하면 ISessionIConnectionProvider의 클라이언트를 위한 factory입니다.

 

ISession (NHibernate.ISession)

ISession을 통해서 단일 스레드는 응용프로그램과 영속 저장소 사이에서 존재하게 됩니다. ADO.NET Connecttion을 랩핑하고ITransaction을 위한 factory로 보시면 됩니다.

 

Persistent Objects and Collections

영속성 상태나 비지니스 함수를 포함하는 단일 스레드 객체로 짧게 살아있는 객체를 담고 있다이는 세션이 닫히면 응용프로그램 레이어에서 분리되어 자유롭게 가능합니다.

 

Transient Objects and Collections

ISession과 관련되지않는 영속 클래스의 인스턴스를 말한다.

 

ITransaction (NHibernate.ITransaction)

선택사항이며 ADO.NET transaction 밑에서 사용됩니다. ISession는 몇몇 상황에서 ITransactions을 걸치게 됩니다.

 

IConnectionProvider (NHibernate.Connection.IConnectionProvider)

이 또한 선택사항이며 ADO.NET의 connection과 command를 위한 factory입니다응용프로그램에 노출되지않지만 개발자에 의해 확장 구현 가능합니다.

 

IDriver (NHibernate.Driver.IDriver)

선택사항이며 ADO.NET provider 사이에서 캡슐화 인터페이스를 제공합니다.

 

ITransactionFactory (NHibernate.Transaction.ITransactionFactory)

선택사항이며 ITransaction 인스턴스를 위한 factory입니다. IConnectionProvider와 마찬가지로 응용프로그램에 노출되지않지만 개발자에 의해 확장 구현 가능합니다.

 


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/401779

Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:35

MyBatis.NET CRUD(2)

MyBatis.NET Mapper를 이용한 조회를 앞세션에서 진행했습니다추가로 신규생성수정삭제를 진행해보겠습니다.

 

데이터 수정

Shippers.xml statement를 다음과 같이 정의해주세요. Shippers 테이블 업데이트 구문입니다.

 

<update id="UpdateShippers" parameterClass="Shippers">

        UPDATE [Shippers]

        SET CompanyName = #CompanyName#, Phone = #Phone#

        WHERE ShipperID = #ShipperID#

</update>

              

 

수정 버튼을 클릭했을때 Mapper클래스를 이용해서 Update메서드에 위에서 정의한 UpdateShippers ststement명을 작성해줍니다이렇게 되면 Mapper클래스는 ststement명을 찾아 해당 쿼리를 DB에 던지게 되죠~

 

        private void btnUpdate_Click(object sender, EventArgs e)

        {

            try

            {

                Shippers shipper = new Shippers();

                shipper.ShipperID = 4;

                shipper.CompanyName = "SM Company";

                shipper.Phone = "(02)0000-4444";

                Mapper.Instance().Update("UpdateShippers", shipper);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.ToString());

            }

        }

              

 

15_01.JPG

[그림 15-1] 수정 결과 화면

 

데이터 신규생성

데이터 신규생성 작업입니다. Shippers.xml insert statement를 작성해주시고요.

 

<insert id="InsertShippers" parameterClass="Shippers">

        INSERT INTO [Shippers](CompanyName, Phone)

        VALUES (#CompanyName#, #Phone#)

        <selectKey type="post" resultClass="int" property="ShipperID">

               select @@IDENTITY as value

        </selectKey>

</insert>

 

 

코드에서 다음과 같이 호출해주세요.

 

        private void btnInsert_Click(object sender, EventArgs e)

        {

            try

            {

                Shippers shipper = new Shippers();

                shipper.CompanyName = "JS Company";

                shipper.Phone = "(02)1212-4444";

                object obj = Mapper.Instance().Insert("InsertShippers", shipper);

                MessageBox.Show(obj.ToString());

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.ToString());

            }

        }

              

 

  15_02.JPG

[그림 15-2] 추가 후 결과 화면

 

데이터 삭제

마지막으로 데이터 삭제입니다. Shippers.xml에 delete statement가 필요하겠죠다음과 같이 작성해주세요.

 

<delete id="DeleteShippers" parameterClass="Shippers">

        DELETE FROM [Shippers]

        WHERE ShipperID = #ShipperID#

</delete>

 

 

코드는 다음과 같이 삭제메서드를 호출해주시면 됩니다유후~훗 그럼 실행해서 확인해볼까요?

 

        private void btnDelete_Click(object sender, EventArgs e)

        {

            try

            {

                Shippers shipper = new Shippers();

                shipper.ShipperID = 4;

                Mapper.Instance().Delete("DeleteShippers", shipper);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.ToString());

            }

        }

              

 

요청한 4번 항목이 사라졌네요^^ 끝까지 따라해주시느라 수고많으셨습니다.!!!!

15_03.JPG

[그림 15-3] 삭제 후 결과 화면

 

MyBatis.NET의 장점은?

ORM하면 대표적을 생각하는 프레임워크 중에 하나인 MyBatis.NET 실제로 작업을 해보니 xml파일을 핸들링하는 것과 중간에Mapper를 통해서 데이터 결과를 받아오는 등의 작업이 귀찮지않다고 한다면 거짓말 일 것이다그럼에도 불구하고 사랑을 받고 있는 MyBatis.NET의 장점은 무엇이 있을까요레거시 시스템 경우 기존 데이터베이스 연동을 해야하는 경우에 중간 매퍼를 통해서 처리함으로 관리 측면의 용이성이 있습니다또한 파일로 관리되기때문에 실제 로직 실행시에 파일을 읽어와서 처리하게 됩니다 그러기에 파일을 얼마든지 수정가능하겠죠?! 결국은 코드에 쿼리문이 작성되지않고 별도로 관리된다는 측면에서 많은 이점을 가질 수 있을듯합니다더 많은 장점은 여러분이 사용해보면서 느끼는 점을 같이 이야기 해볼 수 있으면 좋겠습니다.^^ 감사합니다.

소스코드 : EF4.14.zip 



sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/401750

Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:35

MyBatis.NET CRUD(1)

MyBatis.NET의 아주 기본적인 작업에 대해서 살펴보려합니다.^^ 프로젝트를 생성하고 데이터를 조회하는데 객체 매핑을 어떻게 하는지 확인 하실 수 있습니다실전으로 고고!!!

 

프로젝트 생성

우선 간단한 CRUD를 확인하는 작업이기에 응용프로그램을 다음과 같이 디자인 해보겠습니다.

14_01.jpg

[그림 14-1] UI 구성

 

초기 작업

Data Mapper작업을 위해서 초기에 설정해줘야하는 작업들이 있습니다앞세션에서 관련된 파일들을 언급했었는데요해당 파일들이 어떤 역할들을 하는지 살펴보겠습니다. MyBatis.Net 사이트에서 다운 받은 파일 중에 IBatisNet.Common.dllIBatisNet.DataMapper.dll을 해당 프로젝트에 참조해주세요.

14_02.jpg

[그림 14-2] dll 참조

 

\IBatis.DataMapper.1.6.2.bin\Ibatis.DataMapper.1.6.2.bin 폴더에 아래  config 파일이 존재합니다프로젝트에 추가해주세요새로 만들어도 되지만 xml로 작성되기때문에 오류률을 줄이기위해 가져다 편집을 하는 방법을 선택하겠습니다.

14_03.JPG

[그림 14-3] config 파일 참조

 

여기까지 진행하셨다면 다음과 같이 프로젝트가 구성됩니다.

14_04.jpg

[그림 14-4] 프로젝트 구성

 

Config 파일 설정

providers.config 파일 내용을 확인하면 많은 DBMS Provider가 정의되어 있습니다저희가 사용하는 Provider는 “sqlServer2.0”입니다다른 Provider는 enabled="false해주시고  “sqlServer2.0”는 는 enabled="true" 설정해주세요.

<provider name="OleDb1.1"

          description="OleDb, provider V1.0.5000.0 in framework .NET V1.1"

          enabled="true"

          assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

    connectionClass="System.Data.OleDb.OleDbConnection"

          commandClass="System.Data.OleDb.OleDbCommand"

          parameterClass="System.Data.OleDb.OleDbParameter"

          parameterDbTypeClass="System.Data.OleDb.OleDbType"

          parameterDbTypeProperty="OleDbType"

          dataAdapterClass="System.Data.OleDb.OleDbDataAdapter"

          commandBuilderClass="System.Data.OleDb.OleDbCommandBuilder"

          usePositionalParameters="true"

          useParameterPrefixInSql="false"

          useParameterPrefixInParameter="false"

          parameterPrefix=""

    allowMARS="false"   

    />

 

 

다음은 SqlMap.config 파일입니다데이터베이스 연결 영역에 다음과 같이 DB 연결설정을 해주세요수동으로 작업하고있자니 기존에 자동생성했던 기억에 서글퍼지네요 ㅠㅠ.

        <!-- Database connection information -->

        <database>

               <provider name="sqlServer2.0"/>

               <dataSource name="Northwind" connectionString="Data Source=JISEON;Initial Catalog=Northwind;Integrated Security=True;"/>

        </database>

 

 

데이터 조회

기본 설정이 마무리 되었으니 이제부터 데이터를 한번 조회해보겠습니다. MyBatis는 쿼리와 결과 데이터의 매퍼 역할을 하는 프레임워크입니다그래서 단순히 매퍼 역할만하게되는데요그 부분을 xml로 정의합니다. Northwind 데이터베이스에서 Shippers테이블을 조회할건데요프로젝트에 매퍼 역할을 하는 Shippers.xml 파일을 생성해주세요또한 응용프로그램에서 용이하게 사용하는 Shippers의 엔티티를 Shippers.cs로 구성해보겠습니다.

Shippers.cs는 다음과 같이 작성해주세요.

 

    public class Shippers

    {

        public int ShipperID { getset; }

        public string CompanyName { getset; }

        public string Phone { getset; }

    }

 

 

다음은 Shippers.xml 내용을 확인해보죠!! Select statement를 다음과 같이 작성해주면 됩니다.

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

 

<sqlMap namespace="EF4._14" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://ibatis.apache.org/mapping">

 

        <alias>

               <typeAlias alias="Shippers"  type="EF4._14.Shippers" />

        </alias>

 

       <statements>

             <select id="SelectShippers"  resultClass="Shippers">

                    select * from Shippers

             </select>

       </statements>

 

</sqlMap>

 

 

UI에 다음 네임스페이스를 추가해주시고요.

 

using IBatisNet.Common;

using IBatisNet.DataMapper;

 

 

조회 버튼을 클릭해서 데이터를 조회해보겠습니다. Mapper 객체를 통해서 데이터를 조회하여 결과값을 리턴합니다.

 

        private void btnSelect_Click(object sender, EventArgs e)

        {

            try

            {

                IList<Shippers> list = Mapper.Instance().QueryForList<Shippers>("SelectShippers"null);

                dataGridView1.DataSource = list;

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.ToString());

            }

        }

 

 

조회된 화면입니다조회를 한번하기위해 긴여정을 걸쳤습니다그래도 MyBatis를 사용하는 장점이 뭔가 있겠죠?! 다음편에서 그 진실을 파헤져보겠습니다.

14_05.jpg

[그림 14-5] 조회 결과 화면

 

Tip!

-       배포시 Bin 폴더에 config 파일과 xml파일이 같이 반영되어야 합니다.



sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/401728



Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:34

MyBatis.NET 기본 및 환경 설정

지난 세션에서 MyBatis.NET에 대해서 기본 그림을 확인 보았습니다아직 MyBatis라는 단어가 입에 붙지는 않네요ㅋㅋㅋiBatis라는 단어가 익숙해서 그런가봐요~ MyBatis.NET은 Data Mapper Framework로 실제 결과 데이터를 매핑해줍니다이번 세션은 기본 환경 설정하는 부분을 알아보겠습니다고고씽~~

 

MyBatis.NET

1.     프로그래밍 코드로부터 SQL 코드를 분리합니다.

2.     입력 파라메터를 라이브러리 클래스로 전달하고 출력을 합니다.

3.     비지니스 로직 클래스로부터 데이터 액세스 클래스를 분리합니다.

4.     자주 사용되는 데이터를 캐싱합니다.

5.     트랜잭션과 스레딩 관리가 가능합니다.

 

MyBatis.NET 관련 소스

MyBatis.NET 프로젝트 관련 DLL은 다음 링크에서 다운 받을 수 있습니다.

mybatis.net data mapper 다운로드

l Download the Data Mapper for .NET

mybatis.net data access framework 다운로드

l Download the Data Access Framework

 

 

프로젝트 참조 파일

1.      IBatisNet.Common.dll
DataAccess와 DataMapper 클래스에서 공유되는 공용 클래스들입니다.

 

2.      IBatisNet.DataMapper.dll
DataMapper 프레임워크로 실제 객체 매핑과 결과값 반환시 사용되는 객체들입니다.

 

3.      IBatisNet. DataAccess.dll
DataAccess 객체 프레임워크로 DAO 작업시 사용됩니다.

 

4.      providers.config

MyBatis에서 지원하는 Database Provider들을 정의 해놓은 파일입니다저희는 .NET에서 자주 사용되는 MS SQL Server를 사용하기에 sqlServer2.0” Provider를 사용하게 됩니다..

Provider

Provider Description

sqlServer1.0

Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.0

sqlServer1.1

Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.1

OleDb1.1

OleDb provider available with .NET Framework 1.1

Odbc1.1

Odbc provider available with .NET Framework 1.1

sqlServer2.0

Microsoft SQL Server 7.0/2000/2005 provider available with .NET Framework 2.0

OleDb2.0

OleDb provider available with .NET Framework 2.0

Odbc2.0

Odbc provider available with .NET Framework 2.0

oracle9.2

Oracle provider V9.2.0.401

oracle10.1

Oracle provider V10.1.0.301

oracleClient1.0

MS Oracle provider V1.0.5 available with .NET Framework 1.1

ByteFx

ByteFx MySQL provider V0.7.6.15073

MySql

MySQL provider V1.0.4.20163

SQLite3

SQLite.NET provider V0.21.1869.3794

Firebird1.7

Firebird SQL .NET provider V1.7.0.33200

PostgreSql0.7

Npgsql provider V0.7.0.0

iDb2.10

IBM DB2 iSeries provider V10.0.0.0

 

5.      SqlMap.config

DataMapper 설정 파일입니다해당 파일에는 연결 대상인 Database 기본 정보나 객체 매핑이 정의된 xml파일 링크 정보를 정의해주는 파일입니다. <sqlMaps> 요소 영역을 저희가 자주 편집하게 될겁니다.! 이것만 기억해주세요.
13_01.jpg

[그림13-1] sqlMap.confog sqlMaps 요소

 

MyBatis.NET DLL형태로 제공되기 때문에 환경 설정하는데 어려움이 없습니다프로젝트 실전을 통해서 작업을 해보시면 생각보다 진입하기가 쉽다는 것을 느낄 수 있습니다다음 세션에 작업할 때 위에서 언급된 항목들이 사용 될 겁니다. XML에서 작업이 이뤄지기때문에 헷갈릴수도 있지만 오늘 언급한 항목들에 대한 인지만 가지고 있으면 쉽게 따라 올 수 있다는거~~~ 잊지마세요!


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/401700

Posted by 사나에