<select id=“selectUser” resultMap=“BaseResultMap” parameterType=“java.lang.String”> select * from user_user_t where user_name = #{0} and user_area=#{1} </select>
<select id=“ selectUser” resultMap=“BaseResultMap”> select * from user_user_t where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR} </select>
Service层调用
Private User xxxSelectUser(){ Map paramMap=new hashMap(); paramMap.put(“userName”,”对应具体的参数值”); paramMap.put(“userArea”,”对应具体的参数值”); User user=xxx. selectUser(paramMap);}
个人认为此方法不够直观,见到接口方法不能直接的知道要传的参数是什么。
第三种方案:
Dao层的函数方法
Public User selectUser(@param(“userName”)Stringname,@param(“userArea”)String area);
对应的Mapper.xml
<select id=“ selectUser” resultMap=“BaseResultMap”> select * from user_user_t where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR} </select>
(2)删除主表category中数据:delete FROM `category` WHERE id=1,会报错: #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`article`, CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`)) (3)从表article中,添加不存在的category_id:insert into article(category_id,name) values(2,’分类2’) 会报错: #1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`article`, CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`))
(4)更改更新删除约束 代码如下 复制代码 --删除外键 ALTER TABLE article DROP FOREIGN KEY fk_1 --添加外键 ALTER TABLE `article` ADD CONSTRAINT `fk_1` FOREIGN KEY ( `category_id` ) REFERENCES `category` ( `id` ) ON DELETE CASCADE ON UPDATE CASCADE
此时如下操作: 代码如下 复制代码 --此时article中的记录也会被删除 delete from category where id=1; --此时article中的category_id也会被更新成3 UPDATE `test`.`category` SET `id` = ‘3’ WHERE `category`.`id` =2;
查阅资料得知,要解决这个问题,需要改用 System.Security.Cryptography.RSA.Create() 工厂方法,使用它之后,在 Windows 上创建的是 System.Security.Cryptography.RSACng 的实例,在 Mac 与 Linux 上创建的是 System.Security.Cryptography.RSAOpenSsl 的实例,它们都继承自 System.Security.Cryptography.RSA 抽象类。
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7PyjMEuniN6BPn8oqzIZ6AO1N jSTO9R3adCCIwKfKIEoWXXM+tHDpktdPKSaAsWJPTNAGvEvtxOfzXib/EMXKqD0e Uy5MatfpRjRdf1hJVimmfrb09Qx2j7CsKLy7nD23m4xubdYBwvkjMwt/L3JxB5D6 qryW1wei/j1c+/OCxQIDAQAB -----END PUBLIC KEY-----
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); //读取配置 Console.WriteLine(config["Alipay:AppId"]); Console.WriteLine(config["Alipay:PriviteKey"]);
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile("appsettings.Test.json");
using Microsoft.Practices.Unity.InterceptionExtension;public class UserHandler:ICallHandler { public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { User user = input.Inputs[0] as User; if (user.PassWord.Length < 10) { return input.CreateExceptionMethodReturn(new UserException(“密码长度不能小于10位”)); } Console.WriteLine(“参数检测无误”); return getNext()(input, getNext); } }public class LogHandler:ICallHandler { public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { User user = input.Inputs[0] as User; Log log = new Log() { Message = string.Format(“RegUser:Username:{0},Password:{1}”, user.Name, user.PassWord), Ctime = DateTime.Now }; Console.WriteLine(“日志已记录,Message:{0},Ctime:{1}”,log.Message,log.Ctime); var messagereturn = getNext()(input, getNext); return messagereturn; } }
定义对应的HandlerAttribute
using Microsoft.Practices.Unity.InterceptionExtension;using Microsoft.Practices.Unity;public class UserHandlerAttribute : HandlerAttribute { public override ICallHandler CreateHandler(IUnityContainer container) { ICallHandler handler = new UserHandler(){Order=this.Order}; return handler; } }public class LogHandlerAttribute:HandlerAttribute { public int Order { get; set; } public override ICallHandler CreateHandler(IUnityContainer container) { return new LogHandler() { Order = this.Order }; } }
[LogHandlerAttribute(Order=2)] [UserHandlerAttribute(Order=1)] public interface IUserProcessor { void RegUser(User user); }public class UserProcessor : MarshalByRefObject,IUserProcessor { public void RegUser(User user) { Console.WriteLine(“用户已注册。”); } }
客户端调用
using Microsoft.Practices.EnterpriseLibrary.PolicyInjection; public class Client { public static void Run() { try { User user = new User() { Name = “lee”, PassWord = “123123123123” }; UserProcessor userprocessor = PolicyInjection.Create<UserProcessor>(); userprocessor.RegUser(user); } catch(Exception ex) { throw ex; } } }
有理论还需要实践。为此,我花了两周的业余时间,使用Visual Studio 2015开发了一个案例项目:WeText。这个案例项目的业务还是很简单的:用户可以注册、登录,登录后可以修改个人信息,然后可以创建一些自己的Text(就是含有标题和文本内容的小笔记),还可以发送加好友申请给其他用户,等对方接受邀请后,可以将自己的Text分享给对方。到我写本文为止,Text分享部分还没有完成,但其它业务部分基本已经走通,可能还有不少Bug。