之前有写过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)
);
二、返回dynamic类型的集合
[TestMethod]
public void TestQueryReturnDynamic()
{
IEnumerable 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 list;
using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test"))
{
list = conn.Query("select * from t").AsList();
conn.Close();
}
}
四、通过参数化查询
[TestMethod]
public void TestQueryByParams()
{
IEnumerable list;
using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test"))
{
list = conn.Query("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("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("select * from t where id=@id").AsList();
错误信息:
Fatal error encountered during command execution.
2、把where去掉
var result = conn.Query("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。