SSM框架(Mybatis)

  • 基础知识

对原生态jdbc程序(单独使用jdbc开发)问题总结

Mybatis框架原理(掌握)

Mybatis入门程序

用户的增、删、查、改

Mybatis开发dao两种方法:

原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握)

Mybatis的mapper接口(相当于dao接口)代理开发方法(掌握)

Mybatis配置文件SQLMapConfig.xml

Mybatis核心:

Mybatis输入映射(掌握)

Mybatis输出映射(掌握)

Mybatis的动态SQL(掌握)

  • 高级知识

高级映射(一对一、一对多、多对多)

Mybatis延迟加载

Mybatis查询缓存(一级缓存、二级缓存)

Mybatis和spring进行整合(掌握)

Mybatis逆向工程

 

  1. 对原生态jdbc程序中问题总结

1.1环境

Java环境:jdk

Eclipse:indigo

Mysql:5.1

1.2创建mysql数据库

Sql_table.sql:记录表的结构

Sql_date.sql:记录测试数据。在实际企业开发中,最后提供一个初始化脚本

1.3 jdbc程序

使用jdbc查询mysql数据库中用户表的记录

 

创建Java工程,加入jar包:

 

数据库驱动包

1.4问题总结

  1. 数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。

设想:使用数据库连接池管理数据库连接。

 

  1. 将Sql语句编程码到java代码,如果Sql语句修改,需要重新编写java代码,不利于系统维护。

设想:将Sql语句配置在xml配置文件中,及时sql变化,不需要对java代码进行重新编译。

 

  1. 向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。

设想:将Sql语句及占位符号和参数全部配置在xml中。

 

  1. 从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。

设想:将查询的结果集,自动映射成java对象。

  1. mybatis框架

2.1 mybatis是什么?

Mybatis是一个持久层的框架,是apache下的顶级项目。

下载地址https://github.com/mybatis/mybatis-3//releases

 

mybatis让程序主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写Sql)满足需要Sql语句。

 

mybatis可以将向输入参数preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象(输出映射

2.2 mybatis框架

 

 

3、入门程序

3.1环境

Java环境:jdk

Eclipse:indigo

Mysql:5.1

 

Mybatis运行环境(jar包):

https://github.com/mybatis/mybatis-3//releases  下载3.2.7版本

 

 

Lib下:依赖包

Mybatis-3.2.7.jar:核心包

Mybatis-3.2.7pdf:操作说明

加载mysql的驱动包

 

3.2log4j.propertes

 

3.3工程结构

 

3.4SqlMapConfig.xml

配置mybatis的运行环境、数据源、事务等。

 

3.4根据用户的id(主键)查询用户信息

3.5.1创建po类

 

 

3.5.2映射文件

User.xml(原始ibatis命名),mapper代理开发映射文件名称叫xxxMapper.xml,比如UserMapper.xml、ItemsMapper.xml。

在映射文件中配置Sql语句。

 

3.5.3在SqlMapConfig.xml加载映射文件

在SqlMapConfig.xml中加载映射文件

 

3.5.4程序编写

 

3.6根据用户名称模糊查询用户信息

3.6.1映射文件

使用user.xml,添加根据用户名称模糊查询用户信息的Sql语句。

 

 

3.6.2程序代码

 

3.7添加用户

3.7.1映射文件

在user.xml中配置添加用户的statement。

 

3.7.2程序代码

 

3.7.3自增主键放回

Mysql自增主键,执行insert提交之前自动生成一个自增主键

 

通过mysql函数获取到刚插入记录的自增主键;

LAST_INSERT_ID()

是在insert之后调用子函数

 

3.7.4非自增主键返回(使用uuid())

使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。

 

执行思路

先通过uuid()查询到主键,将主键输入到sql语句中。

 

执行uuid()语句顺序相对于insert语句之前。

 

3.8删除用户

3.8.1映射文件

 

3.8.2程序代码

 

3.9更新用户

3.9.1映射文件

 

3.9.2程序代码

 

3.10总结

3.10.1 parameterType

在映射文件中通过parameterType指定输入参数的类型

3.10.2 resultType

在映射文件中通过resulttype指定输入结果的类型

3.10.3#{}和${}

#{}表示一个占位符号,#{}接受输入参数,类型可以是简单类型,pojo,hashmap。

如果接受简单类型,#{}可以写value或其他名称。

#{}接受pojo对象值,通过OGNL读取对象的属性值,通过属性.属性.属性...的方式获取对象属性值

 

${}表示一个拼接符号,会引入Sql注入,所以不建议使用${}。

${}接受输入参数,类型可以是简单类型,pojo,hashmap。

如果接受简单类型,${}只能写value。

${}接受pojo对象值,通过OGNL读取对象的属性值,通过属性.属性.属性...的方式获取对象属性值

 

3.10.4 selectOne和selectList

selectOne表示查询出一条记录进行映射。如果使用selectOne可以使用selectList可以实现(list只有一个对象)

 

SelectList表示查询一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。

3.11 mybatis和hibernate本质区别和应用场景

Hibernate:是一个表中的ORM框架(对象关系映射)。入门门较高,不需要程序写SQL,SQL语句自动生成了。

对SQL语句进行优化、修改比较困难。

应用场景:适用于需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa

 

Mybatis:专注于SQL本身,需要编写SQL语句,对SQL语句进行修改、优化比较方便。Mybatis是一个不完全的ORM框架,虽然需要自己编写SQL,但是mybatis也有映射。

应用场景:适用于需求变化较多的项目,比如互联网项目。

 

4 mybatis开发dao的方法

4.1 SqlSession使用范围

4.1.1 SqlSessionFactoryBuilder

通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory

SqlSessionFactoryBuilder当一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。

需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可

4.1.2 SqlSessionFactory

通过SqlSessionFactory常见SqlSession,使用单例模式管理SqlSessionFactory(工厂一旦创建,使用一个实例)。

将来mybatis和spring整合后,使用单例模式管理SqlSessionFactory。

4.1.3 SqlSession

SqlSession是一个面向用户(程序员)的接口。

SqlSession中提供了很富哦操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)。

 

