首页 文章 精选 留言 我的

精选列表

搜索[监督学习],共10000篇文章
优秀的个人博客,低调大师

13.Swift学习之函数

函数的介绍 函数相当于OC中的方法 函数的格式如下 func 函数名(参数列表) -> 返回值类型 { 代码块 return 返回值 } func是关键字,多个参数列表之间可以用逗号,分隔,也可以没有参数 使用箭头->指向返回值类型 如果函数没有返回值,返回值为Void 并且-> 返回值类型部分可以省略 常见的函数类型 没有参数,没有返回值 func about() -> Void { print("iPhone Xs Max") } // 调用函数 about() // 简单写法 // 如果没有返回值,Void可以写成() func about1() -> () { print("iPhone Xs Max") } about1() // 如果没有返回值,后面的内容可以都不写 func about2() { print("iPhone Xs Max") } about2() 有参数,没有返回值 func call(phoneNum : String) { print("打电话给\(phoneNum)") } call("18888888888") 没有参数,有返回值 func readMessage() -> String { return "吃饭了吗?" } var str = readMessage() print(str) 有参数,有返回值 func sum(num1 : Int, num2 : Int) -> Int { return num1 + num2 } var result = sum(num1: 20, num2: 30) print(result) 返回值为复杂类型 import Foundation func triple(info:String) -> (name:String, age:Int) { let infos = info.components(separatedBy: ",") return (infos[0], Int(infos[1])!) } let p:(name:String, age:Int) = triple(info: "zhangsan,20") p.name p.age 函数的使用注意 注意一: 函数的参数虽然没有用var和let修饰,但它是常量,不能在函数内修改 func say(message:String) { //报错:Cannot assign to value: 'message' is a 'let' constant message = "Hello Swift" print("说话内容:\(message)") } 注意二: 每一个函数的形式参数都包含形式参数标签和形式参数名两部分 形式参数标签用在调用函数的时候 形式参数名用在函数的实现当中 在调用函数的时候每一个形式参数前边都要写形式参数标签 默认情况下,形式参数使用它们的形式参数名作为形式参数标签 如果不想要形式参数标签,可以在参数名称前加 _ func minus(num1 a :Int,num2 b:Int) -> Int { return a - b } minus(num1: 5, num2: 2) func multi(_ a :Int,_ b:Int) -> Int { return a * b } multi(2, 3) 注意三: 默认参数 某些情况,如果没有传入具体的参数,可以使用默认参数 func makecoffee(type :String = "卡布奇诺") -> String { return "制作一杯\(type)咖啡。" } let coffee1 = makecoffee(type: "拿铁") let coffee2 = makecoffee() 注意四: 可变参数 Swift中函数的参数个数可以变化,可接受不确定数量的参数 参数必须具有相同的类型 可以通过在参数类型名后面加入... 的方式来指示可变参数 func total(numbers:Int...) -> Int { var sum = 0 for i in numbers { sum += i } return sum } total() total(numbers:10) total(numbers:10,20) total(numbers:10,20,30) 注意五: 引用类型(指针的传递) 默认情况下,函数的参数是值传递.如果想改变外面的变量,则需要传递变量的地址 Swift提供的inout关键字可以实现 func swapInt(a: inout Int, b: inout Int) { let tmp = a a = b b = tmp } var a = 10 var b = 20 print("a=\(a), b=\(b)") swapInt(a: &a, b: &b) print("a=\(a), b=\(b)") 注意六: 函数的嵌套使用 Swift中函数可以嵌套使用 即函数中包含函数,但是不推荐该写法 // 函数的嵌套 let value = 55 func test() { func demo() { print("demo \(value)") } print("test") demo() } demo() // 错误 test() // 执行函数会先打印'test',再打印'demo' 函数的类型 函数类型的概念 函数是引用类型 每个函数都有属于自己的类型,由函数的参数类型和返回类型组成 有了函数类型以后,就可以把函数类型像Int、Double、Array来用 下面的例子中定义了两个函数:addTwoInts 和 multiplyTwoInts,这两个函数都传入两个 Int 类型参数,返回一个Int类型值,因此这两个函数的类型是 (Int, Int) -> Int // 定义两个函数 func addTwoInts(a : Int, b : Int) -> Int { return a + b } func multiplyTwoInt(a : Int, b : Int) -> Int { return a * b } 抽取两个函数的类型,并且使用 // 定义函数的类型 var mathFunction : (Int, Int) -> Int = addTwoInts // 使用函数的名称 mathFunction(10, 20) // 给函数类型变量赋值其他值 mathFunction = multiplyTwoInt // 使用函数的名称 mathFunction(10, 20) 函数作为函数的参数 // 将函数的类型作为函数的参数 func printResult(a : Int, b : Int, calculateMethod : (Int, Int) -> Int) { print(calculateMethod(a, b)) } printResult(a: 10, b: 20, calculateMethod: addTwoInts) printResult(a: 10, b: 20, calculateMethod: multiplyTwoInt) 函数作为函数的返回值 //定义两个函数 func addTwoInts(a : Int, b : Int) -> Int { return a + b } func multiplyTwoInt(a : Int, b : Int) -> Int { return a * b } //函数作为返回值 func getResult(a:Int) -> (Int, Int)->Int{ if a > 10 { return addTwoInts } else{ return multiplyTwoInt } } //调用返回的函数 getResult(a: 2)(10,20) getResult(a: 12)(10,20)

