高斋晓开卷,独共圣人语。这篇文章主要讲述.NET Core开发日志——Dapper与MySQL相关的知识,希望能为你提供帮助。
【.NET Core开发日志——Dapper与MySQL】Dapper作为.NET生态中广为人知的轻量级ORM类库在.NET Core里仍能被有效利用,并且其不但可以连通SQL Server数据库还提供对其它数据库,比如mysql的支持。这里试验了一下通过Dapper连接MySQL的方法。
MySQL可以选择直接安装在原生系统中或是Docker里。
Official
Docker
Table在MySQL中建立两张表。
city表:
CREATE TABLE `city` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT \'\',
`CountryCode` char(3) NOT NULL DEFAULT \'\',
`District` char(20) NOT NULL DEFAULT \'\',
`Population` int(11) NOT NULL DEFAULT \'0\',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1
country表:
CREATE TABLE `country` (
`Code` char(3) NOT NULL DEFAULT \'\',
`Name` char(52) NOT NULL DEFAULT \'\',
`Continent` enum(\'Asia\',\'Europe\',\'North America\',\'Africa\',\'Oceania\',\'Antarctica\',\'South America\') NOT NULL DEFAULT \'Asia\',
`Region` char(26) NOT NULL DEFAULT \'\',
`SurfaceArea` float(10,2) NOT NULL DEFAULT \'0.00\',
`IndepYear` smallint(6) DEFAULT NULL,
`Population` int(11) NOT NULL DEFAULT \'0\',
`LifeExpectancy` float(3,1) DEFAULT NULL,
`GNP` float(10,2) DEFAULT NULL,
`GNPOld` float(10,2) DEFAULT NULL,
`LocalName` char(45) NOT NULL DEFAULT \'\',
`GovernmentForm` char(45) NOT NULL DEFAULT \'\',
`HeadOfState` char(60) DEFAULT NULL,
`Capital` int(11) DEFAULT NULL,
`Code2` char(2) NOT NULL DEFAULT \'\',
PRIMARY KEY (`Code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Package应用程序工程中需要添加Dapper以及Mysql.Data类库。
dotnet add package Dapper
dotnet add package MySql.Data
Entity编写两个实体类,用于映射city与country表。
public class CityEntity
{
public int ID { get;
set;
}
public string Name { get;
set;
}
public string CountryCode { get;
set;
}
public string District { get;
set;
}
public int Population { get;
set;
}
public CountryEntity Country { get;
set;
}public override string ToString()
{
return $"ID: {ID}, Name: {Name}, CountryCode: {CountryCode}, District: {District}, Population: {Population}, Country: {Country}";
}
}
public class CountryEntity
{
public string Code { get;
set;
}
public string Name { get;
set;
}
public string Continent { get;
set;
}
public string Region { get;
set;
}
public decimal SurfaceArea { get;
set;
}
public int IndepYear { get;
set;
}
public int Population { get;
set;
}
public decimal LifeExpectancy { get;
set;
}
public decimal GNP { get;
set;
}
public decimal GNPOld { get;
set;
}
public string LocalName { get;
set;
}
public string GovernmentForm { get;
set;
}
public string HeadOfState { get;
set;
}
public int Capital { get;
set;
}
public string Code2 { get;
set;
}public override string ToString()
{
return $"Code: {Code}, Name: {Name}, Continent: {Continent}, Region: {Region}, SurfaceArea: {SurfaceArea} ";
}
}
Repository仓库类中新加获取10个城市数据的方法。这里Dapper的Query方法有三个参数,第一个是需要执行的SQL语句,第二个是对象之间的对应关系(这个例子中city与country为一对一关系),并确定最终返回的对象类型,最后的SplitOn参数会告诉Dapper在结果集中两张表之间以哪个字段进行分界。
public class CityRepository
{
public List<
CityEntity>
Get10Cities()
{
List<
CityEntity>
result;
using (var conn = new MySqlConnection("Host=localhost;
Port=3306;
Database=world;
Uid=admin;
pwd=admin"))
{
var sql = "SELECT * FROM city INNER JOIN country ON city.CountryCode = country.Code LIMIT 10";
result = conn.Query<
CityEntity, CountryEntity, CityEntity>
(sql,
(city, country) =>
{ city.Country = country;
return city;
}, splitOn: "Code").ToList();
}return result;
}
}
Test
static void Main(string[] args)
{
var repository = new CityRepository();
var cities = repository.Get10Cities();
cities.ForEach(e=>
{
System.Console.WriteLine(e);
});
}
程序运行的结果如下,可以看到成功借助Dapper的力量从MySQL数据库里获取了所需的数据。
文章图片
推荐阅读
- Hibernate映射数据库中longtext类型属性时报错No Dialect mapping for JDBC type: -1的解决方案
- Android 开发者
- AMQ(approximate membership queries)介绍
- bindcallapply的区别与实现
- Android Studio MainActivity中的R为红色
- 永久解决AndroidStudio Aapt2的问题
- MybatisPlus之-----BaseMapper
- Android GreenDao使用教程
- 喜闻乐见-Android LaunchMode