dapper操作连接mysql开发最完整实例总结

dapper操作连接mysql开发最完整实例总结

22630发表于2016-04-22

之前有写过dapper的介绍,但是今天主要来讲解一下dapper怎么使用mysql数据库开发并列举一些常用的用法。

dapper版本:1.42

比起dapper使用sql server,dapper下的mysql就显得麻烦一些,毕竟微软要想保护下自己的sql server而把mysql看成外来媳妇,所以要使dapper能够连接mysql必须要从mysql官网中下载.net的驱动。

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)
);


二、返回dynamic类型的集合


[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;


三、查询数据并返回List集合


[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();
	}
}


五、查询返回一个对象model



[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();
	 }
 }


八、dapper使用mysql的事务



[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。

小编蓝狐