优秀的个人博客,低调大师

10.Swift学习之字典

字典的介绍 字典是由键值(key:value)对组成的集合 字典中的元素之间是无序的 字典是由两部分集合构成的,一个是键集合,一个是值集合 字典是通过访问键间接访问值的 键集合是不能有重复元素的,而值集合是可以重复的 Swift中的字典类型是Dictionary,也是一个泛型集合 字典的初始化 Swift中的可变和不可变字典 使用let修饰的字典是不可变字典 使用var修饰的字典是可变字典 // 定义一个可变字典 var dict1 : [String : Any] = [String : Any]() // 定义一个不可变字典 let dict2 : [String : Any] = ["name" : "zhangsan", "age" : 18] 在声明一个Dictionary类型的时候可以使用下面的语句之一 var dict1: Dictionary<Int, String> var dict2: [Int: String] 声明的字典需要进行初始化才能使用,字典类型往往是在声明的同时进行初始化的 // 定时字典的同时,进行初始化 var dict:[String : Any] = ["name" : "zhangsan", "age" : 18] // Swift中任意类型用Any表示 var dict : Dictionary<String, Any> dict = ["name" : "zhangsan", "age" : 18] 字典的基本操作 获取长度 dict.count 判空 dict.isEmpty 添加数据 dict["height"] = 1.80 dict["weight"] = 70.0 print(dict) 删除字段 dict.removeValue(forKey: "height") print(dict) 修改字典 //方式一 dict["name"] = "lisi" //方式二 dict.updateValue("lisi", forKey: "name") print(dict) 查询字典 // 可选型 dict["name"] 字典的遍历 遍历字典中所有的值 for value in dict.values { print(value) } 遍历字典中所有的键 for key in dict.keys { print(key) } 遍历所有的键值对 //常用 for (key, value) in dict { print("\(key) --- \(value)") } 枚举方式遍历 //输出的不是key-value,而是索引和(key:value) for (index, value) in dic.enumerated() { print("\(index) -- \(value)") //0 -- (key: "name", value: "zhangsan") //1 -- (key: "age", value: 18) } 字典的合并 // 字典的合并 var dict1: [String : Any] = ["name" : "zhangsan", "age" : 20] var dict2: [String : Any] = ["height" : 1.80, "phoneNum" : "18888888888"] // 字典合并不能像数组那样直接用+ for (key, value) in dict2 { dict1[key] = value } print(dict1) //["phoneNum": "18888888888", "name": "zhangsan", "age": 20, "height": 1.8]

优秀的个人博客,低调大师

5.Swift学习之元组

元组的介绍 元组是Swift中特有(Python中也有),OC中并没有类型 定义与含义 一种数据结构 可以用于定义一组数据 组成元组的数据可以称为“元素” 元组的定义 元组的常见写法 // 使用元组描述一个人的信息 var one = ("1001", "张三", 30, 90) // 给元素加上名称,之后可以通过名称访问元素 var two = (id:"1001", name:"张三", OC_score:80, iOS_score:90) 上面两种写法,查看一下one与two的类型有什么不同 var one: (String, String, Int, Int) var two: (id: String, name: String, OC_score: Int, iOS_score: Int) 元组的简单使用 用元组来描述一个错误信息 // 写法一: let error = (404, "Not Found") //下标访问 print(error.0) print(error.1) // 写法二: let error = (errorCode : 404, errorInfo : "Not Found") //别名访问 print(error.errorCode) print(error.errorInfo) // 写法三: //定义元组变量接收元素的值 let (errorCode, errorInfo) = (404, "Not Found") print(errorCode) print(errorInfo)