SqlSession是线程不安全的,在SqlSession实现类处理有接口中的方法(操作数据库的方法)还有数据域属性。

 

SqlSession最佳应用场景在方法体内,定义成局部变量。

4.2原始dao开发方法(程序员需要写dao接口和dao实现类)

 

4.2.1思路

程序员需要编写dao接口和dao实现类。

需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession

4.2.2 dao接口

 

4.2.3 dao接口实现类

//dao的接口实现类

public class UserDaoImpl implements UserDao{

 

//需要向dao实现类中注入SqlSessionFactory

//这里通过构造方法注入

private SqlSessionFactory sqlSessionFactory;

public UserDaoImpl(SqlSessionFactory sqSessionFactory){

this.sqlSessionFactory = sqSessionFactory;

}

 

@Override

public User findUserById(int id) throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

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

//释放资源

sqlSession.close();

return user;

}

@Override

public void insertUser(User user) throws Exception {

        SqlSession sqlSession = sqlSessionFactory.openSession();

//执行插入操作

sqlSession.insert("Test.insertUser", user);

//提交事务

sqlSession.commit();

//释放资源

sqlSession.close();

}

@Override

public void deleteUser(int id) throws Exception {

 SqlSession sqlSession = sqlSessionFactory.openSession();

//执行插入操作

sqlSession.delete("test.deleteUser", id);

//提交事务

sqlSession.commit();

//释放资源

sqlSession.close();

}

}

4.2.4 测试代码

 

4.2.5原始Dao开发的问题

  1. dao接口实现类存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

 

  1. 调用SqlSession方法时将statement的id硬编码了

 

3、调用SqlSession方式时,传入的变量,由于SqlSession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

4.3 mapper代理方法(程序员只需要mapper接口(相当于dao接口))

4.3.1 (mapper代理的开发规范)思路

程序员还需要编写mapper.xml映射文件

 

程序员只需要编写mapper接口需要遵循一些开发规范,Mybatis可以自动生成mapper接口实现类代理对象。

 

开发规范:

  1. 在mapper.xml中namespace等于mapper接口地址。

 

  1. mapper.java接口中的方法名和mapper.xml中statement的id一致。

 

  1. mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

 

  1. mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定类型一致。

 

 

 

总结:

以上开发规范主要是对下边代码进行统一生成:

 

User user = sqlSession.selectOne(“test.findUserById”,id);

sqlSession.insert(“test.insertUser”,user);

... ...

4.3.2 mapper.java

 

4.3.3 mapper.xml

 

4.3.4在SQLConfig.xml中加载mapper.xml

 

4.3.5 测试

 

4.3.6 一些问题的总结

 

4.3.6.1 代理对象内部调用selectOne或selectList

如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。

 

如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。

4.3.6.2 mapper接口方法的参数只能有一个是否影响系统开发

mapper接口方法的参数只能有一个,系统是否不利于扩展维护。

 

系统框架中,dao层的代码是被业务层公用的。

即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

 

注意:持久层方法的参数可以包装类型、map...,service方法中不建议使用包装类型(不利于业务层的可扩展性)。

 

5 SQLConfig.xml

Mybatis的全局配置文件SQLConfig.xml,配置内容如下:

 

properties(属性)

settings(全局配置参数)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器)

 

5.1 properties属性

需求:

将数据库连接参数单独配置在db.properties中,只需要在SQLMapConfig.xml中加载db.properties的属性值。在SQLMapConfig.xml就不需要对数据库连接的参数进行硬编码了。

 

将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties。

 

在SQLMapConfig.xml中

 

properties属性:

 

注意:Mybatis将按照下面的顺序来加载属性:

在properties元素体内定义的属性首先被读取。

然后会读取properties元素中resource或URL加载属性,它会覆盖已读取的同名属性。

最后读取parameterType传递的属性,她会覆盖已读取的同名属性。

 

建议:

不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。

在properties文件中定义属性名要有一定的特殊性,比如:xxx.xxx

