MySql连接数据库
C#中连接MySql数据库,需要配置MySql.Data。 1.配置 项目- 管理NuGet程序包 – 安装MySql.Data。 2.示例代码
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 |
using MySql.Data.MySqlClient; using System; namespace MySQL { class Program { static void Main(string[] args) { string server = "172.0.0.1"; string database = "test"; string uid = "root"; string password = "123456"; string SslMode = "none"; string connectionString; connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";" + "SslMode=" + SslMode; MySqlConnection mycon = new MySqlConnection(connectionString); mycon.Open(); MySqlCommand mycmd = new MySqlCommand("insert into buyer(name,password,email) values('小王','dikd3939','1134384387@qq.com')", mycon); if (mycmd.ExecuteNonQuery() > 0) { Console.WriteLine("数据插入成功!"); } Console.ReadLine(); mycon.Close(); } } } |
3.注意事项 运行上述代码,如果出现异常 “IOException: Unable to read data from the transport connection: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”。首先,确认数据库是否允许远程连接;其次,防火墙是否打开;最后,连接字符串是否正确,是否支持SSL。 出现异常“The host localhost does not support SSL connections.”说明不支持SSL,需要在连接字符串里添加SslMode = "none"。 from:https://blog.csdn.net/liyazhen2011/article/details/82845279
View DetailsWeex自定义Module
面试之家只是为了学习和交流使用Weex,题库等内容不可用于商业项目 在Weex开发中,使用自定义Module的方式,来扩展Weex的能力,官方教程在这里,这里我以自定义分享模块来举例 第一步 先创建一个继承与NSObject的基类UM_WeexModule,然后引入头文件#import <WeexSDK.h>,并继承WXModuleProtocol协议。 第二步 实现方法并暴露给JS
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 |
- (void)shareEvent:(NSDictionary *)parames callback:(WXModuleKeepAliveCallback)callback { if (![parames isKindOfClass:NSClassFromString(@"NSDictionary")]) { [SVProgressHUD showErrorWithStatus:@"非法传参"]; return; } [UMSocialUIManager showShareMenuViewInWindowWithPlatformSelectionBlock:^(UMSocialPlatformType platformType, NSDictionary *userInfo) { switch (platformType) { case UMSocialPlatformType_Sina: { if (![[UMSocialManager defaultManager]isInstall:UMSocialPlatformType_Sina]) { [SVProgressHUD showErrorWithStatus:@"未安装新浪客户端"]; return ; } } break; case UMSocialPlatformType_WechatSession: { if (![[UMSocialManager defaultManager]isInstall:UMSocialPlatformType_WechatSession]) { [SVProgressHUD showErrorWithStatus:@"未安装微信客户端"]; return ; } } break; case UMSocialPlatformType_WechatTimeLine: { if (![[UMSocialManager defaultManager]isInstall:UMSocialPlatformType_WechatTimeLine]) { [SVProgressHUD showErrorWithStatus:@"未安装微信客户端"]; return ; } } break; case UMSocialPlatformType_QQ: { if (![[UMSocialManager defaultManager]isInstall:UMSocialPlatformType_QQ]) { [SVProgressHUD showErrorWithStatus:@"未安装QQ客户端"]; return ; } } break; case UMSocialPlatformType_Qzone: { if (![[UMSocialManager defaultManager]isInstall:UMSocialPlatformType_Qzone]) { [SVProgressHUD showErrorWithStatus:@"未安装QQ客户端"]; return ; } } break; default: break; } NSString *type = parames[@"type"]; NSString *title = parames[@"title"]; NSString *des =parames[@"des"]; NSString *picUrl = parames[@"picUrl"]; NSString *linkUrl = parames[@"linkUrl"]; //创建分享消息对象 UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; if ([type isEqualToString:@"link"]) { //创建网页内容对象 UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:title descr:des thumImage:picUrl]; //设置网页地址 shareObject.webpageUrl = linkUrl; //分享消息对象设置分享内容对象 messageObject.shareObject = shareObject; } else if ([type isEqualToString:@"pic"]) { //创建图片内容对象 UMShareImageObject *shareObject = [[UMShareImageObject alloc] init]; [shareObject setShareImage:picUrl]; //分享消息对象设置分享内容对象 messageObject.shareObject = shareObject; } else if ([type isEqualToString:@"richText"]) { //设置文本 messageObject.text = title; //创建图片内容对象 UMShareImageObject *shareObject = [[UMShareImageObject alloc] init]; //如果有缩略图,则设置缩略图 shareObject.thumbImage = [UIImage imageNamed:@"icon"]; [shareObject setShareImage:picUrl]; //分享消息对象设置分享内容对象 messageObject.shareObject = shareObject; } [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:nil completion:^(id data, NSError *error) { if (error) { callback(error.userInfo[@"message"],false); }else{ [SVProgressHUD showSuccessWithStatus:@"分享成功"]; callback(@"1",false); } }]; }]; } - (void)setalias:(NSDictionary *)params { [UMessage addAlias:[NSString stringWithFormat:@"%@",params[@"userID"]] type:params[@"type"] response:^(id _Nonnull responseObject, NSError * _Nonnull error) { }]; } |
第三步 将方法抛出给JS
1 2 |
WX_EXPORT_METHOD(@selector(shareEvent: callback:)) WX_EXPORT_METHOD(@selector(setalias:)) |
第四步 初始化时注册到WeexSDK
1 |
[WXSDKEngine registerModule:@"UM_Event" withClass:NSClassFromString(@"UM_WeexModule")]; |
第五步 JS调用
1 2 3 4 5 6 7 8 |
var um_share = weex.requireModule('UM_Event'); um_share.shareEvent({ type:'pic', title:'title', picUrl:'https://mianshizhijia.oss-cn-hangzhou.aliyuncs.com/resourse_image/%E5%88%86%E4%BA%AB.jpg', }, callback => { }); |
结语 本篇文章旨在分享如何通过自定义Module来扩展Weex的能力,由于最近在忙于找工作,所以写的不是很深入,等过段时间稳定之后,会在继续分享Weex实现原理,以及从注册方法到可以被JS调用中间的实现过程。 作者:GL_fire 链接:https://www.jianshu.com/p/37b884515125 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
View Detailsweex采坑之旅(三)Android SDK环境搭建
上一篇文章我们配置了jdk version,这一节就来配置Android SDK环境搭建 Android SDK是Android平台上进行软件开发所需要的开发包,这里我们通过安装Android Studio的方式来安装Android SDK,Android Studio 是Android开发的IDE(集成开发环境),至少是2.0 或者更新版本 同样打开如下连接,此官方网站容易被墙 https://developer.android.com/studio/index.html 如果打不开换下面的路径,此为 android sdk 中文网站,下载 Android Studio http://www.androiddevtools.cn/ 然后运行你们下载的Android Studio进行安装,全选,然后下一步 到此处后,路径可以修改,我就都安装在D盘了,而且还是在同一个目录下,建议大家按照我的来安装, 注意安装目录不能有中文 第一个安装目录修改为 D:\Android\AndroidStudio 第二个安装目录修改为 D:\Android\sdk 我的安装位置 然后一直下一步,去掉勾选,点击finish 然后打开刚才修改的安装路径 D:\Android\sdk,运行 SDK Manager.exe 勾选下面几个(23.0.2一定要下),然后点击 install packages 安装成功后就开始安装环境变量,同样是在用户环境变量中新建一个(因为我已配置好) 变量名: ANDROID_HOME 变量值: D:\Android\sdk 然后在修改用户环境变量 path,是添加两个 变量名: path 变量值: %ANDROID_HOME%\platform-tools %ANDROID_HOME%\tools 如果环境变量是如下图的小伙伴,则在变量值最后面加上 ;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools 同样最后我们来检测是否安装和配置好,输入cmd打开命令行工具 输入 adb 如果出现的结果跟下面的图一样,那么恭喜你环境已经搭建好了 weex的环境变量就这样配置成功了,那么就开始入坑之旅吧! from:https://blog.csdn.net/k491022087/article/details/72934862
View Detailsmybatis 中 Example 的使用 :条件查询、排序、分页
版权声明:这可是本菇凉辛辛苦苦原创的,转载请一定带上我家地址,不要忘记了哈 . https://blog.csdn.net/u011314442/article/details/90140532
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import tk.mybatis.mapper.entity.Example; import com.github.pagehelper.PageHelper; ... @Override public List<RepaymentPlan> listRepaymentPlan(Integer start) { Example example = new Example(RepaymentPlan.class); // 排序 example.orderBy("id"); // 条件查询 example.createCriteria() .andNotEqualTo("repayStatus", 3) .andLessThanOrEqualTo("shouldRepayDate", new Date()); // 分页 PageHelper.startPage(start, 20); // 每次查询20条 return repaymentPlanMapper.selectByExample(example); } |
2. PageHelper 使用详解见文章:分页插件pageHelpler的使用(ssm框架中)服务器端分页 3. 更多关于 Example 的使用说明见文章: java 查询功能实现的八种方式 MyBatis : Mapper 接口以及 Example 使用实例、详解 4. 当只是查询数据,不需要返回总条数时可选择此方法:
1 |
PageHelper.startPage(第几页, 20,false); // 每次查询20条 |
当数据量极大时,可以快速查询,忽略总条数的查询,减少查询时间。 以下是该方法原码实现: ————————————————- 2019.5.13 后记 : 1)分页的写法 下图中黄框中的写法运行 比红框中 快,不知道是不是插件本身也会有费时: 2)再补充一种分页方式,mybatis 自带的 RowBounds:
1 2 3 4 5 6 7 8 9 10 |
public List<RepayPlan> listRepayPlan(int start) { // 查询所有未还款结清且应还日期小于当前时间的账单 Example example = new Example(RepayPlan.class); example.orderBy("id "); // 按id排序 example.createCriteria() .andNotEqualTo("repayStatus", 3) .andLessThanOrEqualTo("shouldRepayDate", new Date()); RowBounds rowBounds = new RowBounds(start, 20); // 每次查询20条 return epaymentPlanMapper.selectByExampleAndRowBounds(example,rowBounds); } |
推荐用 RowBounds :mybatis 自带的,且速度快 。个人运行,后 2 种分页明显比 PageHelper 快。 from:https://cloud.tencent.com/developer/article/1433161
View Details使用fastjson解析数据后导致顺序改变问题
在开发过程中遇到一个问题,服务器经过排序返回后的字符串数据使用fastjson解析后,数据顺序发生变化,引起业务异常。 解决办法: 1、解析时增加参数不调整顺序 JSONObject respondeBodyJson = JSONObject.parseObject(jsonStr, Feature.OrderedField); 2、初始化json对象为有序对象: JSONObject retObj = new JSONObject(true); 这样生成的json对象就与放入数据时一致。 3、使用Gson解析 JsonObject returnData = new JsonParser().parse(replyString).getAsJsonObject(); ———————————————— 版权声明:本文为CSDN博主「long2010110」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/long2010110/article/details/81537820
View DetailsJava对象之间相同属性的赋值
场景 两个不同的类,其中一部分的属性相同。 要把其中一个对象的一些属性赋值给另一个对象。 最原始的方式是依次调用两个对象的set和get方法,挨个赋值。 但是spring提供了BanUtils的方法copyPrpperties可以实现。 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。 实现 引入包
1 |
import org.springframework.beans.BeanUtils; |
然后调用
1 |
BeanUtils.copyProperties(kqDkszJl,kqDksz); |
其中左边是要取值的对象,右边是要赋值的对象。 博客园: https://www.cnblogs.com/badaoliumangqizhi/ 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。 from:https://www.cnblogs.com/badaoliumangqizhi/p/13786384.html
View Detailscom.alibaba.fastjson转换JSON数据后顺序与原JSON字符串顺序不一致原因分析
转换字符串示例:
1 2 |
String array2 = "{'i':'2','b':'3'}"; JSONObject parseObject = JSON.parseObject(array2); |
结果:
1 |
{"b":"3","i":"2"} |
我们会发现顺序与原来的字符串顺序不一致。 通过DEBUG去com.alibaba.fastjson.parser.DefaultJSONParser的下述方法
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 |
public Object parse(Object fieldName) { final JSONLexer lexer = this.lexer; switch (lexer.token()) { case SET: lexer.nextToken(); HashSet<Object> set = new HashSet<Object>(); parseArray(set, fieldName); return set; case TREE_SET: lexer.nextToken(); TreeSet<Object> treeSet = new TreeSet<Object>(); parseArray(treeSet, fieldName); return treeSet; case LBRACKET: JSONArray array = new JSONArray(); parseArray(array, fieldName); if (lexer.isEnabled(Feature.UseObjectArray)) { return array.toArray(); } return array; case LBRACE: //重点就是此行的lexer.isEnabled(Feature.OrderedField)=false JSONObject object = new JSONObject(lexer.isEnabled(Feature.OrderedField)); return parseObject(object, fieldName); // case LBRACE: { // Map<String, Object> map = lexer.isEnabled(Feature.OrderedField) // ? new LinkedHashMap<String, Object>() // : new HashMap<String, Object>(); // Object obj = parseObject(map, fieldName); // if (obj != map) { // return obj; // } // return new JSONObject(map); // } case LITERAL_INT: Number intValue = lexer.integerValue(); lexer.nextToken(); return intValue; case LITERAL_FLOAT: Object value = lexer.decimalValue(lexer.isEnabled(Feature.UseBigDecimal)); lexer.nextToken(); return value; |
重点就是此行的lexer.isEnabled(Feature.OrderedField)=false,打开JSONObject的源码构造方法可以发现当ordered参数值为false时使用的是HashMap存放数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public JSONObject(int initialCapacity, boolean ordered){ if (ordered) { map = new LinkedHashMap<String, Object>(initialCapacity); } else { map = new HashMap<String, Object>(initialCapacity); } } |
hashmap是数组加链表结构,根据key的hash算法确定在数组中的位置,当发生hash冲突的时候,根据二叉树或者红黑树构成链表。所以是有序的,key确定,位置也就确定了。 如果要实现转换前的数据顺序与转换后的数据顺序一致,可以使用如下方式:
1 2 3 |
String array2 = "{'i':'2','b':'3'}"; JSONObject parseObject = JSON.parseObject(array2, Feature.OrderedField); |
此时会使用LinkedHashMap,LinkedHashMap的内部维持了一个双向链表,保存了数据的插入顺序,遍历时,先得到的数据便是先插入的。 from:https://blog.csdn.net/h363659487/article/details/103880710
View Detailsspring-boot启动警告:No MyBatis mapper was found…
spring-boot继承mybatis启动时,警告如下: 2018-09-10 15:00:14.721 WARN tk.mybatis.spring.mapper.ClassPathMapperScanner --No MyBatis mapper was found in '[com.kevin]' package. Please check your configuration. 使用的tk的开源项目进行mybatis集成,百度了很多解决方案,最终看到一位前辈介绍:doScan()会扫描启动类同级目录下的mapper接口,但是合理的目录结果绝对不允许所有的mapper都在启动类目录下,所以在启动类目录下添加了一个伪mapper,如下: 再重新启动服务,就不会出现如上warn信息了…… from:https://my.oschina.net/kevin2kelly/blog/2046324 ========================================================================================= 光子:通过以上兄弟的方法,我的警告确实没有了。但经过dev-tools热启动后还是会提醒: 无法获取实体类com.w3cnet.doctoradvice.entity.HisvMzbrJzxx对应的表名 …… 还需要安装一下:Mapper Spring Boot Starter ,贴上地址:
1 2 |
// https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter compile group: 'tk.mybatis', name: 'mapper-spring-boot-starter', version: '2.1.5' |
折腾了几次,终于完美解决…… 参考:https://blog.csdn.net/zwrlj527/article/details/91824220
View DetailsCargo 教程
Cargo 是什么 Cargo 是 Rust 的构建系统和包管理器。 Rust 开发者常用 Cargo 来管理 Rust 工程和获取工程所依赖的库。在上个教程中我们曾使用 cargo new greeting 命令创建了一个名为 greeting 的工程,Cargo 新建了一个名为 greeting 的文件夹并在里面部署了一个 Rust 工程最典型的文件结构。这个 greeting 文件夹就是工程本身。 Cargo 功能 Cargo 除了创建工程以外还具备构建(build)工程、运行(run)工程等一系列功能,构建和运行分别对应以下命令:
1 2 |
cargo build cargo run |
Cargo 还具有获取包、打包、高级构建等功能,详细使用方法参见 Cargo 命令。 在 VSCode 中配置 Rust 工程 Cargo 是一个不错的构建工具,如果使 VSCode 与它相配合那么 VSCode 将会是一个十分便捷的开发环境。 在上一章中我们建立了 greeting 工程,现在我们用 VSCode 打开 greeting 文件夹(注意不是 runoob-greeting)。 打开 greeting 之后,在里面新建一个新的文件夹 .vscode (注意 vscode 前面的点,如果有这个文件夹就不需要新建了)。在新建的 .vscode 文件夹里新建两个文件 tasks.json 和 launch.json,文件内容如下: tasks.json 文件
1 2 3 4 5 6 7 8 9 10 11 |
{ "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command":"cargo", "args": ["build"] } ] } |
launch.json 文件(适用在 Windows 系统上)
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 |
{ "version": "0.2.0", "configurations": [ { "name": "(Windows) 启动", "preLaunchTask": "build", "type": "cppvsdbg", "request": "launch", "program": "${workspaceFolder}/target/debug/${workspaceFolderBasename}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false }, { "name": "(gdb) 启动", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/target/debug/${workspaceFolderBasename}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "这里填GDB所在的目录", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] } |
launch.json 文件(适用在 Linux 系统上)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "version": "0.2.0", "configurations": [ { "name": "Debug", "type": "gdb", "preLaunchTask": "build", "request": "launch", "target": "${workspaceFolder}/target/debug/${workspaceFolderBasename}", "cwd": "${workspaceFolder}" } ] } |
launch.json 文件(适用在 Mac OS 系统上)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "version": "0.2.0", "configurations": [ { "name": "(lldb) 启动", "type": "cppdbg", "preLaunchTask": "build", "request": "launch", "program": "${workspaceFolder}/target/debug/${workspaceFolderBasename}", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "lldb" } ] } |
[…]
View DetailsRust 教程
Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言。 Rust 语言由 Mozilla 开发,最早发布于 2014 年 9 月。Rust 的编译器是在 MIT License 和 Apache License 2.0 双重协议声明下的免费开源软件。截至目前( 2020 年 1 月)最新的编译器版本是 1.41.0。 Rust 官方在线工具: https://play.rust-lang.org/。 Rust 系列文章内容由 Sobin 收集整理。 Rust语言的特点 高性能 – Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。 可靠性 – Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。 生产力 – Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具 —— 包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。 Rust的应用 Rust 语言可以用于开发: 传统命令行程序 – Rust 编译器可以直接生成目标可执行程序,不需要任何解释程序。 Web 应用 – Rust 可以被编译成 WebAssembly,WebAssembly 是一种 JavaScript 的高效替代品。 网络服务器 – Rust 用极低的资源消耗做到安全高效,且具备很强的大规模并发处理能力,十分适合开发普通或极端的服务器程序。 嵌入式设备 – Rust 同时具有JavaScript 一般的高效开发语法和 C 语言的执行效率,支持底层平台的开发。 谁适合阅读本教程? 本教程对于初级的编程知识将默认读者已经掌握,所以如果你阅读本教程,你需要对初级的编程知识有一定的了解(最好已经初识 C/C++ 或 JavaScript 编程语言)。 第一个 Rust 程序 Rust 语言代码文件后缀名为 .rs, 如 runoob.rs。
1 2 3 |
fn main() { println!("Hello World!"); } |
参考链接 Rust 官方网站:https://www.rust-lang.org/zh-CN Rust 官方文档:https://doc.rust-lang.org/ Rust Play:https://play.rust-lang.org/ Visual Studio […]
View Details