zoukankan      html  css  js  c++  java
  • Ibatis.Net 数据库操作学习(四)

    一、查询select

    还记得第一篇示例中是如何读出数据库里3条数据的吗?就是调用了一个QueryForList方法,从方法名就知道,查询返回列表。

    1、QueryForList  返回List<T>强类型数据集合

    来看看方法重载:

     

    从重载可以看出,其实只是3个参数不同的方法,分为泛型与非泛型两个版本而已。

    主要说说,参数skipResults,表示从结果行中跳过skipResults行后返回,maxResults表示返回的行数。这个在分页中会用到。

    下面来看一个最简单的示例:

    xml映射文件(就是之前写的那个没有改动):

      <statements>
        <select id="SelectAllPerson" resultMap="PersonModel">
          <!--id在程序中会被SqlMapper实体类所调用,resultMap就是resultMap节点的id-->
          select * from person
        </select>
      </statements>

    对DAO层稍微改造下:

    public class PersonDAO
        {
            //public IList<PersonModel> GetList()
            //{
            //    ISqlMapper mapper = Mapper.Instance();
            //    //DomSqlMapBuilder builder = new DomSqlMapBuilder();
            //    //ISqlMapper mapper = builder.Configure(@"D:SqlMap.config");
            //    IList<PersonModel> ListPerson = mapper.QueryForList<PersonModel>("SelectAllPerson", null);//这个"SelectAllPerson"就是xml映射文件的Id
            //    return ListPerson;
            //}
    
            ISqlMapper mapper = MapperHelper.Instance();//通过MapperHelper获得SqlMapper实例
    
            public IList<PersonModel> GetList(int skipResults, int maxResults)
            {
                IList<PersonModel> ListPerson = mapper.QueryForList<PersonModel>("SelectAllPerson", null, skipResults, maxResults);//这个"SelectAllPerson"就是xml映射文件的Id
                return ListPerson;
            }
        }

    Main方法:

    static void Main(string[] args)
            {
                PersonDAO dao = new PersonDAO();
                IList<PersonModel> listPerson = dao.GetList(1,10);//跳过1条取最多10条
                foreach (PersonModel p in listPerson)
                {
                    Console.WriteLine(p.PersonId +" - "+ p.PersonName);
                }
    
                Console.ReadKey();
            }

    跳过了第一条数据“刘备”,查询出2条(数据库只有3条记录)。

    2、QueryForObject  返回一行数据,对应程序的实体类实例

    xml映射文件:

      <select id="SelectOnePerson" resultMap="PersonModel">
          <!--其中#Id就是传入的参数-->
          select * from person where Id = #Id#      
        </select>

    DAO层:

    public PersonModel SelectOnePerson(int id)
            {
                PersonModel p = mapper.QueryForObject<PersonModel>("SelectOnePerson", 1);//1就是传入Sql语句的参数
                return p;
            }
    static void Main(string[] args)
            {
                PersonDAO dao = new PersonDAO();
    
                PersonModel person = dao.SelectOnePerson(3);
                Console.WriteLine(person.PersonId + " - " + person.PersonName);
                Console.ReadKey();
            }

    3、QueryWithRowDelegate  通过委托过滤返回的数据

    4、QueryForDictionary

    5、QueryForMap

    二、Insert

    xml映射文件:

     <insert id="InsertOne" resultMap="PersonModel">
           insert into person(Name) values(#PersonName#)
          <selectKey type="post" resultClass="int" property="PersonId">
            SELECT @@IDENTITY
          </selectKey>        
        </insert>

    selectKey可以获取到插入记录的Id。

     selectKey有3个主要的属性: 
        1)resultClass:返回主键的数据类型
        2)type:表示主键在insert之前或之后生成(取决于数据库的主键生成策略),取值分别为[pre|post],非必须,未填写时如果在insert之前表示pre,否则表示post
        2)property:返回值保存到的属性,非必须

    DAO层:

     public int InsertOne(PersonModel p)
            {
                return (int)mapper.Insert("InsertOne", p);//插入一条数据,返回主键Id
            }
    static void Main(string[] args)
            {
                PersonDAO dao = new PersonDAO();
    
                PersonModel personModel = new PersonModel();
                personModel.PersonName = "曹操";
                personModel.PersonId = 0;
                int res = dao.InsertOne(personModel);
                if (res > 0)
                {
                    Console.WriteLine("插入成功,Id为" + res);
                }
                Console.ReadKey();
            }

    三、Update

    xml映射文件:

     <update id="UpdateOne" resultMap="PersonModel">
          update person set Name = #PersonName# Where Id = #PersonId#
        </update>

    DAO层:

     public int UpdateOne(PersonModel p)
            {
                return (int)mapper.Update("UpdateOne", p);
            }
    static void Main(string[] args)
            {
                PersonDAO dao = new PersonDAO();
    
                PersonModel personModel = new PersonModel();
                personModel.PersonId = 10;
                personModel.PersonName = "张三";
                int res = dao.UpdateOne(personModel);
                if (res > 0)
                {
                    Console.WriteLine("修改成功");
                }
                Console.ReadKey();
            }

    四、Delete

    xml映射文件:

      <delete id="DeleteOne" resultMap="PersonModel">
          Delete Person Where Id = #PersonId#
        </delete>

    DAO层:

     public int UpdateOne(PersonModel p)
            {
                return (int)mapper.Delete("DeleteOne", p);
            }
            public int UpdateOne(int id)
            {
                return (int)mapper.Delete("DeleteOne", id);
            }
    static void Main(string[] args)
            {
                PersonDAO dao = new PersonDAO();
    
                PersonModel personModel = new PersonModel();
                personModel.PersonId = 10;
                personModel.PersonName = "张三";
                int res = dao.UpdateOne(personModel);
                //int res = dao.UpdateOne(10);//这样也可以
                if (res > 0)
                {
                    Console.WriteLine("删除成功");
                }
                Console.ReadKey();
            }

    Ibatis.Net事务处理 

    BeginTransaction(); CommitTransaction(); RollBackTransaction();这里就不详细介绍了。

    提供一个封装的方法:

            /// <summary>
            /// 执行事务
            /// </summary>
            /// <param name="fun"></param>
            /// <returns></returns>
            public bool DoTransaction(Func<bool> fun)
            {
                Instance().BeginTransaction();
                try
                {
                    bool result = fun();
                    if (result)
                    {
                        Instance().CommitTransaction();
                    }
                    else
                    {
                        Instance().RollBackTransaction();
                    }
                    return result;
                }
                catch (Exception ex)
                {
                    Instance().RollBackTransaction();
                    throw;
                }
                finally
                {
                }
            }

    参考:http://www.cnblogs.com/caoyc/category/873268.html

  • 相关阅读:
    ubuntu+VS code+launch.json+task.json
    C++——运行时类型识别RTTI
    C++——模板
    C++——class类和struct结构体的唯一区别
    C++——右值引用
    C++——智能指针
    身份证号码格式检测
    PHP获取图片主题颜色
    PHP 压缩图片质量
    redis3.2装完后 其它机子访问爆protocol error, got 'n' as reply type byte
  • 原文地址:https://www.cnblogs.com/vanblog/p/8692617.html
Copyright © 2011-2022 走看看