mybatis7号课堂笔记.docx

上传人:b****7 文档编号:10428412 上传时间:2023-02-11 格式:DOCX 页数:37 大小:639.51KB
下载 相关 举报
mybatis7号课堂笔记.docx_第1页
第1页 / 共37页
mybatis7号课堂笔记.docx_第2页
第2页 / 共37页
mybatis7号课堂笔记.docx_第3页
第3页 / 共37页
mybatis7号课堂笔记.docx_第4页
第4页 / 共37页
mybatis7号课堂笔记.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

mybatis7号课堂笔记.docx

《mybatis7号课堂笔记.docx》由会员分享,可在线阅读,更多相关《mybatis7号课堂笔记.docx(37页珍藏版)》请在冰豆网上搜索。

mybatis7号课堂笔记.docx

mybatis7号课堂笔记

Mybatis第一天课堂笔记

Mybatis课程安排:

第一天:

Jdbc编程中的问题?

Mybatis的框架原理(重点)

Mybatis的第一个程序:

实现用户信息的增、删、改、查。

Mybatis如何解决jdbc编程的问题。

与hibernate不同。

mybatis开发dao两种方法:

(重点)

原始的dao开发方法(接口和接口实现)

Mapper动态代码方法

Mybatis的配置文件:

SqlMapConfig.xml(全局配置文件)

XXXXXMapper.xml(映射文件,重点)

Mybatis动态Sql(重点)

resultType(重点掌握)和resultMap区别。

第二天:

Mybatis关联查询:

一对一查询

一对多

多对多

Mybatis的缓存

一级缓存

二级缓存

延迟加载

Mybatis和springmvc整合(重点)

原始的dao开发方法(接口和接口实现)

Mapper动态代码方法

Mybatis逆向工程(由数据库表生成类文件和映射文件)

1Jdbc编程中的问题

1.1写一个程序

目标:

1、通过jdbc程序找出当中的问题

2、重视jdbc编程,企业在技术选型时对于小型的项目或性能要求较高的项目,优先选用jdbc开发。

准备开发环境:

Jdk1.7.72

Eclipseindigo(3.7)

Mysql5.1

运行环境:

Mysql5.1数据库驱动

创建mysql数据库:

代码如下:

