mybatis简介

来源:互联网 发布:ubuntu用u盘安装 编辑:程序博客网 时间:2024/06/06 15:53

mybatis是一种ORM框架,对原始的jdbc进行了一定的封装。
我们来看一下mybatis。
这里写图片描述
1,mybatis配置
SqlMapConfig.xml
此文件作为mybatis的全局配置文件,配置了mybatis运行环境等信息
mapper.xml文件为sql映射文件
文件中配置了操作数据库的sql语句。
此文件需要在SqlMapConfig.xml中加载
2通过mybatis环境等配置信息构造sqlSessionFactory(会话工厂)
3由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4.mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现
一个是基本执行器,一个是缓存执行器。
5.Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。
mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id
6.Mapped Statement对sql执行输入参数进行定义,包括
HashMap Integer String ,pojo,基本类型等,Executor通过Mapped Statement在执行sql前将输入的java对象
映射到sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7.Mapped Statement对sql执行输出结果进行定义,包括HashMap,基本类型,pojo,
Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc中对结果的解析处理过程

hibernate:是一个标准ORM框架(对象关系映射),入门门槛较高的,不需要程序写sql,sql语句自动生成了,对sql语句进行优化、修改比较困难的。

应用场景:

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

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。

应用场景:

 适用与需求变化较多的项目,比如:互联网项目。

1.parameterType和resultType

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

  resultType:在映射文件中通过resultType指定输出结果的类型

2.#{}和${}

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

如果接收简单类型,#{}中可以写成value或其它名称;

{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。

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

${}接收输入参数,类型可以是简单类型,pojo、hashmap;

如果接收简单类型,${}中只能写成value;

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

3.selectOne()和selectList()

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

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

  如果使用selectOne报错: org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4

=====
注意用mybatis在使用insert update 插入或更新null值时,如果不指定jdbcType,会报错
Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters,
(还有在向oracle插入数据时,mybatis3报Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters,

是由于参数出现了null值,对于Mybatis,如果进行操作的时候,没有指定jdbcType类型的参数,mybatis默认jdbcType.OTHER导致,给参数加上jdbcType可解决(注意大小写) )
适配oracle数据库的时候,mybatis报了Error setting null parameter,bug发现是参数出现了null值,对于Mybatis,如果进行操作的时候,没有指定jdbcType类型的参数,就可能导致问题。

postgreSQL,MySQL,SQLSERVER都支持JdbcType.NULL类型,Oracle是不支持,适配的时候也因为这个问题导致mybatis报错。

比如,之前配置#{submitDate},它会在oracle中报错:Error setting null parameter

更改成#{submitDate,jdbcType=DATE},注意jdbcType是区分大小写的。



select seq_player.currval as id from dual

insert into wangcc_player (id,name,age,team,birthday)
values(seq_player.nextval,#{name,jdbcTpye=VARCHAR},#{age,jdbcType=NUMERIC},#{team,jdbcType=VARCHAR},#{birthday,jdbcType=DATE})


update wangcc_player set name=#{name,jdbcType=VARCHAR},age=#{age,jdbcType=NUMERIC},team=#{team,jdbcType=VARCHAR},birthday=#{birthday,jdbcType=DATE} where id=#{id}

6.2:通过mapper接口加载单个映射文件

<!-- 通过mapper接口加载单个映射配置文件        遵循一定的规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中;        上边规范的前提是:使用的是mapper代理方法;  -->     <mapper class="com.mybatis.mapper.UserMapper"/> 

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

6.3:批量加载mapper(推荐使用)

<!-- 批量加载映射配置文件,mybatis自动扫描包下面的mapper接口进行加载    遵循一定的规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中;        上边规范的前提是:使用的是mapper代理方法;  --><package name="com.mybatis.mapper"/>======================Error1、A query was run and no Result Maps were found for the Mapped Statement 'user.insertUser!selectKey'. It's likely that neither a Result Type nor a Result Map was specified.没有指定resultType或resultMap.查询时必须指定!!!!!!!!!!!2。当插入null时,要指定jdbcType
0 0
原创粉丝点击