优秀的个人博客,低调大师

9.Swift学习之数组

数组的介绍 数组(Array)是一堆有序的由相同类型元素构成的集合 数组中的元素是有序的,可重复出现 Swift用Array表示数组,是一个泛型集合(泛型后面会讲,现在可理解为指定数组里面放什么类型的数据) 与OC数组的区别 Array是一个结构体,而不是一个类 可以放普通类型 数组的初始化 数组分成:可变数组和不可变数组 使用let修饰的数组是不可变数组 使用var修饰的数组是可变数组 // 定义一个可变数组,必须初始化才能使用 var array1 : [String] = [String]() // 定义一个不可变数组 let array2 : [NSObject] = ["zhangsan", 18] 在声明一个Array类型的时候可以使用下列的语句之一 var stuArray1 : Array<String> //语法糖 var stuArray2 : [String] 声明的数组需要进行初始化才能使用,数组类型往往是在声明的同时进行初始化的 // 定义时直接初始化 var array = ["zhangsan", "lisi", "wangwu"] // 先定义,后初始化 var array : Array<String> array = ["zhangsan", "lisi", "wangwu"] 对数组的基本操作 获取长度 array.count 判空 array.isEmpty 添加数据 array.append("zhaoliu") 插入元素 array.insert("haojian", at: 0) 删除元素 array.removeFirst() 修改元素 array[0] = "wangqi" 取值 array[1] array.first 倒序 array.reverse() 数组的遍历 普通遍历 for i in 0..<array.count { print(array[i]) } for in方式 for item in array { print(item) } 设置遍历的区间 for item in array[0..<2] { print(item) } 元组方式遍历 let names = ["zhangsan", "lisi", "wangwu"] for (index, name) in names.enumerated() { print(index) print(name) } 数组的合并+ // 数组合并 // 注意:只有相同类型的数组才能合并 var array = ["zhangsan", "lisi", "wangwu"] var array1 = ["zhaoliu", "wangqi"] var array2 = array + array1; //虽然不报错,但是不建议一个数组中存放多种类型的数据 var array3 : [Any] = [2, 3.0, "zhangsan"] var array4 : [Any] = ["lisi", true] var array5 : [Any] = array3 + array4

优秀的个人博客,低调大师

7.Swift学习之循环

循环的介绍 在开发中经常会用到循环 常见C/OC的循环有:for/while/do while. Swift中对应的为:for/while/repeat while. for循环的写法 C风格 循环(淘汰) // 传统写法 已经在Swift3中淘汰 for var i = 0; i < 10; i++ { print(i) } for in 循环 for i in 0..<10 { print(i) } for i in 0...10 { print(i) } 特殊写法 如果在for循环中不需要用到下标i for _ in 0..<10 { print("hello") } while和repeate while循环 while循环 while的判断句必须有正确的真假,没有非0即真 while后面的()可以省略 var a = 0 while a < 10 { print(b) // a++已经在Swift3之后淘汰 a = a + 1 } repeat while循环 var b = 0 repeat { print(b) b = b + 1 } while b < 20

优秀的个人博客,低调大师

2018-09-23学习笔记

Android Material Design 实战 之第一弹——Toolbar详解 Material Design 实战 之第二弹——滑动菜单详解&实战(DrawerLayout & NavigationView) Material Design 实战 之第三弹—— 悬浮按钮和可交互提示(FloatingActionButton & Snackbar & CoordinatorLayout) 本地模拟服务器开发与交互——Apache服务器填坑之路(下载、安装、使用demo、卸载) AVD Nexus_5X_API_24 is already running. If that is not the case, delete the files at C:....a... 课业笔记 ROS机器人程序设计 机器人程序设计_ROS_note1 机器人程序设计_ROS_note2 VMware Workstation14.1.3 & Ubuntu18.04从安装到实用的填坑之路 ROS安装全过程(十分壮观,是个大坑来的) 硬件编程 Keil uVision4起步简单编程 __note1 RFID课程前置——SQL巩固练习

优秀的个人博客,低调大师

2018-09-02学习笔记