publicclassJdbcTest{

//定义sql语句,根据名称查询用户表的记录

privatestaticStringsql="SELECT*FROMUSERWHEREusername=?

";

publicstaticvoidmain(String[]args)throwsSQLException{

//数据库连接

Connectionconnection=null;

//预编译statement

//好处:

防止sql注入,提高数据的性能

PreparedStatementpreparedStatement=null;

//结果集

ResultSetresultSet=null;

try{

//加载数据库驱动

Class.forName("com.mysql.jdbc.Driver");

//连接数据库

connection=DriverManager.getConnection("jdbc:

mysql:

//localhost:

3306/mybatis","root","mysql");

//构造preparedStatement

preparedStatement=connection.prepareStatement(sql);

//向preparedStatement中占位符的位置设置参数

preparedStatement.setString(1,"张三");

//发起数据库查询请求,得到结果集

resultSet=preparedStatement.executeQuery();

//遍历查询结果

while(resultSet.next()){

intid=resultSet.getInt("id");

Stringusername=resultSet.getString("username");

Datebirthday=resultSet.getDate("birthday");

System.out.println(id+""+username+""+birthday);

}

}catch(Exceptione){

e.printStackTrace();

}finally{

//释放资源

if(resultSet!

=null){

resultSet.close();

}

if(preparedStatement!

=null){

preparedStatement.close();

}

if(connection!

=null){

connection.close();

}

}

}

}

1.2总结问题

1、将sql语句硬编码到java代码中,如果修改sql语句,需要修改java代码,重新编译。

系统可维护性不高。

设想如何解决?

能否将sql单独配置在配置文件中。

2、数据库连接频繁开启和释放,对数据库的资源是一种浪费。

设想如何解决?

使用数据库连接池管理数据库连接。

3、向preparedStatement中占位符的位置设置参数时,存在硬编码(占位符的位置,设置的变量值)

设想如何解决?

能否也通过配置的方式,配置设置的参数,自动进行设置参数。

4、解析结果集时存在硬编码(表的字段名、字段的类型)

设想如何解决?

能否将查询结果集映射成java对象。

 

2Mybatis框架

2.1Mybatis是什么?

MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

Mybatis通过xml或注解的方式将要执行的statement配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

 

2.2Mybatis框架图

1、mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。

此文件需要在SqlMapConfig.xml中加载。

2、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

3、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

4、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

5、MappedStatement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。

mapper.xml文件中一个sql对应一个MappedStatement对象,sql的id即是Mappedstatement的id。

6、MappedStatement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

7、MappedStatement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

 

3mybatis第一程序

3.1准备环境:

●Mybatis运行环境:

去mybatis官方网站下载Mybatis3.2.3。

mybatis-3.2.3.jar:

mybatis核心包

mybaits的依赖包:

●准备开发环境:

Jdk1.7.72

Eclipseindigo(3.7)

Mysql5.1

●数据库运行环境:

Mysql5.1数据库驱动

●创建mysql数据库:

 

3.2用户查询开发

需求:

根据用户id查询一条记录(返回单条记录)

查询用户列表(返回list集合)

 

3.2.1创建java工程

3.2.2加入mybatis的jar包

加入:

mybatis核心包、mybatis依赖包、数据驱动包

3.2.3配置log4j.properties

#Globalloggingconfiguration

log4j.rootLogger=DEBUG,stdout

#Consoleoutput...

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p[%t]-%m%n

注意:

开发阶段使用DEBUG

 

3.2.4配置mybatis全局配置文件

全局配置文件:

SqlMapConfig.xml(名称不是固定的)

配置的内容包括:

数据库运行环境(和spring整合废除了)

Mapper映射文件

3.2.5创建po类

建议po类名和表名一致,属性名和表字段名一致。

3.2.6配置mybatis的mapper映射文件

User.xml(mybatis推荐的命名方式是XXXXMapper.xml)

#{}:

用于占位符

${}:

用于sql拼接

 

在全局配置文件SqlMapConfig.xml中配置User.xml。

 

3.2.7编写用户查询程序

第一步:

根据mytais的配置创建SqlSessionFactory

 

第二步:

根据SqlSessionFactory创建SqlSession

第三步:

通过SqlSession操作数据库(根据用户id查询一条记录)

1、selectOne,查询单条记录

 

2、selectList,查询集合

第四步:

遍历查询结果

第五步:

SqlSession关闭

 

3.3用户添加

3.3.1编写mapper.xml映射文件

在User.xml中定义添加用户的statement。

 

3.3.2编写用户添加程序

3.3.3主键返回问题

需求:

对于新增的记录,需要将主键返回到pojo中,就可以从pojo中获取新添加的记录id。

 

自增主键生成Uuid主键生成时机区别:

自增主键在insert语句执行后生成的。

Uuid主键在insert语句执行前生成的。

3.3.3.1Mysql自增主键获取:

在insertUser的statement中添加selectKey

 

3.3.3.2Uuid主键获取

Uuid主键在insert语句执行前生成的

如果使用uuid获取主键,定义selectkey

--

keyProperty:

将主键设置到pojo中哪个属性中

order:

selectKey中sql执行的时机

resultType:

selectKey中sql执行的结果类型

LAST_INSERT_ID:

是insert后获取自增主键值

-->

selectuuid()

insertintouser(id,username,birthday,sex,address,detail,score)

values(#{id},#{username},#{birthday},#{sex},#{address},#{detail},#{score})

如果不用selectKey,也可以在调用SqlSession.insert()前,在输入参数设置id值(生成uuid,设置到user的id属性中。

)。

 

3.3.3.3Oracle主键返回

Oracle没有自增主键,使用oracle的序列(可以生成流水号,类似自增主键)生成主键。

通过序列获取流水号方法:

Select序列名.next.valfromdual

--

keyProperty:

将主键设置到pojo中哪个属性中

order:

selectKey中sql执行的时机

resultType:

selectKey中sql执行的结果类型

LAST_INSERT_ID:

是insert后获取自增主键值

-->

Select序列名.next.valfromdual

insertintouser(id,username,birthday,sex,address,detail,score)

values(#{id},#{username},#{birthday},#{sex},#{address},#{detail},#{score})

 

3.4用户删除

3.4.1Mapper.xml映射文件

 

3.4.2编写删除程序

 

3.5用户更新

3.5.1Mapper.xml映射文件

 

3.5.2编写更新程序

 

3.6小结

Mybatis开发:

第一步:

编写SqlMapConfig.xml全局配置文件(重点配置mapper)

第二步:

编写mapper.xml映射文件(重点)

定义statement(包括sql语句,输入和输出参数类型)

在SqlMapConfig.xml全局配置文件配置mapper.xml(此配置可以通过规则省略)

第三步:

编写程序(重点)

获取SqlSessionFactory

通过SqlSessionFactory获取SqlSession

通过SqlSession操作数据库(调用上边定义的statement)

得到statement的输出映射java对象

4Mybatis解决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定义输出结果的类型。

 

5与hibernate不同

Orm:

mybatis不是一个完全的orm框架,hibernate是一个完全的orm框架。

Mybatis需要程序员自己写sql,但是也存在映射(输入参数映射,输出结果映射)

学习门槛:

mybatis比hibernate低。

应用的领域:

对于中小型项目,且需求固定,关系模型相对固定建议使用hibernate。

适用传统项目,比如ERP。

对于需求不固定的项目,比如:

互联网项目,建议使用mybatis,可以灵活去编写sql语句。

6SqlSession使用方法

SqlSessionFactoryBuilder:

用于创建SqlSessionFactory,将SqlSessionFactoryBuilder当成工具类使用。

SqlSessionFactory:

会话工厂,用于创建SqlSession,SqlSessionFactory一旦创建成功,不用每次创建工厂,建议单例模式使用工厂。

如果和spring整合后,由spring来管理SqlSessionFactory,在spring容器中SqlSessionFactory是一个单例对象。

SqlSession:

(重点)是一个面向用户的接口,通过SqlSessionFactory获取SqlSession,每次数据操作都需要创建新的SqlSession,SqlSession不是线程安全,最佳应用场合是方法体内,在方法中定义一个SqlSession局部变量。

7使用mybatis开发原始dao

程序员需要开发dao接口和dao的实现类。

编写User.xml映射文件:

 

Dao接口和实现类:

 

总结问题:

在每一个dao方法中在调用sqlSession的接口方法时需要对statement的id进行硬编码。

在调用sqlSession的接口方法时,向statement传入参数,由于sqlSession接口方法参数是object,如果类型设置错误,在编译阶段没有报错。

 

8Mapper动态代理方法

Mapper动态代理方法:

程序员只需要写dao接口(Mapper),而不需要写dao实现类,由mybatis根据dao接口和映射文件中statement的定义生成接口实现代理对象。

可以调用代理对象方法。

Mybatis官方建议:

将dao接口叫做mapper。

 

目标:

通过一些规则让mybatis根据dao接口和映射文件中statement的定义生成接口实现代理对象

mybatis将以下代码自动在代理对象实现:

Useruser=sqlSession.selectOne("test.findUserById",id);

如何让mapper接口找到mapper.xml中statement的id。

 

8.1第一步:

开发mapper.xml映射文件

mapper.xml映射文件命名规则:

XXXXMapper.xml

--根据用户id查询一条记录(返回单条记录)-->

SELECT*FROMUSERWHEREid=#{id}

 

为了让mapper.xml和mapper.java对应起来,将mapper.xml中的namespace设置为mapper.java的全限定名。

8.2第二步:

开发mapper.java接口

mapper.java接口文件命名规则:

XXXXMapper.java

Mybatis生成代理对象时,根据statement的标签决定调用SqlSession的方法(select、insert、update..)

根据上边接口方法返回值类型来决定是调用selectOne还是selectList,如果返回的是单个对象,动态代理调用selectOne(),如果返回的是集合对象,动态代理调用selectList()。

8.3Mapper开发规则

1、在mapper.xml中将namespace设置为mapper.java的全限定名

2、将mapper.java接口的方法名和mapper.xml中statement的id保持一致。

3、将mapper.java接口的方法输入参数类型和mapper.xml中statement的parameterType保持一致

4、将mapper.java接口的方法输出结果类型和mapper.xml中statement的resultType保持一致

 

8.4小结

在企业中使用原始dao开发仍然的是很多的,主要是由于前期使用ibatis。

建议使用mybatis动态代理方法,好处不用写实现类,开发快捷。

使用动态代码方法需要遵循上边四点规范。

 

9SqlMapConfig.xml内容

SqlMapConfig.xml作为mybatis的全局配置文件,配置内容包括:

数据库环境、mapper定义、全局参数设置。

properties(属性)

settings(全局配置参数)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器)

9.1properties

将数据库连接参数单独在一个properties文件中配置,好处是:

方便系统升级维护。

 

db.properties

此文件中的内容会通过SqlMapConfig.xml去加载。

使用db.properties

注意:

由于mapper.xml中也可以引用属性文件中的内容,所以建议属性文件中key定义要有一定的规则,建议使用前缀.XXX=XXXXX

 

9.2settings(全局配置参数)

mybaits框架运行设置一些全局配置参数,比如:

开启二级缓存,开启延迟载。

详细参考:

在ibatis中有一些设置性能参数(最大线程数、最大请求数。

),在mybatis中没有这些性能参数。

注意:

设置全局参数会影响mybatis框架运行,谨慎设置。

 

9.3typeAliases(类型别名)

在parameterType和resultType设置时,为了方便编码,定义别名代替pojo的全路径。

●框架默认支持别名

别名

映射的类型

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 自然景观

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1