发表于2016-04-22
之前有写过dapper的介绍,但是今天主要来讲解一下dapper怎么使用mysql数据库开发并列举一些常用的用法。
dapper版本:1.42
比起dapper使用sql server,dapper下的mysql就显得麻烦一些,毕竟微软要想保护下自己的sql server而把mysql看成外来媳妇,所以要使dapper能够连接mysql必须要从mysql官网中下载.net的驱动。
下载下来是一个.msi安装文件,点击安装就ok了。到时在你的安装目录就有对应的dll文件了,这些dll可以拷贝到其它机器,或者在项目中引用就可以了,这样可以避免重复安装。(我的安装路径为:C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\)会有一个Assemblies目录。
里面有多个版本的驱动,根据自己开发版本选择自己相应的驱动版本。v4.5下面有以下dll。
第一个dll,“MySql.Data.dll”就是我们要找的dll了。在项目引用这个dll文件并引用dapper的dll。
下面就来看看dapper连接mysql具体的增、查、改、删的代码。
创建一个mysql测试表和model
public class UserInfo { public int id { get; set; } public string name { get; set; } }
create table t ( id int, name varchar(50) );
[TestMethod] public void TestQueryReturnDynamic() { IEnumerable<dynamic> list; using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test")) { list = conn.Query("select * from t"); conn.Close(); } }
默认dapper查询返回的就是IEnumberable的。
注意:在使用dapper必须要添加对Dapper命名空间的引用
using Dapper;
[TestMethod] public void TestQueryListAll() { List<UserInfo> list; using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test")) { list = conn.Query<UserInfo>("select * from t").AsList(); conn.Close(); } }
[TestMethod] public void TestQueryByParams() { IEnumerable<UserInfo> list; using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test")) { list = conn.Query<UserInfo>("select * from t where id>@id", new { id = 1 }); conn.Close(); } }
[TestMethod] public void TestGetModelByID() { try { UserInfo m; using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test")) { conn.Open(); var result = conn.Query<UserInfo>("select * from t where id=@id", new { id = 2 }).AsList(); if (result.Count > 0) m = result[0]; conn.Close(); } } catch (Exception ex) { throw ex; } }注意:dapper连接mysql参数还是用@开头,但是不像sql server那样真正的参数化达到防止sql注入的危险。我们可以试试把上面执行语句改一下,报的错可以给出我们提示:
1、不给参数对像
var result = conn.Query<UserInfo>("select * from t where id=@id").AsList();
错误信息:
Fatal error encountered during command execution.
2、把where去掉
var result = conn.Query<UserInfo>("select * from t id=@id", new { id = 2 }).AsList();
错误如下:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=2' at line 1
千万要注意:可以看到其实在执行sql命令之前进行了一次sql拼接,所以还要自己之前要做好防注入的检查,这一点还是不如sql server。
[TestMethod] public void TestInsertBatch() { using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test")) { conn.Open(); var r = conn.Execute(@"insert t(id, name) values (@id, @name)", new[] { new { id = 1, name = "lanhusoft1"} , new { id = 2, name = "lanhusoft2"} , new { id = 3, name = "lanhusoft3"} }); conn.Close(); } }
[TestMethod] public void TestUpdate() { using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test")) { conn.Open(); var r = conn.Execute(@"update t set name='www.lanhuseo.com' where id=@id", new { id = 3 }); conn.Close(); } }
[TestMethod] public void TestDapperTransaction() { using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test")) { conn.Open(); IDbTransaction trans = conn.BeginTransaction(); int row = conn.Execute(@"update t set name='www.lanhusoft.com' where id=@id", new { id = 3 }, trans); row += conn.Execute("delete from t where id=@id", new { id = 5 }, trans); for (int i = 0; i < 100; i++) { conn.Execute(@"insert t(id, name) values (@id, @name)", new { id = i, name = "www.lanhusoft.com/" + i }); } trans.Commit(); conn.Close(); } }
[TestMethod] public void TestDelete() { using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test")) { conn.Open(); var r = conn.Execute("delete from t where id=@id", new { id = 5 }); conn.Close(); } }
dapper使用mysql开发区别不是很大,主要有以下几点:
1、连接对象要使用MySqlConnection,这个类在MySql.Data.dll中。
2、数据库连接字符串有点不一样
3、dapper查询返回List集合要使用AsList()方法,而且对linq支持没有sql server好。
4、参数虽然也是通@开头,但是不是真正意义的Command,而是拼接sql。