Content Provider 总结: 跨程序共享数据——Content Provider 之 运行时权限解析以及申请的实现(可完美解决java.lang.SecurityException:Permission Denial 问题) 跨程序共享数据——Content Provider 之 ContentResolver基本用法 & 一个读取系统联系人的Demo 跨程序共享数据——Content Provider 之 创建自己的内容提供器 Content Provider 之 最终弹 实战体验跨程序数据共享(结合SQLiteDemo)(即本文) Java回顾: Java基础知识的全面巩固_note1(附各种demo code) Java知识详细巩固_note2(数组 _ 附demo code) 受腾讯云+社区的运营小编陈子龙前辈邀请, 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2iitqqr04f408 ——2018.9.3

优秀的个人博客,低调大师

Hadoop大数据开发框架学习

一.Hadoop框架介绍 hadoop是Apache发布的开源分布式基础架构他的两个核心是 HDFSHDFS是Hadoop的文件管理系统,负责了海量数据的存储,是做大数据的基础 MapReduceMapReduce则是为了海量数据提供了计算 两部分就组成了Hadoop的分布式基础架构 二.HDFS介绍 HDFS作为Hadoop为存储海量数据,自然有着与传统文件系统有着不同的结构,它是以Linux文件系统的基础的架构,构建里一套分布式文件系统,它是由一个NameNode和多台DataNode组成的。他通过将文件进行划分,分成多个数据块进行存储。(默认64MB,一般设置为128MB,备份X3)NameNode 管理文件系统的命名空间,存放文件元数据 维护文件系统的所有文件和目录,文件与数据块的映射 记录每个文件中各个块所在数据节点的信息 DataNode 存储并检索数据块 香NameNode更新所存储块的列表 优点 适合大文件存储,有副本策略 可以构建在廉价机器上,有一定容错和恢复机制 支持流式数据访问,一次写入多次读取 缺点 不适合大量小文件存储 不适合并发写入,不支持文件随机修改 不支持随机读等低延时的访问方式 二.Yarn yarn是Hadoop 中的资源管理器,MapReduce通过yarn来调度。ResourceManager 分配和调度资源 启动并监控ApplicationMaster 监控NodeManager ApplicationMaster 为MapReduce类型程序申请资源,并分配给内部任务 负责数据的切分 监控任务的执行与容错 NodeManager 管理单个节点的资源 处理来自ResourceManager的命令 处理来自ApplicationMaster的命令 四.MapReduce MapReduce采用分而治之的编程思想 输入一个大文件,通过split之后,将其分为多个分片 每个文件分片由单独的机器去处理,这就是Map方法 将每个机器计算的结果进行汇总并得到最终的结果,这就是Reduce方法

优秀的个人博客,低调大师

MyBatis学习笔记(二) 关联关系

