




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Mybatis第一天课堂笔记1 教学计划两天课:第一天:l Mybatis是什么?从一个jdbc程序开始:目标: 1、 重视 底层技术jdbc开发,企业中技术选型要考虑是否直接使用jdbc ,因为直接使用jdbc开发性能是很高的. 2、总结原始jdbc开发中存在问题?Mybatis框架原理?Mybatis有几个部分组成架构,基本运行原理。第一个mybatis程序: 实现增、删、改、查。总结mybatis如何解决原始jdbc开发中存在问题l 正式开始学习mybatisSqlSession是什么?如何使用?SqlMapConfig.xml(mybatis的全局配置文件)包括内容?第二天:Mapper.xml(mybatis的映射文件)包括哪内容? 主要包括mapped statement的定义(可以定义很多内容?) 基础动态Sql围绕数据库操作学习Mapper.xml,主要学习关联查询方法:一对一查询一对多查询多对多查询延迟加载Mybaits缓存:一级缓存二级缓存Mybaits和spring(springmvc)的整合,以一个案例来讲解如何整合?案例:企业采购流程企业中常用的逆向工程,由表生成使用类及xml文件等,企业在开发系统时,在设计阶段会设计数据库逻辑模型,会将数据库逻辑模型-数据库物理模型(表)mybatis逆向工程可以生成开发时需要po类、dao接口、xml等mybatis的文件。2 Mybatis是什么?2.1 Jdbc程序的问题准备环境:Jdk1.6.45Eclipse keplerTomcat 7Mysql5.1创建一个数据库:mybaits需求:使用jdbc查询user表的记录.Jdbc运行原理:Jdbc是java提供一套操作数据库接口。Java程序(Dao)Jdbc(一套操作数据库java接口)DatabaseMysql、oracel,使用sql语言数据库驱动(理解成jdbc接口实现)创建java工程:加入数据库驱动的jar包,加入mysql驱动包到“数据库驱动”目录:上边是mysql的驱动,下边是oracle的驱动。注意:驱动版本和数据库的版本要匹配。代码如下:public static void main(String args) Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try /加载数据库驱动Class.forName(com.mysql.jdbc.Driver);/通过驱动管理类获取数据库链接connection = DriverManager.getConnection(jdbc:mysql:/localhost:3306/mybatis?characterEncoding=utf-8, root, mysql);/定义sql语句 ?表示占位符 String sql = select * from user where username = ?;/获取预处理statementpreparedStatement = connection.prepareStatement(sql);/设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值preparedStatement.setString(1, 王五);/向数据库发出sql执行查询,查询出结果集,/preparedStatement.execute(sql)注意:executeQuery不要将sql作为参数resultSet = preparedStatement.executeQuery();/遍历查询结果集while(resultSet.next()System.out.println(resultSet.getString(id)+ +resultSet.getString(username); catch (Exception e) e.printStackTrace();finally/释放资源if(resultSet!=null)try resultSet.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();if(preparedStatement!=null)try preparedStatement.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();if(connection!=null)try connection.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();为什么要使用预编译的preparedStatement:好处:1、避免sql注入2、程序代码可读性更强,比使用sql拼接方法要可读!3、重点:使用预编译,数据库可以减少sql编译的次数,工作原理:Sql发出到数据库数据库会进行sql编译Sql编译后放入数据库缓存下次请求相同的sql数据库不需要重新编译了,直接从数据库缓存中取出已经编译好数据库对编译后sql放入缓存,使用占位符的预编译sql数据库会放入缓存,数据库将常用的sql放入缓存。一般情况下对字符串拼接的sql数据库不进行预编译。对上边jdbc程序问题总结:1、 将sql语句在java类中硬编码,不利于系统维护。比如:由于需求变更,需要在数据库表中添加字段,要查询该字段的内容,需要修改java类中的sql变量。设想解决:可以将sql语句抽取出来配置在xml文件,properties文件,如果要修改直接修改配置文件。2、 数据库连接频繁出现创建、关闭,会对数据库资源造成浪费。设想解决:使用数据库连接池统一管理数据库连接。3、 向statement中设置参数时需要将占位符的位置序号硬编码。设想解决:可以将参数及占位符号统一配置一下,自动进行参数设置。4、 遍历结果resultSet时,需要手动指定字段的名字,硬编码。如果添加表字段需要遍历,需要修改java代码.设想解决:自动将select的查询结果集映射成java对象。2.2 Mybaits框架原理MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。 Mybatis是ibatis一个升级版本。Mybatis是一个优秀持久层框架,是一个不完全的orm框架。1、sqlMapConfig.xml是mybatis全局配置文件,文件名不固定的。配置了数据源(连接池)、事务、全局变量。重要的配置mapper.xml是sqlMapConfig.xml需要加载很多的mapper.xml。mapper.xml主要配置了sql语句,sql语句在Mapped statement中配置。2、SqlSessionFactory会话工厂,创建SqlSession会话(内部有一个数据库连接),使用会话操作数据库(增、删、改、查)3、SqlSession SqlSession是一个接口,此接口是一个面向用户的接口,程序员通过调用Sqlsession操作数据库。 4、Executor执行器,是一个底层接口,SqlSession底层通过Executor操作数据库,Executor有两个基本的实现:普通执行器、缓存执行器。 5、Mapped statement是mybatis的一个封装对象,封装了Sql 语句,输入参数(将java对象映射到sql)、输出结果(将sql结果映射到java对象。)Executor执行器,通过Mapped statement里的内容操作数据库。Mybatis执行过程:1、 配置SqlMapConfig.xml、配置mapper.xml(配置了sql语句)2、 创建SqlSessionFactory,目的是要得到SqlsessionMybatis提供SqlSessionFactoryBuiler类创建会话工厂3、通过SqlSessionFactory创建Sqlsession,可以使用Sqlsession操作数据库 Sqlsession底层使用Executor执行器操作数据库,Executor要运行还需要上边在xml中配置的信息,mybatis自动将上边xml中配置信息加载到底层封装对象Mapped statement中,Executor按照Mapped statement中的配置信息执行操作数据库4、知道Executor按照Mapped statement中的配置信息执行过程首先需要将java对象信息映射到sql语句中,相当输入映射。将sql结果信息映射到java对象。Mybatsi执行核心:2.3 Mybatis第一个程序2.3.1 根据id查询用户信息第一步:创建java工程第二步:加入mybatis的jar包使用mybatis 3.2.3版本l 核心包:mybatis-3.2.3.jarl Lib/*是mybatis的依赖包l 数据库驱动jar包日志配置文件:perties第三步:配置SqlMapConfig.xml(文件名不固定)包括:数据库连接池、事务管理。还包括重要的配置:对mapper.xml进行加载第四步:编写mapper.xml(mybatis的映射文件)包括sql语句在select标签中定义sql语句,使用#表示占位符号 SELECT * FROM USER WHERE id=# 在输入映射的占位符中指定变量名,如果输入参数是一个pojo,变量名就是pojo的属性,如果是一个简单类型,由于使用#,在中指定变量名value或其它,如下: SELECT * FROM USER WHERE id=#value需要将sql查询结果集映射成java对象,使用resultType指定java对象类型,保证sql查询字段名和pojo的属性名一致定义pojo类:User.java将mapper.xml在SqlMapconfig.xml中加载。第五步:编写java类创建SqlSessionFactory从SqlSessionFactory中获得SqlSession调用SqlSession方法操作数据库public static void main(String args) throws IOException /指定mybatis的全局配置文件String resource = SqlMapConfig.xml;/创建SqlSessionFactoryInputStream inputStream= Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); /创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();/通过sqlSession操作数据库/第一个参数:指定mapper.xml中定义statement的id 等于:namespace+statement的id/第二个参数:输入给parameterType指定的参数/由于resultType指定输入映射类型是user,selectOne的结果是UserUser user = sqlSession.selectOne(test.findUserById, 1);System.out.println(user);/释放资源sqlSession.close();2.3.2 查询用户列表定义mapper.xml编写java程序:2.3.3 查询用户列表传入查询条件需求:根据性别和用户名称查询用户信息,用户名称要求使用模糊匹配。测试SQL:SELECT * FROM USER WHERE sex=1 AND username LIKE %张三%定义mapper.xml编写java程序:分析:调用SqlSession.selectList(statement的id,输入参数)问题:传入username,怎么知道加%?让程序员编码设置username的值是“张三”比较方便,而不是”%张三%”。实现:需要在mapper.xml中将%固定写在sql语句,这时不能用#占符,使用sql 拼接方法。sql 拼接方法:$不是占位符,表示将username的变量值不加任何修饰拼接在sql。使用$拼接sql测试结果:不建议使用$,会引起Sql注入。有时候必须使用$,比如,查询排序,排序字段是动态的,必须使用$如果使用#,传入的字符串,字符串要映射成jdbc类型,会自动添加单引号,最终结果:SELECT * FROM USER WHERE sex=1 AND username LIKE %张三%ORDER BY username最终运行sql是错误的,因为两边有单引号。比如:要动态拼接表名,必须要使用$将表名拼接在sql。2.3.4 插入用户定义mapper.xml编写java程序。2.3.5 插入记录主键返回如果自增主键,实现插入记录后将自增的主键值回写到parameterType指定的对象中。执行过程:输入参数的映射parameterType指定的类型中(这时id属性是没有值)执行mysql数据库sql,sql执行完成自增主键产生一个获得自增主键的值,使用LAST_INSERT_ID() 得到自增主键的值将自增主键的值写输入参数User对象修改User.xmll 不使用自增主键,使用mysql的uuid()提前生成主键修改User.xml SELECT uuid() insert into user(id,username,sex,birthday,address,detail,score) values(#id,#username,#sex,#birthday,#address,#detail,#score) Order:指定before,执行sql之前执行SELECT uuid(),将uuid的值赋值到输入参数的id属性中。在sql中就可以通过#id得到提前生成主键值。l 不使用自增主键,使用oracle的序列oracle的序列:可以生成一个流水号(int型)调用序列得到流水号:select 序列名.nextval from dual思路:和使用uuid一样,提前调用select 序列名.nextval生成一个流水号,将流水号赋值到输入参数的id属性中。 select 序列名.nextval from dual insert into user(id,username,sex,birthday,address,detail,score) values(#id,#username,#sex,#birthday,#address,#detail,#score) 2.3.6 删除用户定义User.xmlJava程序:2.3.1 更新用户编写User.xml编写java程序:需求:将user表中性别等于1的用户,性别要更新为2,user.xml如何编写?将此需要推广理解为可以批量更新,批量更新的where条件不是一个,可能是多个。2.4 小结mybatis开发过程Mybatis单独运行:第一步:通过SqlSessionFactoryBuilder创建SqlSessionFactory工厂第二步:通过SqlSessionFactory工厂创建SqlSession第三步:通过SqlSession操作数据库SqlSession是一个面向用户接口,常用方法如下:sqlSession.selectOne(mapper.xml中定义的statement的id,输入参数) selectOne:查询一个对象 如果要查询单个对象,可以使用selectList,返回的list中只有一条记录。sqlSession.selectList(,) selectList:查询一个集合对象 如果要查询一个集合对象,如果使用selectOne不行的,报错。sqlSession.insert(,) 插入数据sqlSession.delete() 删除数据sqlSession.update 更新数据第四步:如果需要提交事务,sqlSmit();第五步:关闭SqlsessionSqlSession.close()2.5 SqlSession类的使用方法SqlSessionFactoryBuilder:创建SqlSessionFactory工厂,当成一个工具类使用。SqlSessionFactory:创建SqlSession,工厂使用时采用单例,如果和spring整合后,SqlSessionFactory让spring统一进行管理,让spring将SqlSessionFactory注入到Dao接口中。*sqlSession:面向用户的接口,里边提供操作数据库方法,SqlSession是线程不安全的,所以每执行一次数据库操作都需要创建一个sqlSession,Sqlsession最佳的使用场合是方法体内(就是一个局部变量),每个线程对于同一个方法有单独的内存空间。2.6 与hibernate的不同Mybatis是一个不完全的Orm框架,需要手动编写sql语句,存储一部分映射,将输入java对象映射到sql语句中,也可以将sql查询结果映射成java对象。Mybatis学习或使用入门门槛不高,只要你会sql,mybaits容易学习,非常容易进行sql优化。Mybatis应用场合,需求变化较大,比如互联网项目,mybaits不用考虑复杂的关系模型,就可以手动通过sql完成数据存储和查询。Hibernate,学习和使用的入门门槛比mybatis要高,如果需要进行sql 优化,Hibernate就没有Mybatis方便,Hibernate应用场合,需求变化不大,相对固定,那些中、小项目。企业中最佳的技术选型原则能以低成本换回高回报。3 Namespace的作用通过namespace可以简化dao层的开发。3.1 使用dao接口开发Dao接口Dao接口实现:测试:小结:使用mybatis开发Dao接口模式:创建一个dao接口再创建一个dao接口实现实现类中要将SqlSessionFactory注入dao接口实现就可以通过SqlSessionFactory得到SqlSession思考:Dao接口实现类方法中,操作步骤是固定的:第一步:通过SqlSessionFactory得到SqlSession第二步:如果要查询一个对象肯定要调用sqlSession的selectOne方法有不方便之处:第一个参数的内容很长,需要程序编写字符串,不方便(硬编码)selectOne方法的第二个参数是一个object,如果传入的参数是错误,不会在编译阶段报错。如果要查询一个集合对象,肯定要调用sqlSession的selectList方法第三步:如果需要提交事务,调用sqlSmit()第四步:释放资源, sqlSession.close();1 上边固定的内容能否抽取出来?2 selectOne方法的参数的问题第一个参数的内容很长,需要程序编写字符串,不方便(硬编码)selectOne方法的第二个参数是一个object,如果传入的参数是错误,不会在编译阶段报错。3.2 使用mapper接口开发Mapper接口是mybaits官方推荐的做法,将mapper接口理解成dao接口。实现思路:1、 将mapper接口开发出来,不需要开发mapper接口实现类,mybatis会根据mapper接口和mapper.xml(定义statement)自动生成动态代理对象。对于程序员不需要开发接口实现类了。理解成生成的动态代理对象将上边分析的固定的代码进行封装了。2、 讨论下sqlsession.selectOne方法封装到代理对象中?需要:1、 通过mapper接口能找到user.xml映射文件,且能找到映射文件中的statement的id。程序开发好mapper接口,在映射文件中将namespace的地址指定为mapper接口的地址,达到:mapper接口找到映射文件了。如何能找到映射文件中的statement的id?让mapper接口的方法名等于映射文件中的statement的id。2、 需要将输入参数在代理对象中给selectOne方法赋值。让mapper接口方法的输入参数类型和映射文件中的statement的parameterType一致.3、 需要将输出结果在代理对象中作为selectOne方法的返回值。4、什么时候调用SqlSession哪个方法?如何知道生成的代理对象中该调用selectOne?selectList?insert?update?根据映射文件中statemement的标签类型决定是调用哪个方法:该调用selectOne?selectList?根据映射文件中定义的statement的resultType是无法判断该调用selectOne和selectList,可以根据mapper接口方法的返回值类型判断,如果返回是一个集合对象代理对象中调用selectList,否则调用selectOne。不管返回一个对象还是集合对象,映射文件中定义的statement的resultType是一致的,都是user。开发mapper接口:1、 编写UserMapper.xml,名称官方推荐:XXXXMapper.xml2、 编写UserMapper.java,名称官方推荐:XXXXMapper.java遵循规则:1 UserMapper.xml中namsapce就是UserMapper.java的全限定名2 UserMapper.java中的方法名是UserMapper.xml的statement的id3 UserMapper.java中的方法输入参数类型是UserMapper.xml的parameterType的类型。4 UserMapper.java中的方法输出参数类型是UserMapper.xml的resultType的类型测试:4 SqlMapConfig.xmlSqlMapConfig.xml是mybatis的全局配置文件,在此文件中配置加载属性文件(比如:perties)、数据源、事务(和spring整合后就不需要在SqlMapConfig.xml配置了)、全局参数、别名、mapper配置.以下的配置按顺序进行:properties(属性)settings(全局配置参数)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境集合属性对象)environment(环境子属性对象)transactionManager(事务管理)dataSource(数据源)mappers(映射器)4.1 properties创建一个properties 文件,定义数据库连接参数perties不仅可以在SqlMapConfig.xml中引用,还可以在mapper.xml中引用(比如:通过#引用属性文件中的值)。推荐仅在SqlMapConfig.xml中引用,所以定义属性文件中的key的名称时,要定义成XX.XX这类格式。4.2 settings详细参见“学习资料/mybatis-settings.xlsx”文件注意:修改全局配置参数影响mybatis的执行,慎重修改。4.3 typeAliases别名定义(重点)需求:在映射文件中定义statement时,需要定义输入参数类型、输出结果类型,如果类型写全路径名麻烦,可以采用别名方式。支持很多基本类型,如果对于自定义的pojo类型,就需要自定义别名:4.3.1 单个别名定义在mapper.xml中使用别名了。如果别名使用错误,报:org.apache.ibatis.exceptions.PersistenceException: # Error building SqlSession.# The error may exist in sqlmap/UserMapper.xml# Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias userabc. Cause: java.lang.ClassNotFoundException: Cannot find class: userabc4.3.2 批量定义别名定义方式:4.4 typeHandlers类型处理器负责将java类型映射成jdbc类型。Mybatis默认提供了很多类型处理器,默认情况下这个类型处理器够用了。4.5 mapper(映射器)4.5.1 配置mapper.java文件加载映射文件思路:通过UserMapper.java找到UserMapper.xml文件.要求:mapper.java文件的文件名和mapper.xml文件名一致,且放在一个目录。在SqlMapConfig.xml中通过mapper.java文件加载映射文件:4.5.2 批量加载mapper配置方式:要求:mapper.java文件的文件名和mapper.xml文件名一致,且放在一个目录。5 Mapper.xml在mapper.xml映射文件中定义statement。5.1 parameterType定义输入参数的类型。5.1.1 #与$#表示一个占位符,$表示一个sql拼接的串(串没有任何修饰)。使用#:向#里边填入要输入映射的参数名,如果输入参数是简单类型,参数名可以value或其它名称,使用占位符不用考虑输入参数的类型,通过mybatis提供的类型处理器自动将java对象类型映射成jdbc类型。比如:where条件比较日期型Select * from user where birthday = #birthday推荐使用占位符。使用$:向$里边填入要输入映射的参数名,如果输入参数是简单类型,参数名只能是value使用$拼接方式,需要考虑数据字段的类型,比如:Select * from user where birthday = $birthday 这时birthday是日期型和$birthday(字符串)类型不一致,如果在oracle不允许比较的,如果使用oracle,需要将$birthday转成日期型,如下:Select * from user where birthday =to_date( $birthday,yyyy-MM-dd)有些情况下必须要$,比如动态拼接表名 from $tablename 5.1.2 使用自定义包装类型作为输入参数类型包装类型的定义:内部使用O
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025陕西西安建工第五建筑集团有限公司3月招聘笔试历年参考题库附带答案详解
- 2025陕西榆林市吴堡县县属国有企业招聘笔试历年参考题库附带答案详解
- 2025贵州安立航空材料有限公司招聘工作人员及笔试历年参考题库附带答案详解
- 2025湖南省低空经济发展集团有限公司招聘12人(第二次)模拟试卷带答案详解
- 2025浙江温州交运集团选聘温州低空经济发展有限公司副总经理1人笔试历年参考题库附带答案详解
- 2025年六安金寨县红旅客运有限公司公开招聘劳务外包制旅游客车储备驾驶员2名笔试历年参考题库附带答案详解
- 2025内蒙古赛雅人力资源服务有限公司面向社会公开招聘196名劳务派遣列车服务人员笔试历年参考题库附带答案详解
- 2025科学技术部国际科技合作中心SKAO国际组织职员招聘考前自测高频考点模拟试题及答案详解(夺冠系列)
- 2025广西来宾市政协办公室招聘所属事业单位后勤服务控制数人员1人考前自测高频考点模拟试题及1套完整答案详解
- 2025昆明市晋宁区文化和旅游局招聘编外工作人员(1人)模拟试卷附答案详解(黄金题型)
- 荣耀机试题库及答案
- 云南省云南师大附中2026届高考适应性月考卷地理及答案(一)
- 卫生系统保密教育课件
- 中医全科课件下载
- 拒绝烟草诱惑向“吸烟”说不!课件-2024-2025学年高二下学期世界无烟日主题班会
- 4《少给父母添麻烦》公开课一等奖创新教案(第二课时)
- T-JLJY 01 -2023 幼儿园教育装备配置规范
- 《SLT631-2025水利水电工程单元工程施工质量验收标准》知识培训
- 马拉松志愿者培训
- 企业信息化标准规范-全面剖析
- 临床微生物学检验 2细菌形态学检查、培养和分离技术 学习资料
评论
0/150
提交评论