mybatis存储图片
Ⅰ mybatis怎么使用存储过程
mybatis 配置 里面 写好存储过程,然后直接调用。
编辑userMapper.xml
编辑userMapper.xml文件,添加如下的配置项
1 <!--
2 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性
3 -->
4 <select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE">
5 CALL mybatis.ges_user_count(?,?)
6 </select>
7
8 <!--
9 parameterMap.put("sexid", 0);
10 parameterMap.put("usercount", -1);
11 -->
12 <parameterMap type="java.util.Map" id="getUserCountMap">
13 <parameter property="sexid" mode="IN" jdbcType="INTEGER"/>
14 <parameter property="usercount" mode="OUT" jdbcType="INTEGER"/>
15 </parameterMap>
四、编写单元测试代码
1 package me.gacl.test;
2
3 import java.util.HashMap;
4 import java.util.List;
5 import java.util.Map;
6
7 import me.gacl.custom.model.ConditionUser;
8 import me.gacl.domain.User;
9 import me.gacl.util.MyBatisUtil;
10 import org.apache.ibatis.session.sqlSession;
11 import org.junit.Test;
12
13 /**
14 * @author gacl
15 * 测试调用存储过程
16 */
17 public class Test6 {
18
19 @Test
20 public void testGetUserCount(){
21 SqlSession sqlSession = MyBatisUtil.getSqlSession();
22 /**
23 * 映射sql的标识字符串,
24 * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
25 * getUserCount是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
26 */
27 String statement = "me.gacl.mapping.userMapper.getUserCount";//映射sql的标识字符串
28 Map<String, Integer> parameterMap = new HashMap<String, Integer>();
29 parameterMap.put("sexid", 1);
30 parameterMap.put("usercount", -1);
31 sqlSession.selectOne(statement, parameterMap);
32 Integer result = parameterMap.get("usercount");
33 System.out.println(result);
34 sqlSession.close();
35 }
36 }
Ⅱ mybatis存储过程 不确定结果集如何配置XML,
MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql
MyBatis学习 之 二、SQL语句映射文件(1)resultMap
MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
MyBatis学习 之 三、动态SQL语句
MyBatis学习 之 四、MyBatis配置文件
在定义sqlSessionFactory时需要指定MyBatis主配置文件:
Xml代码 收藏代码
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
MyBatis配置文件中大标签configuration下子标签包括:
configuration
|--- properties
|--- settings
|--- typeAliases
|--- typeHandlers
|--- objectFactory
|--- plugins
|--- environments
|--- |--- environment
|--- |--- |--- transactionManager
|--- |--- |__ dataSource
|__ mappers
4.1 properties属性
properties和java的.properties的配置文件有关。配置properties的resource指定.properties的路径,然后再在properties标签下配置property的name和value,则可以替换.properties文件中相应属性值。
Xml代码 收藏代码
<!-- 属性替换 -->
<properties resource="mysql.properties">
<property name="jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/student_manager"/>
<property name="username" value="root"/>
<property name="password" value="limingnihao"/>
</properties>
4.2 settings设置
这是MyBatis 修改操作运行过程细节的重要的步骤。下方这个表格描述了这些设置项、含义和默认值。
设置项
描述
允许值
默认值
cacheEnabled
对在此配置文件下的所有cache 进行全局性开/关设置。
true | false
true
lazyLoadingEnabled
全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。
true | false
true
aggressiveLazyLoading
当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。
true | false
true
multipleResultSetsEnabled
允许和不允许单条语句返回多个数据集(取决于驱动需求)
true | false
true
useColumnLabel
使用列标签代替列名称。不同的驱动器有不同的作法。参考一下驱动器文档,或者用这两个不同的选项进行测试一下。
true | false
true
useGeneratedKeys
允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。
true | false
false
autoMappingBehavior
指定MyBatis 是否并且如何来自动映射数据表字段与对象的属性。PARTIAL将只自动映射简单的,没有嵌套的结果。FULL 将自动映射所有复杂的结果。
NONE,
PARTIAL,
FULL
PARTIAL
defaultExecutorType
配置和设定执行器,SIMPLE 执行器执行其它语句。REUSE 执行器可能重复使用prepared statements 语句,BATCH执行器可以重复执行语句和批量更新。
SIMPLE
REUSE
BATCH
SIMPLE
defaultStatementTimeout
设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时
正整数
Not Set
(null)
例如:
Xml代码 收藏代码
<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="enhancementEnabled" value="false" />
<setting name="defaultExecutorType" value="SIMPLE" />
</settings>
4.3 typeAliases类型别名
类型别名是Java 类型的简称。
它仅仅只是关联到XML 配置,简写冗长的JAVA 类名。例如:
Xml代码 收藏代码
<typeAliases>
<typeAlias alias="UserEntity" type="com.manager.data.model.UserEntity" />
<typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity" />
<typeAlias alias="ClassEntity" type="com.manager.data.model.ClassEntity" />
</typeAliases>
使用这个配置,“StudentEntity”就能在任何地方代替“com.manager.data.model.StudentEntity”被使用。
对于普通的Java类型,有许多内建的类型别名。它们都是大小写不敏感的,由于重载的名字,要注意原生类型的特殊处理。
别名
映射的类型
_byte
byte
_long
long
_short
short
_int
int
_integer
int
_double
double
_float
float
_boolean
boolean
string
String
byte
Byte
long
Long
short
Short
int
Integer
integer
Integer
double
Double
float
Float
boolean
Boolean
date
Date
decimal
BigDecimal
bigdecimal
BigDecimal
object
Object
map
Map
hashmap
HashMap
list
List
arraylist
ArrayList
collection
Collection
iterator
Iterator
4.4 typeHandlers类型句柄
无论是MyBatis在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成Java类型。下面这个表格描述了默认的类型处理器。
类型处理器
Java类型
JDBC类型
BooleanTypeHandler
Boolean,boolean
任何兼容的布尔值
ByteTypeHandler
Byte,byte
任何兼容的数字或字节类型
ShortTypeHandler
Short,short
任何兼容的数字或短整型
IntegerTypeHandler
Integer,int
任何兼容的数字和整型
LongTypeHandler
Long,long
任何兼容的数字或长整型
FloatTypeHandler
Float,float
任何兼容的数字或单精度浮点型
DoubleTypeHandler
Double,double
任何兼容的数字或双精度浮点型
BigDecimalTypeHandler
BigDecimal
任何兼容的数字或十进制小数类型
StringTypeHandler
String
CHAR和VARCHAR类型
ClobTypeHandler
String
CLOB和LONGVARCHAR类型
NStringTypeHandler
String
NVARCHAR和NCHAR类型
NClobTypeHandler
String
NCLOB类型
ByteArrayTypeHandler
byte[]
任何兼容的字节流类型
BlobTypeHandler
byte[]
BLOB和LONGVARBINARY类型
DateTypeHandler
Date(java.util)
TIMESTAMP类型
DateOnlyTypeHandler
Date(java.util)
DATE类型
TimeOnlyTypeHandler
Date(java.util)
TIME类型
SqlTimestampTypeHandler
Timestamp(java.sql)
TIMESTAMP类型
SqlDateTypeHandler
Date(java.sql)
DATE类型
SqlTimeTypeHandler
Time(java.sql)
TIME类型
ObjectTypeHandler
Any
其他或未指定类型
EnumTypeHandler
Enumeration类型
VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要这样做的话,简单实现TypeHandler接口(org.mybatis.type),然后映射新的类型处理器类到Java类型,还有可选的一个JDBC类型。然后再typeHandlers中添加这个类型处理器。
新定义的类型处理器将会覆盖已经存在的处理Java的String类型属性和VARCHAR参数及结果的类型处理器。要注意MyBatis不会审视数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指定那是VARCHAR类型的字段,来绑定到正确的类型处理器上。这是因为MyBatis直到语句被执行都不知道数据类型的这个现实导致的。
Java代码 收藏代码
public class LimingStringTypeHandler implements TypeHandler {
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
System.out.println("setParameter - parameter: " + ((String) parameter) + ", jdbcType: " + jdbcType.TYPE_CODE);
ps.setString(i, ((String) parameter));
}
@Override
public Object getResult(ResultSet rs, String columnName) throws SQLException {
System.out.println("getResult - columnName: " + columnName);
return rs.getString(columnName);
}
@Override
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
System.out.println("getResult - columnIndex: " + columnIndex);
return cs.getString(columnIndex);
}
}
在配置文件的typeHandlers中添加typeHandler标签。
Xml代码 收藏代码
<typeHandlers>
<typeHandler javaType="String" jdbcType="VARCHAR" handler="liming.student.manager.type.LimingStringTypeHandler"/>
</typeHandlers>
Ⅲ 什么是mybatis 为什么要使用my batis
1、定义
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
2、使用原因
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
3、总体流程
(1)加载配置并初始化
触发条件:加载配置文件
处理过程:将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)接收调用请求
触发条件:调用Mybatis提供的API
传入参数:为SQL的ID和传入参数对象
处理过程:将请求传递给下层的请求处理层进行处理。
(3)处理操作请求
触发条件:API接口层传递请求过来
传入参数:为SQL的ID和传入参数对象
处理过程:
(A)根据SQL的ID查找对应的MappedStatement对象。
(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
(E)释放连接资源。
(4)返回处理结果将最终的处理结果返回。
Ⅳ 最近几天一直在搞Mybatis调用存储过程的问题,用<select>标签写的那种!然后用Java里写调用函数
ibatis:sql需要自己写
hibernate:sql自动生成
上面是最大的区别,下面是一些细节.
选择Hibernate还是iBATIS都有它的道理:
Hibernate的特点:
Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。以数据库字段乱春塌一一对应映射得到的PO和Hibernte这种对象化映射得到的PO是截然不同的,本质区别在于这种PO是扁平化的,不像Hibernate映射的PO是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行,但是Hibernate现在已经是主流O/R Mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于iBATIS。
iBATIS的特点:
iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定哗圆功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。当系统属于二次开发,无法对数据库结构做到控制和修改,那iBATIS的灵活性将比Hibernate更适合。系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。在这种情况下iBATIS会有更好的可控性和表现。
对于实际的开发进行的比较:
1. iBATIS需要手写sql语句,也可以生成一森弊部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。同样的需求,iBATIS的工作量比 Hibernate要大很多。类似的,如果涉及到数据库字段的修改,Hibernate修改的地方很少,而iBATIS要把那些sql mapping的地方一一修改。
2. iBatis 可以进行细粒度的优化
比如说我有一个表,这个表有几个或者几十个字段,我需要更新其中的一个字段,iBatis 很简单,执行一个sql UPDATE TABLE_A SET column_1=#column_1# WHERE id=#id# 但是用 Hibernate 的话就比较麻烦了,缺省的情况下 hibernate 会更新所有字段。 当然我记得 hibernate 有一个选项可以控制只保存修改过的字段,但是我不太确定这个功能的负面效果。
例如:我需要列出一个表的部分内容,用 iBatis 的时候,这里面的好处是可以少从数据库读很多数据,节省流量SELECT ID, NAME FROM TABLE_WITH_A_LOT_OF_COLUMN WHERE ...一般情况下Hibernate 会把所有的字段都选出来。比如说有一个上面表有8个字段,其中有一两个比较大的字段,varchar(255)/text。上面的场景中我为什么要把他们也选出来呢?用hibernate 的话,你又不能把这两个不需要的字段设置为lazy load,因为还有很多地方需要一次把整个 domain object 加载出来。这个时候就能显现出ibatis 的好处了。如果我需要更新一条记录(一个对象),如果使用 hibernate,需要现把对象 select 出来,然后再做 update。这对数据库来说就是两条sql。而iBatis只需要一条update的sql就可以了。减少一次与数据库的交互,对于性能的提升是非常重要。
3. 开发方面:
开发效率上,我觉得两者应该差不多。可维护性方面,我觉得 iBatis 更好一些。因为 iBatis 的 sql 都保存到单独的文件中。而 Hibernate 在有些情况下可能会在 java 代码中保sql/hql。相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现。 而iBATIS 的着力点,则在于POJO 与SQL之间的映射关系。也就是说,iBATIS并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。使用iBATIS 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象,这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL 语句,而iBATIS 则要求开发者编写具体的SQL 语句。相对Hibernate而言,iBATIS 以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。
4. 运行效率
在不考虑 cache 的情况下,iBatis 应该会比hibernate 快一些或者很多。
上面是hibernate和ibatis的区别。
现在说一说对于手写sql和存储过程的支持:
这些东西其实我们都不需要担心,这种框架能被大家接受就说明像这种功能那是必须的,一定要支持,否肯定被人扣板砖!
hibernate对手写sql和存储过程都有很好的支持,对于手写sql有的时候还是有必要的,如对于非常复杂的sql语句,可能对于我们用hql语句是很难完成的,这个时候就需要我们用sql来完成,相对于hql,我们还是比较熟练sql的!存储过程的支持也是必要的,和只需简单的一句:CallableStatement cstmt = con.prepareCall(procere); 就能对已有存储过程的调用。
ibatis这我就不多少了,一样,都有很好的支持。
存在就有其合理性,对于不同的情况,我们会有不同的解决方案,所以不要轻易的说那个那个功能不好,没准他就是你解决难题的杀手锏!
Ⅳ mybatis调用mysql存储过程(返回参数,单结果集,多结果集)
mybatis调用mysql存储过程(返回参数,单结果集,多结果集)
注: RETCODE、RETDESC 这里的输出值不用在函数里 SELECT RETCODE; ,因为即使没有,当执行成功后会自动返回在对象里(Object/Map),所以在函数里不用SELECT一下了。
Navicat中执行函数需要输入参数值,也是对应图1,@A@B表示输出值。(一个输入值两个输出值)
1. 标注一二三四五处如果存在,则执行成功后返回结果如下
标注一对应结果1
标注二对应结果2
标注三对应结果3
标注四对应结果4
标注五对应结果5
其中结果3返回的是集合。
存在这么多结果,想要取结果3中的集合是不好取的,只有像下图一样只有一个结果才好取出集合。
2. 标注一二四五处如果不存在,则执行成功后返回结果如下
只有结果1,对应的是标注三处的值。可以取出集合
函数p_plicate_enroll
Ⅵ mybatis调用存储过程
<select id="selectUserById" statementType="CALLABLE" useCache="false">
{
call select_user_by_id(
#{userId,mode=IN},
#{realname,mode=OUT,jdbcType=VARCHAR},
#{username,mode=OUT,jdbcType=VARCHAR},
#{email,mode=OUT,jdbcType=VARCHAR},
#{phone,mode=OUT,jdbcType=VARCHAR},
#{remarks,mode=OUT,jdbcType=VARCHAR},
#{createDate,mode=OUT,jdbcType=TIMESTAMP}
)
}
</select>