一、一对一关系 还是通过例子来解释说明。(一个妻子对应一个丈夫)。 1)数据库信息 create table t_wife( id int primary key auto_increment, wife_name varchar(20), fk_husband_id int ); create table t_husband( id int primary key auto_increment, husband_name varchar(20) ); insert into t_husband values (null,'hello'); insert into t_wife values(null,'kitty',1) 2)对应的JavaBean代码 虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系。 HusbandBean.java package com.cy.mybatis.beans; import java.io.Serializable; /** * one to one * @author acer * */ public class HusbandBean implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; private WifeBean wife; public HusbandBean() { super(); } public HusbandBean(Integer id, String name, WifeBean wife) { super(); this.id = id; this.name = name; this.wife = wife; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public WifeBean getWife() { return wife; } public void setWife(WifeBean wife) { this.wife = wife; } @Override public String toString() { return "Husband [id=" + id + ", name=" + name + ", wife=" + wife + "]"; } } WifeBean.java package com.cy.mybatis.beans; import java.io.Serializable; /** * one to one * @author acer * */ public class WifeBean implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; private HusbandBean husband; public WifeBean() { super(); } public WifeBean(Integer id, String name, HusbandBean husband) { super(); this.id = id; this.name = name; this.husband = husband; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public HusbandBean getHusband() { return husband; } public void setHusband(HusbandBean husband) { this.husband = husband; } @Override public String toString() { return "Wife [id=" + id + ", name=" + name + ", husband=" + husband + "]"; } } 3)接下来建立两个接口,HusbandMapper,WifeMapper. HusbandMapper package com.cy.mybatis.mapper; import com.cy.mybatis.beans.HusbandBean; public interface HusbandMapper { /** * 根据id查询丈夫信息 * @param id * @return * @throws Exception */ public HusbandBean selectHusbandById (int id) throws Exception; /** * 根据id查询丈夫与妻子信息 * @param id * @return * @throws Exception */ public HusbandBean selectHusbandAndWife(int id) throws Exception; } 4)定义HusbandMapper.xml文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cy.mybatis.mapper.HusbandMapper"> <resultMap type="HusbandBean" id="husbandAndWife"> <id property="id" column="id" javaType="java.lang.Integer"/> <result property="name" column="name" javaType="java.lang.String"/> <!-- association – 一个复杂的类型关联;许多结果将包成这种类型 嵌入结果映射 – 结果映射自身的关联,或者参考一个 column="id" 这里的id指的是在t_wife表来的主键id 这个查询妻子,所以在妻子mapper里有个方法 --> <association property="wife" column="id" javaType="WifeBean" select="com.cy.mybatis.mapper.WifeMapper.selectWifeByHusbandId" ></association> </resultMap> <!-- resultType 返回类型 从这条语句中返回的期望类型的类的完全限定名或别名 。--> <select id="selectHusbandById" resultType="HusbandBean"> select * from t_husband where id=#{id} </select> <!-- resultMap 命名引用外部的 resultMap。返回的是一个集合。--> <select id="selectHusbandAndWife" resultMap="husbandAndWife"> select * from t_husband where id=#{id} </select> </mapper> 在WifeMapper.xml里有个方法 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cy.mybatis.mapper.WifeMapper"> <select id="selectWifeByHusbandId" resultType="WifeBean"> select * from t_wife where fk_husband_id = #{id} </select> </mapper> 5)写个实现 package com.cy.mybatis.service; import org.apache.ibatis.session.SqlSession; import com.cy.mybatis.beans.HusbandBean; import com.cy.mybatis.mapper.HusbandMapper; import com.cy.mybatis.tools.DBTools; public class OneToOneService { public static void main(String[] args) { selectHusbandAndWife(); } private static void selectHusbandAndWife() { SqlSession session = DBTools.getSession(); HusbandMapper hm = session.getMapper(HusbandMapper.class); try { HusbandBean husband = hm.selectHusbandAndWife(1); System.out.println(husband); session.commit(); } catch (Exception e) { e.printStackTrace(); } } } 注意:那个工具类还是前一章那样写的,就相当与在昨天的基础上建立的。 注意: mybatis实际是对XML进行操作,我们所有的方法都直接定义在XML中,写个接口只是为了更好的符合我们3层的思想,如果不写接口,直接通过session也可以直接操作xml中的方法 , XML中只要有方法,就可以使用,而调用的方式就是:namespace+方法名; 例外使用resultType时,一定要保证,你属性名与字段名相同; 如果不相同,就使用resultMap 。 二、一对多关系 还是通过例子来解释说明。(一把锁对应多把钥匙)。 2.1)数据库信息 这里没有添加数据了,我们用批量添加数据 create table t_key( id int primary key auto_increment, key_name varchar(20), fk_lock_id int ); create table t_lock( id int primary key auto_increment, lock_name varchar(20) ); 2.2) 实体类 KeyBean.java package com.cy.mybatis.beans; import java.io.Serializable; /** * manyTOone * * */ public class KeyBean implements Serializable { private static final long serialVersionUID = 3712545874604618746L; private Integer id; private String key; private LockBean lock; public KeyBean() { super(); } public KeyBean(Integer id, String key, LockBean lock) { super(); this.id = id; this.key = key; this.lock = lock; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public LockBean getLock() { return lock; } public void setLock(LockBean lock) { this.lock = lock; } @Override public String toString() { return "KeyBean [id=" + id + ", key=" + key + ", lock=" + lock + "]"; } } LockBean.java package com.cy.mybatis.beans; import java.io.Serializable; import java.util.List; /** * oneTOmany * * */ public class LockBean implements Serializable{ private static final long serialVersionUID = 7092410462131162665L; private Integer id; private String lock; private List<KeyBean> keys; public LockBean() { super(); } public LockBean(Integer id, String lock, List<KeyBean> keys) { super(); this.id = id; this.lock = lock; this.keys = keys; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getLock() { return lock; } public void setLock(String lock) { this.lock = lock; } public List<KeyBean> getKeys() { return keys; } public void setKeys(List<KeyBean> keys) { this.keys = keys; } @Override public String toString() { return "LockBean [id=" + id + ", keys=" + keys + ", lock=" + lock + "]"; } } 2.3) 建立接口 KeyMapper.java package com.cy.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import com.cy.mybatis.beans.KeyBean; public interface KeyMapper { /** * 批量添加钥匙 * @return * 提倡 这样使用 @Param("keys") */ public int batchSaveKeys(@Param("keys")List<KeyBean> keys); } LockMapper.java package com.cy.mybatis.mapper; import org.apache.ibatis.annotations.Param; import com.cy.mybatis.beans.LockBean; public interface LockMapper { /** * 添加锁 * @param lock * @return */ public int saveLock(@Param("lock")LockBean lock); /** * 根据ID查询锁的资料 * @param id * @return */ public LockBean findLockById(int id); /** * 根据ID查询锁与钥匙的资料 * one2many * @param id * @return */ public LockBean findLockAndKeys(int id); } 2.4) 建立xml文件 KeyMapper.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cy.mybatis.mapper.KeyMapper"> <resultMap id="keyMap" type="KeyBean"> <id property="id" column="id" javaType="java.lang.Integer"/> <result property="key" column="key_name" javaType="java.lang.String"/> </resultMap> <!--collection 为用于遍历的元素(必选),支持数组、List、Set --> <!-- item 表示集合中每一个元素进行迭代时的别名. --> <!--separator表示在每次进行迭代之间以什么符号作为分隔 符. --> <insert id="batchSaveKeys"> insert into t_key values <foreach collection="keys" item="key" separator=","> (null,#{key.key},#{key.lock.id}) </foreach> </insert> <select id="findKeysByLockId" resultMap="keyMap"> select * from t_key where fk_lock_id = #{id} </select> </mapper> LockMapper.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cy.mybatis.mapper.LockMapper"> <!--自定义返回类型 --> <resultMap id="lockMap" type="LockBean"> <id property="id" column="id" javaType="java.lang.Integer"/> <result property="lock" column="lock_name" javaType="java.lang.String"/> </resultMap> <!--自定义返回类型 --> <resultMap id="lockAndKeysMap" type="LockBean"> <id property="id" column="id" javaType="java.lang.Integer"/> <result property="lock" column="lock_name" javaType="java.lang.String"/> <collection property="keys" column="id" select="com.cy.mybatis.mapper.KeyMapper.findKeysByLockId"></collection> </resultMap> <insert id="saveLock"> insert into t_lock values (null,#{lock.lock}) </insert> <select id="findLockById" resultMap="lockMap"> select * from t_lock where id= #{id} </select> <select id="findLockAndKeys" resultMap="lockAndKeysMap"> select * from t_lock where id= #{id} </select> </mapper> 2.5 ) 实现 package com.cy.mybatis.service; import java.util.ArrayList; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.cy.mybatis.beans.KeyBean; import com.cy.mybatis.beans.LockBean; import com.cy.mybatis.mapper.KeyMapper; import com.cy.mybatis.mapper.LockMapper; import com.cy.mybatis.tools.DBTools; public class OneToManyService { public static void main(String[] args) { // saveLock(); // batchSaveKeys(); findLockAndKeys(); } private static void findLockAndKeys() { SqlSession session = DBTools.getSession(); LockMapper lm = session.getMapper(LockMapper.class); LockBean lock = lm.findLockAndKeys(1); System.out.println(lock); } private static void batchSaveKeys() { SqlSession session = DBTools.getSession(); LockMapper lm = session.getMapper(LockMapper.class); KeyMapper km = session.getMapper(KeyMapper.class); LockBean lock = lm.findLockById(1); List<KeyBean> keys = new ArrayList<KeyBean>(); for(int i = 0; i < 5; i++){ KeyBean key = new KeyBean(null, "钥匙"+i, lock); keys.add(key); } km.batchSaveKeys(keys); session.commit(); } private static void saveLock() { SqlSession session = DBTools.getSession(); LockMapper lm = session.getMapper(LockMapper.class); LockBean lock = new LockBean(null, "锁1", null); lm.saveLock(lock); session.commit(); } } 结果显示: 原文发布时间为:2018-08-30本文来自云栖社区合作伙伴“ 全栈开发者社区”,了解相关信息可以关注“ 全栈开发者社区”。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册