MVC 使用IBatis.net
IBatis.net在asp.net MVC下的使用
IBatis.net 是2001年发起的开源项目,它是一个轻量级的ORM框架,现在IBatisNET已经是属于Apache下的一个子项目了,最新版本是1.6.2.
.net项目下载地址:http://code.google.com/p/mybatisnet/
DataMapper:通过配置映射关系的xml业务对象与SQL语句和存储过程进行映射.
DataAcces:简单的说就是IBatis的数据访问层.
这里通过一个简单的增删改查案例 进行学习 Ibatis.net的配置和使用
一、首先需要下载Ibatis.net 的dll.上面的官网估计下载不下来,所以这儿我自己上传了一份
下载地址:
IBatis.net1.9.2&1.6.2最新版本
本项目的 Demo:
asp.net MVC和IBatis.net整合demo程序
本项目的数据库:
asp.net MVC和IBatis.net整合demo数据库部分
二、使用VS 2013新建一个解决方案。
首先使用sqlserver2014 建立数据库表
数据库:UserDemoDb
并建立相关的架构 如图所示
IBatisDemo.Dao 提供一个统一的Mapper访问接口,
IBatisDemo.Model 数据实体
IBatisDemo.Service 数据操作
因为是做Demo没有对整体架构做过多的细节设置.
三、IBatis.net配置
web层拷贝的配置文件,这些文件在 Ibatis.net1.9.2的程序中 解压就有
providers.config 这个直接拷贝到根目录,该文件定义各种数据库的驱动,包括SqlServer, Oracle, MySQL, PostgreSQL, DB2 and OLEDB, ODBC 等。
sqlmap.config 就是非常核心的一个配置文件,主要配置了数据库访问字符串,settings设置,以及配置实体类和数据库表相关xml。
还有一个database.config 文件,它是配置一些在sqlmap中用到得参数.
添加对Ibatis dll的引用
sqlmap.config配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?xml version= "1.0" encoding= "utf-8" ?> <sqlMapConfig <settings> <!--启用命名空间,对于多个表的时候,进行区分--> <setting useStatementNamespaces= "true" /> </settings> <!--连接数据库驱动文件--> <providers resource= "providers.config" /> <!-- Database connection information --> <database> <!--配置数据库连接字符串--> <provider name= "sqlServer2.0" ></provider> <dataSource name= "IBatisNet" connectionString= "server=WWW;database=UserDemoDb;user id=sa;password=DDD;connection reset=false;" /> </database> <sqlMaps> <!--引用数据库表实体xml文件--> <sqlMap resource= "Maps/UserInfo.xml" /> </sqlMaps> </sqlMapConfig> |
先配置网站根目录下的Maps/UserInfo.xml如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
<?xml version= "1.0" encoding= "utf-8" ?> <sqlMap namespace = "UserInfo" xmlns= "http://ibatis.apache.org/mapping" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" > <alias> <!-- alias:取别名 assembly:表示类所在的文件 type:表示该类的完整的名称 --> <typeAlias alias= "UserInfo" assembly= "IBatisDemo.Model" type= "IBatisDemo.Model.UserInfo" /> </alias> <statements> < select id= "select_UserInfoAll" resultMap= "UserInfo-result" > select Id,UserName,Age from UserInfo </ select > <insert id= "insert_UserInfoOne" parameterClass= "UserInfo" > INSERT INTO UserInfo( [UserName],[Age] )VALUES( #UserName#,#Age# ) <selectKey type= "post" resultClass= "int" property= "Id" > SELECT CAST(@@IDENTITY as int ) as Id </selectKey> </insert> <delete id= "del_UserInfoOne" parameterClass= "UserInfo" > <![CDATA[ DELETE UserInfo ]]> <dynamic prepend= "WHERE" > Id = #Id# </dynamic> </delete> < select id= "select_UserInfoOne" resultMap= "UserInfo-result" > select * from UserInfo <dynamic prepend= "where" > <isParameterPresent property= "id" prepend= "WHERE" > [Id] = #Id# </isParameterPresent> </dynamic> </ select > <update id= "update_UserInfoOne" parameterClass= "UserInfo" > <![CDATA[ UPDATE UserInfo SET UserName = #UserName#, Age = #Age# ]]> <dynamic prepend= "WHERE" > Id = #Id# </dynamic> </update> </statements> <resultMaps > <resultMap id= "UserInfo-result" class = "UserInfo" > <result property= "Id" column= "Id" /> <result property= "UserName" column= "UserName" /> <result property= "Age" column= "Age" /> </resultMap> </resultMaps> </sqlMap> |
说明:
statements 节点:
在这些容器标签中有一些常用的属性如下所示
resultMap和resultclass对比:
1、resultMap属于直接映射,可以把结果集中的数据库字段与实体类中的属性一一对应,这样通过select语句得到的结果就会准确的对上号
2、resultclass属于隐身映射,虽然你指定resultclass=“”,具体某一个类,但是select语句得到的结果是一条实力记录,但如果数据库字段与类的属性名字不一致,这个时候就会出现映射错误,有一种方式可以解决就是在写select语句时,给每个字段用as运算符取名字与属性一样:例如:select realname as name...其中realname是字段列名,name是属性字段名
3、resultmap比resultclass性能要高。尽量使用resultmap
insert标签下的selectKey 是表示返回刚插入数据的主键id,具体说明如下
<!-- 为了使insert操作能够返回插入记录的id,必须为insert写一个selectKey 建立数据库实体类:UserInfo.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IBatisDemo.Model { public class UserInfo { public int Id { get ; set ; } public string UserName { get ; set ; } public int Age { get ; set ; } } } |
Mapper.cs 获取Mapper的对象类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
using IBatisNet.Common.Utilities; using IBatisNet.DataMapper; using IBatisNet.DataMapper.Configuration; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IBatisDemo.Dao { public class Mapper { private static volatile ISqlMapper _mapper = null ; protected static void Configure( object obj) { _mapper = null ; } protected static void InitMapper() { ConfigureHandler handler = new ConfigureHandler(Configure); DomSqlMapBuilder builder = new DomSqlMapBuilder(); _mapper = builder.ConfigureAndWatch(handler); } public static ISqlMapper Instance() { if (_mapper == null ) { lock ( typeof (SqlMapper)) { if (_mapper == null ) // double-check { InitMapper(); } } } return _mapper; } public static ISqlMapper Get() { return Instance(); } /// <summary> /// RealMarket Mapper /// </summary> public static ISqlMapper GetMaper { get { if (_mapper == null ) { lock ( typeof (ISqlMapper)) { if (_mapper == null ) { ConfigureHandler hander = new ConfigureHandler(Configure); DomSqlMapBuilder builder = new DomSqlMapBuilder(); _mapper = builder.ConfigureAndWatch( "SqlMap.config" , hander); } } } return _mapper; } } } } |
然后再Service里面建立UserInfoService.cs 数据访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
using IBatisDemo.Dao; using IBatisDemo.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Data.SqlClient; namespace IBatisDemo.Service { public class UserInfoService { public int UserInfoInsertOne(UserInfo userInfo) { Object obj = Mapper.GetMaper.Insert( "UserInfo.insert_UserInfoOne" , userInfo); return ( int )obj; } public UserInfo GetUserInfo( int id) { return (UserInfo)Mapper.GetMaper.QueryForObject( "UserInfo.select_UserInfoOne" , id); } public IList<UserInfo> GetUserInfoList() { //xml里面配置的格式 return Mapper.GetMaper.QueryForList<UserInfo>( "UserInfo.select_UserInfoAll" , null ); } public int DelUserInfoOne( int id) { Object obj = Mapper.GetMaper.Delete( "UserInfo.del_UserInfoOne" , id); return ( int )obj; } public int UpdateUserInfo(UserInfo userInfo) { Object obj = Mapper.GetMaper.Update( "UserInfo.update_UserInfoOne" , userInfo); return ( int )obj; } } } |
最后在web层 controller文件夹下建立 HomeController.cs 控制器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
using IBatisDemo.Service; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using IBatisDemo.Model; namespace IBatisDemo.Controllers { public class HomeController : Controller { // // GET: /Home/ UserInfoService service = new UserInfoService(); #region 显示员工 public ActionResult Index() { IList<UserInfo> userInfos = service.GetUserInfoList(); ViewData[ "list" ] = userInfos; return View(); } #endregion #region 添加员工 [HttpGet] public ActionResult UserInsert() { return View(); } [HttpPost] public ActionResult UserInsert(UserInfo userInfo) { userInfo.UserName = Request[ "UserName" ]; userInfo.Age = int .Parse(Request[ "Age" ]); if (service.UserInfoInsertOne(userInfo) > 0) { return Redirect( "Index" ); } else { return Content( "添加失败" ); } } #endregion #region 删除员工 public ActionResult delUserInfo( int id) { id = int .Parse(Request[ "Id" ]); if (service.DelUserInfoOne(id) > 0) { return Redirect( "Index" ); } else { return Content( "删除失败" ); } } #endregion #region 编辑员工资料 [HttpGet] public ActionResult getUserInfo( int Id) { Id = int .Parse(Request[ "Id" ]); UserInfo userInfos = service.GetUserInfo(Id); //ViewData["user"] = userInfos; return View(userInfos); } [HttpPost] public ActionResult getUserInfo(UserInfo userInfo) { userInfo.Id = int .Parse(Request[ "Id" ]); userInfo.UserName = Request[ "UserName" ]; userInfo.Age = int .Parse(Request[ "Age" ]); if (service.UpdateUserInfo(userInfo) > 0) { return Redirect( "Index" ); } else { return Content( "修改失败" ); } } #endregion } } |
View层 Index.cshtml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
@{ Layout = null ; } @ using IBatisDemo.Model <!DOCTYPE html> <html> <head> <meta name= "viewport" content= "width=device-width" /> <title>Index</title> </head> <body> <div> <h1>IBatis 学习Demo</h1> @ if (ViewData[ "List" ] != null ) { <table style= "width:100%;text-align:center;" id= "tabs" > <tr><th>编号</th><th>姓名</th><th>年龄</th><th>详细</th><th>删除</th><th>修改</th></tr> @ foreach ( var newInfo in (IList<UserInfo>)ViewData[ "List" ]) { <tr> <td>@newInfo.Id</td> <td>@newInfo.UserName</td> <td>@newInfo.Age</td> <td><a href= "javascript:void(0)" class = "details" ids= "@newInfo.Id" >详细</a></td> <td><a href= "/home/delUserInfo?Id=@newInfo.Id" class = "deletes" >删除</a></td> <td><a href= "/home/getUserInfo?Id=@newInfo.Id" class = "edits" >修改</a></td> </tr> } </table> } else { <span>暂无数据</span> } <a href= "/home/UserInsert" >添加</a> </div> </body> </html> |
编辑和添加的模板 直接在添加视图的时候生成就可以了,源码里面都有,这儿就不贴出来了
下面是运行效果:
MVC 使用IBatis.net的更多相关文章
- IBatis.net在asp.net MVC下的使用
IBatis.net 是2001年发起的开源项目,它是一个轻量级的ORM框架,现在IBatisNET已经是属于Apache下的一个子项目了,最新版本是1.6.2. 官方网站:http://www.my ...
- asp.net mvc +easyui 实现权限管理(二)
一写完后,好久没有继续写了.最近公司又在重新开发权限系统了,但是由于我人微言轻,无法阻止他们设计一个太监版的权限系统.想想确实是官大一级压死人啊, 没办法我只好不参与了 让他们去折腾. 我就大概说一下 ...
- JavaWeb应用开发架构浅谈
本文就我所经历和使用过的技术和框架, 讨论 Java / Javascript 技术组合构成的Web 应用架构. 一. 概述 Web 应用架构可以划分为两大子系统:前端子系统和后台子系统. 前端子系统 ...
- 使用 AppFuse 的七个理由
mvn -e archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfus ...
- Unity + iBatis + Asp.net Mvc 系统搭建
Unity + iBatis + Asp.net Mvc 系统搭建 之前用EntityFramework Code First做了一些小项目,很是方便:后来在一个 Java 项目中接触了myBatis ...
- iBatis第一章:基础知识概述 & MVC思想
一.java是一门十分受开发人员欢迎的语言,在开发语言排行榜中名列前茅,人们对其看法不尽相同,就我自身感受而言,我觉得java语言的主要优势体现在如下几方面:1.java属于开源语言,开发人员可以找到 ...
- velocity+spring mvc+spring ioc+ibatis初试感觉(与struts+spring+hibernate比较)
velocity+spring mvc+spring ioc+ibatis框架是我现在公司要求采用的,原因是因为阿里巴巴和淘宝在使用这样的框架,而我公司现在还主要是以向阿里巴巴和淘宝输送外派人员为 主 ...
- ibatis.net MVC 单元测试 错误解决方法
Q1:Unable to load file via resource "SqlMap.config" as resource.Cause : 未能找到文件:"...Te ...
- Srping mvc mabatis 报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
我的Mapper采用接口+注解的方式注入 @Repository(value="customerServOutCallMapper")public interface Custom ...
随机推荐
- Max Sum (hdu 1003 简单DP水过)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- Jersey的RESTful简单案例demo
REST基础概念: 在REST中的一切都被认为是一种资源. 每个资源由URI标识. 使用统一的接口.处理资源使用POST,GET,PUT,DELETE操作类似创建,读取,更新和删除(CRUD)操作. ...
- Bitmap
Bitmap篇 在前一篇中介绍了使用API做Distinct Count,但是计算精确结果的API都较慢,那有没有能更快的优化解决方案呢? 1. Bitmap介绍 <编程珠玑>上是这样 ...
- JS 昵称,手机号,邮箱判断
<script type="text/javascript"> var leyou = document.getElementById('J-leyou'), _nam ...
- CSDN的SDCC大会(2013)中使用的PPT分享
SDCC大会今天开完个.呵呵~ PPT下载链接在最后面,对内幕不感兴趣的可以直接无视下面的种种啰嗦直接“嗖”到最后. 这里说说这个大会中我的Topic. 此前CSDN向我约了一个主题,我回复说, 我可 ...
- BZOJ 1975 SDOI2010 魔法猪学院 A*k短路
题目大意:给定一个值E 求起点到终点的最多条路径 使长度之和不超过E k短路的A*算法--每一个点有一个估价函数=g[x]+h[x] 当中g[x]是从源点出发已经走了的长度 h[x]是从这个点到汇点的 ...
- J2EE请求和响应—Servlet
一.什么是Servlet? Servlet是执行Webserver上的一个特殊Java类.其特殊用途是响应client请求并做出处理.使得client与server端进行交互. 二.生命周期 Ser ...
- ios日历视图实现日期输入
在视图控制器上,触摸textfield,打开的不是虚拟键盘,也不是datepicker,也不要actionsheet,要一个类似html上的日历输入框. 这类控件有很多开源的,但目标不是我想要的.参考 ...
- zabbix通过脚本发送短信
zabbix通过脚本发送短信 原则 和zabbix电子邮件是一样的,他们是action内部配置,司的api来完毕.当然网上有不少利用139邮箱来发的,这个事实上算调用email的一种,这里复述的是调用 ...
- Git使用操作指南和GitHub
本文记录Git的使用操作,把散落的记忆整理到一起.并介绍GitHub的使用. 使用Git代表着一种思想和境地,和SVN相比,不是技术上的差异有多么大,而是代表融入了一种新的生态环境.一种开放开源的心态 ...