5.2 settings全局参数配

Mybatis框架在运行时可以调整一些运行参数。

比如:开启二级缓存、开启延迟加载...

 

全局参数将会影响mybatis的运行行为

 

详细参见“学习资料/mybatis-settings.xlsx”文件

5.3 typeAliases(别名)重点

5.3.1需求

在mapper.xml中定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。

 

如果在指定类型是输入类型全路径,不方便进行开发,可以针对parameterType和resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。

 

5.3.2 mybatis默认支持别名

5.3.3自定义别名

单个别名定义:

 

引用别名:

 

 

5.4 typeHandlers(类型处理器)

mybatis中通过typeHandlers完成jdbc类型和java类型的转换。

 

通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义。

 

5.5mappers(映射配置)

5.5.1通过resource加载单个映射文件

 

5.5.2通过mapper接口加载单个mapper

 

按照上边的规范将mapper.xml和mapper.java放在一个目录下,且同名。

 

5.5.3批量加载mapper(推荐使用)

 

6输入映射

通过parameterType指定输入参数的类型,类型可以是简单类型hahmap、pojo的包装类型。

6.1传递pojo的包装对象

6.1.1需求

完成用户信息的综合查询,需要传入查询条件(可能包括用户信息、其他信息、比如商品、订单的信息)

6.1.2定义包装类型pojo

针对上边需求,建议使用自定义的包装类型的pojo。

在包装类型的pojo中将复杂的查询条件包装进去。

 

6.1.3 mapper.xml

在UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)

 

6.1.4 mapper.java

 

6.1.5测试代码

 

 

7输出映射

7.1 resultType

使用resultType进行输出的映射,只有查询出来的列明和pojo中的属性名一致,该列才可以映射成功。

如果查询出来的列明和pojo中的属性名全部不一致,没有创建pojo对象。

只要查询出来的列明和pojo中的属性有一个一致,就会创建pojo对象。

7.1.1输出简单类型

需求:用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页。

实现:mapper.xml

 

mapper.java

 

测试代码

 

7.1.1.1小结

查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。

 

7.1.2输出pojo对象或pojo列表

不管输出的pojo单个对象还是一个列表(list中包括pojo)在mapper.xml中resultType指定的类型一样的。在mapper.java指定的方法返回值类型不一样:

  1. 输出单个pojo对象,方法的返回值是单个对象类型。
  2. 输出pojo对象列表,方法返回值是List(pojo)。

 

动态代理对象是根据mapper返回值类型来确定调用selectone或selectlist

 

7.2 resultMap

Mybatis中使用resultMap完成高级输出结果映射。

7.2.1resultMap使用方法

如果查询出来的列明和pojo的属性不一致,通过定义一个resultMap对列名和pojo属性名之间作为一个映射关系。

  1. 定义resultMap

 

  1. 使用resultMap作为statement的输出映射类型。

 

7.3小结

使用resultType进行输出映射,只有查询出来的列明和pojo中的属性名一致,该列才可以映射成功。

如果查询出来的列明和pojo的属性名不一致,通过定义一个resultMap对列明和pojo属性名之间做一个映射关系。

8动态sql

8.1什么是动态sql

Mybatis核心对SQL语句进行灵活操作,通过表达式进行判断,对SQL进行灵活拼接、组装。

8.2需求

用户信息综合查询列表和 用户信息查询列表总数这两个statement的定义使用动态SQL语句。

 

对查询条件进行判断,如果输出的参数不为空才进行查询条件的拼接

 

8.3SQL片段

8.3.1需求

将上面实现的动态SQL判断代码块抽取出来,组成一个SQL片段。其他的statement中就可以引用SQL片段。

8.3.2定义SQL片段

 

8.3.2引用SQL片段

 

8.4 foreach

向SQL传递数组或List,mybatis使用foreach解析

8.4.1需求

在用户信息综合查询列表和 用户信息查询列表总数的statement中增加多个id输入查询。

SQL语句如下:

 

两种方法:

Select *from user where id=1 or id=2 or id=3

 

Select *from user where id in(1,2,3)

 

8.4.2 在输入参数类型中添加List<Integer>ids传入多个id

 

8.4.3 修改mapper.xml

Where id=1 or id=2 or id=3

在查询条件中,查询条件定义成一个SQL片段。

 

 

 

9 Mybatis开发dao的方法总结

一、原始dao的方法

   需要程序员编写dao接口和实现类

需要在dao实现类中诸如一个SqlSessionFactory工厂。

 

二、mapper代理开发方法

只需要程序员编写mapper接口(就是dao接口)

程序员在编写mapper.xml(映射文件)和mapper.java需要遵循一个开发规范。

  1. mapper.xml中namespace就是mappe.java的类全路径。
  2. Mapper.xml中statement的id和mapper.java中方法名一致。
  3. Mapper.xml中statement的parameterType指定输入参数的类型和mapper.java的方法输入参数类型一致。
  4. Mapper.xml中statement的resultType指定输出结果的类型和mapper.java的方法返回值类型一致。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值