mybatis第一天mybatis基础知识
教学思路:
整个教学思路以订单商品的项目作为驱动。
mybatis第一天:基础知识
mybatis是一个java持久层框架,java中操作关系型数据库用的是jdbc,mybatis是对jdbc的一个封装。
1、从一个jdbc程序开始,通过jdbc 程序找到使用原生态的jdbc开发程序,存在哪些问题??通过学习mybatis,mybatis是如何解决这些问题。
2、mybatis的架构(重点)
3、mybatis的入门程序(重点)
实现用户的查询、添加、修改、删除。
4、mybatis开发dao的两种方法。(重点)
原始的dao开发方式(dao接口和dao实现都需要编写)
mapper代理方式(只需要写dao接口)
5、输入映射类型和输出映射类型。
6、动态sql
第二天:高级知识
高级映射查询(一对一、一对多、多对多)(重点)
查询缓存
延迟加载
mybatis和spring整合(重点)
mybatis逆向工程。
1开发环境
jdk1.7.0_72
eclipse:eclipse-3.7-indigo
mysql:mysql5.1
1.1创建数据库
先导入sql_table.sql,再导入sql_data.sql(记录系统的初始化数据)
通常需要提供初始化数据的数据库脚本。
2jdbc编程中问题
企业开发中,根据项目大小、特点进行技术选型,jdbc操作数据库时效率是很高的,jdbc也是技术选型的参考。
2.1jdbc程序
参考教案
需要数据库的驱动包:
上边是mysql的驱动,下边是oracle的驱动。
2.2jdbc问题总结
1、数据库连接频繁的创建和关闭,缺点浪费数据库的资源,影响操作效率
设想:使用数据库连接池
2、sql语句是硬编码,如果需求变更需要修改sql,就需要修改java代码,需要重新编译,系统不易维护。
设想:将sql语句统一配置在文件中,修改sql不需要修改java代码。
3、通过preparedStatement向占位符设置参数,存在硬编码(参数位置,参数)问题。系统不易维护。
设想:将sql中的占位符及对应的参数类型配置在配置文件中,能够自动输入映射。
4、遍历查询结果集存在硬编码(列名)。
设想:自动进行sql查询结果向java对象的映射(输出映射)。
3mybatis架构(重点)
3.1mybatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。目前mybatis在github上托管。git (分布式版本控制,当前比较流程)
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
3.2mybatis架构
4 mybatis 入门程序
4.1 需求
实现用户查询: 根据用户id (主键)查询用户信息(单条记录)
根据用户名称模糊查询用户信息(多条记录)
用户添加
用户删除
用户修改
4.2导入jar包
从mybatis管网下载(地址:https://https://www.doczj.com/doc/9e9689111.html,/mybatis/mybatis-3/releases)
mybatis-3.2.7.pdf---操作手册
mybatis-3.2.7.jar--核心jar包
依赖的jar包
4.3工程结构
4.4log4j.properties(公用文件)
# Global logging configuration,建议开发环境中要用debug
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
https://www.doczj.com/doc/9e9689111.html,yout=org.apache.log4j.PatternLayout https://www.doczj.com/doc/9e9689111.html,yout.ConversionPattern=%5p [%t] - %m%n
4.5SqlMapConfig.xml(公用文件)
通过SqlMapConfig.xml加载mybatis运行环境。
4.6根据id查询用户
4.6.1pojo(User.java)
4.6.2User.xml(重点)
建议命名规则:表名+mapper.xml
早期ibatis命名规则:表名.xml
4.6.3编码创建SqlSessionFactory:
4.7根据用户名称模糊查询用户信息根据用户名称模糊查询用户信息可能返回多条记录。
4.7.1User.xml
4.7.2编码
4.7.3使用${}接收参数
4.8mybatis开发过程小结
1、编写SqlMapConfig.xml
2、编写mapper.xml
定义了statement
3、编程通过配置文件创建SqlSessionFactory
4、通过SqlSessionFactory获取SqlSession
5、通过SqlSession操作数据库
如果执行添加、更新、删除需要调用https://www.doczj.com/doc/9e9689111.html,mit() 6、SqlSesion使用完成要关闭
4.9用户添加
向用户表插入一条记录。
4.9.1User.xml
4.9.2编码
4.9.3主键返回
需求:user对象插入到数据库后,新记录的主键要通过user对象返回,通过user获取主键值。
解决思路:
通过LAST_INSERT_ID()获取刚插入记录的自增主键值,在insert语句执行后,执行select LAST_INSERT_ID()就可以获取自增主键。
User.xml修改:
使用mysql的uuid机制生成主键:
使用uuid生成主键的好处是不考虑数据库移植后主键冲突问题。
实现思路:
先查询uuid得到主键,将主键设置到user对象中,将user对象插入数据库。
实现oracle数据库主键返回,如何做??
oracle没有自增主键机制,使用序列完成主键生成。
实现思路:
先查询序列得到主键,将主键设置到user对象中,将user对象插入数据库。
4.10用户删除和更新
4.10.1编码
// 测试根据id删除用户(得到单条记录)
@Test
public void testDeleteUser() {
// 通过sqlSessionFactory创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过sqlSession操作数据库
try {
sqlSession.delete("test.deleteUser", 35);
// 需要提交事务
https://www.doczj.com/doc/9e9689111.html,mit();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭sqlSession
sqlSession.close();
}
}
// 测试根据id更新用户(得到单条记录)
@Test
public void testUpdateUser() {
// 通过sqlSessionFactory创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过sqlSession操作数据库
// 创建更新数据对象,要求必须包括 id
User user = new User();
user.setId(35);
user.setUsername("燕青");
user.setAddress("河南郑州");
// user.setBirthday(new Date());
user.setSex("1");
try {
sqlSession.update("test.updateUser", user);
// 需要提交事务
https://www.doczj.com/doc/9e9689111.html,mit();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭sqlSession
sqlSession.close();
}
System.out.println("用户的id=" + user.getId());
}
4.11Mybatis解决jdbc编程的问题
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解
析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
4.12mybatis与hibernate重要区别
企业开发进行技术选型,考虑mybatis与hibernate适用场景。
mybatis:入门简单,程序容易上手开发,节省开发成本。mybatis需要程序员自己编写sql语句,是一个不完全的ORM框架,对sql修改和优化非常容易实现。
mybatis适合开发需求变更频繁的系统,比如:互联网项目。
hibernate:入门门槛高,如果用hibernate写出高性能的程序不容易实现。hibernate不用写sql语句,是一个ORM 框架。
hibernate适合需求固定,对象数据模型稳定,中小型项目,比如:企业OA系统。
总之,企业在技术选型时根据项目实际情况,以降低成本和提高系统可维护性为出发点进行技术选型。
4.13总结
4.13.1S qlMapConfig.xml
是mybatis全局配置文件,只有一个,名称不固定的,主要mapper.xml,mapper.xml中配置sql语句
4.13.2m apper.xml
mapper.xml是以statement为单位进行配置。(把一个sql称为一个statement),satatement中配置sql语句、parameterType输入参数类型(完成输入映射)、resultType输出结果类型(完成输出映射)。
还提供了parameterMap配置输入参数类型(过期了,不推荐使用了)
还提供resultMap配置输出结果类型(完成输出映射),明天重点讲通过resultMap完成复杂数据类型的映射(一对多,多对多映射)
4.13.3#{}
表示一个占位符,向占位符输入参数,mybatis自动进行java类型和jdbc类型的转换。
程序员不需要考虑参数的类型,比如:传入字符串,mybatis最终拼接好的sql就是参数两边加单引号。
#{}接收pojo数据,可以使用OGNL解析出pojo的属性值
4.13.4${}
表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。
${}也可以接收pojo数据,可以使用OGNL解析出pojo的属性值
缺点:不能防止sql注入。
4.13.5s electOne
用于查询单条记录,不能用于查询多条记录,否则异常:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4
4.14selectList
用于查询多条记录,可以用于查询单条记录的。
5mybatis开发dao的方法
5.1SqlSession作用范围
是使用局部变量、成员变量。。。。???
5.1.1SqlSessionFactoryBuilder
SqlSessionFactoryBuilder是以工具类方式来使用,需要创建sqlSessionFactory就new一个SqlSessionFactoryBuilder。
5.1.2sqlSessionFactory
正常开发时,以单例方式管理sqlSessionFactory,整个系统运行过程中sqlSessionFactory只有一个实例,将来和spring整合后由spring以单例方式管理sqlSessionFactory。
5.1.3SqlSession
sqlSession是一个面向用户(程序员)的接口,程序员调用sqlSession的接口方法进行操作数据库。
sqlSession能否以单例方式使用??
由于sqlSession是线程不安全,所以sqlSession最佳应用范围在方法体内,在方法体内定义局部变量使用sqlSession。
5.2原始dao开发方式
程序员需要写dao接口和dao 的实现类
5.2.1dao接口
5.2.2dao接口实现
5.2.3测试代码
5.3mapper代理的方式
程序员只需要写dao接口,dao接口实现对象由mybatis自动生成代理对象。
本身dao在三层架构中就是一个通用的接口。
5.3.1上边原始dao开发方式的问题
1 dao的实现类中存在重复代码,整个mybatis操作的过程代码模板重复(先创建sqlsession、调用sqlsession的方法、关闭sqlsession)
2、dao的实现类中存在硬编码,调用sqlsession方法时将statement的id硬编码。
5.3.2mapper开发规范
要想让mybatis自动创建dao接口实现类的代理对象,必须遵循一些规则:
1、mapper.xml中namespace指定为mapper接口的全限定名
此步骤目的:通过mapper.xml和mapper.java进行关联。
2、mapper.xml中statement的id就是mapper.java中方法名
3、mapper.xml中statement的parameterType和mapper.java中方法输入参数类型一致
4、mapper.xml中statement的resultType和mapper.java中方法返回值类型一致.
5.3.3mapper.xml(映射文件)
mapper映射文件的命名方式建议:表名Mapper.xml
namespace指定为mapper接口的全限定名
5.3.4mapper接口
mybatis提出了mapper接口,相当于dao 接口。
mapper接口的命名方式建议:表名Mapper
一般现在时 (1)构成: 一般现在时主要用动词原形表示,主语为第三人称单数时,要用动词的第三人称单数形式,即动词词尾加-s或-es。另外,be动词和 have有特殊的人称形式。 (2)用法:①表示经常发生的动作或存在的状态,常和always,usually,often,sometimes,everyday,every week等时间状语连用。 如He is often late for meeting. 他常常开会迟到。 They take a rest on Sundays. 他们星期天休息。 ②表示客观真理。由于是众所周知的客观事实,所以一般不用时间状语。 如The earth moves around the sun. 地球绕着太阳转。 Americans speak English. 美国人说英语。 频率副词 频率副词在句中通常放在实义动词之前, be动词或助动词之后。 它们所表示的含义和频率是不同的,从高到低依次是: ●always意为“总是”,表示动作的重复或状态的延续。(always=all the time ) ●usually意为“通常”, 表示很少有例外。 ●often意为“经常”,表示动作的重复,但不如usually那么频繁,中间有间断。 ●sometimes意为“有时”,表示动作偶尔发生。 ●hardly意为“几乎不”,常和ever连用表示强调。 ●never意为“从未”。(hardly 和never 表示否定。)
Do you know their difference? ?sometimes = at times 有时(一般用于一般现在时)?sometime 某个时间(一般用于将来时)?some time 一段时间 ?some times 几次;几倍(表示次数或倍数) I sometimes go to school by bus. 我有时坐公共汽车去上学。 I will go to America sometime this year. 我将要在今年的某个时候去美国。 I have been to the Great Wall for some times. 我已经去过好几次长城了。 I watched TV for some time last night. 我昨天晚上看了一会儿电视。 根据汉语句子,用适当的频率副词或表示频率的词组完成英文句子。 1. 有钱人未必总是幸福的。 The rich are not always happy. 2. 他通常7点钟去学校。 He usually goes to school at seven o’clock. 3. 他上学经常迟到。 He is often late for school. 4. 天气忽冷忽热。 It is sometimes cold and sometimes hot. 5. 这些天我几乎不出门。 I hardly ever go out these days. 6. 我父母从不吵架。
光网络技术课程综述 ——你所了解光网络的主要技术、发展及其应用 (10 级电子与通信工程丁彦学号:1039227010) 光纤通信是以光波为载波,以光纤为传输介质的一种通信方式。 随着通信网传输容量的不断增加,光纤通信也发展到了一定的高度。 但是目前的光纤通信技术存在不少弊端,急需对其进行改进。为了 解决这些弊端,人们提出了光网络。光网络以其良好的透明性、波 长路由特性、兼容性和可扩展性,已成为下一代高速宽带网络的首选。这里的光网络,是指全光网络(All Optical Network,AON)。 1 全光网络的概念 全光网络是指光信息流从源节点到目的节点之间进行传输与交
换中均采用光的形式,即端到端的完全的光路,中间没有电信号的 介入,在各网络节点的交换,则使用高可靠、大容量和高度灵活的光交叉连接设备(OXC)。它是建立在光时分复用(OTDM)或者密集波分复用(DWDM)基础上的高速宽带信息网。 2 全光网络的特点 全光网络的发明与运用,可以不用在源节点与目的节点之间的光网络的主要技术、发展及其应用 换、电光交换,弥补了传统光纤通信中存在的带各节点进行光电交 话、时钟偏移、高功耗等一些不足,拥有更强的可宽限制、严重串灵活性。管理性、透明性、 信系统相比,具有以下一些特点:全光网络与传统通 节约成本。1) 需要进行光电转换,这就避免使用传统通不由于全光网络中 电转换器材,节省这些昂贵的器材费用,也克光信系统中需要的 电子器件处理信号速率难以提高的困难,大大于服了传输途中由
此外,在全光网络中,大多会采用无源光学器提高了传输速率。本和功耗的降低。成件,这也带来了 组网灵活。2) 通信容量的需求,在任何节点都能抽出或全光网络可以根据 态地改变网络结构,组网极具灵活性。当出现加入某个波长,动 光网络可以提供临时连接,达到充分利用网络资突发业务时,全源的目的。 透明性好。3) 复用技术,以波长选择路由,对传输码率、分全光网络采用波 方式等具有透明性。可方便地提供多种协议的数据格式以及调制业务。 可靠性高。4) 要光电转换,在传输过程中没有存储和变在全光网络中不需 的可靠极大地提高了传器件都是无源的,输光换,采用的许多丁彦1039227010
单选题 1.互联网的特点是()。(3.0分) A.面向连接、电路交换 B.面向连接、分组交换 C.无连接、电路交换 D.无连接、分组交换 我的答案:D?√答对 2.发展新一代移动通信,()问题是关键。( 3.0分) A.频率 B.带宽 C.技术 D.基站 我的答案:C?×答错 3.下一代光通信最核心的技术是()。(3.0分) A.光的频分复用 B.光的波分复用 C.光的电路交换 D.光的分组交换 我的答案:B?×答错 4.1993年,从()接了一条电路通到斯坦福大学,是中国第一条连接到国际互联网的通路。(3.0分)
A.中科院理化技术研究所 B.中国科技大学过程工程研究所 C.中科院高能物理研究所 D.清华大学大气物理研究所 我的答案:C?√答对 5.目前,中国在()中,Ipv6应用规模最大。(3.0分) A.教育科研网 B.科学技术网 C.公用互联网 D.金桥信息网 我的答案:A?√答对 6.1999年,()的秘书长发了一封函,肯定了电信业未来会转向IP网络。(3.0分) A.国际标准化组织(ISO) B.麻省理工学院(MIT) C.国际电信联盟(ITU) D.美国电气和电子工程师协会(IEEE) 我的答案:C?√答对 7.现在的移动通信技术依靠的是(),需要有基站、频率和网络规划。(3.0分) A.模拟通信 B.蜂窝通信 C.互联网通信 D.码分多址通信
我的答案:B?√答对 8.现阶段,公共互联网的性能改进主要依靠()方法来实现。(3.0分) A.演化法 B.重叠法 C.革命法 D.归纳法 我的答案:D?×答错 9.()的目的是发展移动多媒体通信。(3.0分) A.第一代移动通信 B.第二代移动通信 C.第三代移动通信 D.第四代移动通信 我的答案:C?√答对 10.“360-QQ大战”侵犯的是()的权益。(3.0分) A.360.0 B.QQ C.360和QQ D.消费者 我的答案:D?√答对 多选题 1.Ipv6的优势体现在()。(4.0分)) A.扩展大量地址空间
Excel课堂笔记:课堂笔记 上课笔记:一、快速整理表格:1、取消合并单元格:开始——合并并居中2、选择连续区域:选中首个单元格,按shift键,单击末尾单元格3、F5 定位空值4、CTRL+ENTER 同步录入5、选择性粘贴值右键-复制,右键-粘贴值6、查找与替换CTRL+H-打开替换对话框-输入查找内容和替换内容选择技巧1、CTRL+SHIFT +方向键在一个连续区内选择2、Shift+方向键一行行一列列选择3、CTRL+方向键在连续区内跳转4、CTRL+A 全选应用表格样式开始-套用表格样式序列的快速填充:①输入1,2——选中两个单元格-左下角出现实心十字标志时双击鼠标②开始-填充-系列——选择位置——输入步长值、终止值日期的快速填充:不更新的日期:①CTRL+;日期②SHIFT+CTRL+;时间更新的日期:=today()=time()“贵族表”的功能:①表头跟着走②自动扩充行与列③计算列的创建④汇总行的创建:表格设计选项卡-汇总行前面打钩⑤转换成普通区域:表格设计选项卡-转换成区域公式与函数三种引用方式相对引用(行标列标面前都没有$符号):公式与引用的单元格相对位置保持不变绝对引用(行标列标面前都有$符号):引用的位置绝对发生不变混合引用(行标列标面前只有一个有$符号):只有一个方向位置发生变化用F4键快速切换4种引用状态,原则:给谁前谁就不走函数的基本语法:=函数(参数)常用函数:=sum(范围)求和=average (范围)平均值=max(范围) 最大值=min(范围) 最小值=count(范围) 计数(只能对数字进行计数)=product(范围) 乘积=counta(范围) 对非空单元格计数If函数=if(条件判断式,真值,假值)条件统计函数countif(条件范围,条件)单条件计数countiFs(条件范围1,条件1,条件范围2,条件2.。。。。。)多条件计数sumif(条件范围,条件,求和范围)单条件求和sumifs(求和范围,条件范围1,条件1,条件范围2,条件2.。。。) 多条件求和查找函数:vlookup(查询对象,数据源,显示序列,匹配参数)数据源:1、首列必须包含查询对象#N/A2、显示对象必须位于数据源当中#ref3、必须选择一个连续区不让敲回车4、查询对象一定要位于显示对象左列查询对象:数据类型必须与首列数据类型保持一致匹配序列:必须是数字,位于数据源的第几列匹配参数:0、False 精确查询1、True:模糊查询模糊查询一定要升序排列四、辅助功能的应用1、数据有效性:序列的设置方法:选择需要设置的单元格——数据选项卡——数据有效性——序列——数据源的选择2、分列按符号分列按宽度分列分列的应用:强制转换格式(比如数字转换成文本,文本转换成数字)3、分类汇总:要求:必须要先排序排序后——数据选项卡——分类汇总4、数据透视表1、鼠标放在数据源中——插入选选项卡——插入数据透视表2、秘诀:①想看哪里拖哪里②右键修改格式3、应用场景每一个城市销售总金额每一个城市每一个销售的销售总金额每一个城市每一个销售每一个产品的销售总金额每一个城市的总订单数每一个城市的订单数百分比每一个季度的销售总金额不同范围价格内的总销售额6、合并计算两种方式:①按标签合并②按位置合并区别在于,如果是按照标签进行合并的话,需要把合并计算对话框中下方的标题行以及左列前面的勾勾上。
在很多Web应用中,为了完成不同的工作,一个HTML form标签中可能有两个或多个submit 按钮,如下面的代码所示: