1.批量执行

public void addUser(User user);

<insert id="addUser" parameterType="model.User">
INSERT INTO user (id,last_name,email) VALUES
(#{id},#{lastName},#{email})
</insert>
@Test
public void testBatch() {
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
long currentTimeMillis = System.currentTimeMillis();
User user = new User();
user.setId();
user.setGender("");
// user.setEmail("1232341");
for (int i = ; i < ; i++) {
//mapper.addUser(new User(Integer.parseInt(UUID.randomUUID().toString().substring(0,5)),"aa","11"));
mapper.addUser(new User(i+,"aa",""));
}
long currentTimeMillis2 = System.currentTimeMillis();
System.out.println("执行时长:"+(currentTimeMillis-currentTimeMillis2));
sqlSession.commit();
// 释放资源
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}

整合spring配置拿到批量执行的链接,直接注入使用即可

2.存储过程的使用

  oracle

  

package page;

import java.util.List;

import model.User;
/**
* 分装分页查询数据
* @author admin
*
*/
public class Page { private int start;
private int end;
private int count;
private List<User> users;
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
} }

--创建存储过程 

CREATE OR REPLACE PROCEDURE page(
p_start in int,p_end in int,p_count out int,p_users out sys_refcursor
) as
begin
select count(*) into p_count from user;
open p_users for
select * from (select rownum rn,u.* from user u where rownum<=P_end) where rn>=p_start; end page;

mybatis 调用存储过程

 public void selectPageByProcedure(Page page);

  

<resultMap type="user" id="pageMap">
<id column="id" property="id" />
<result column="last_name" property="lastName" />
<result column="email" property="email" />
<result column="gender" property="gender" />
</resultMap>
<select id="selectPageByProcedure" statementType="CALLABLE" >
{call page(
#{start,mode=IN,jdbcType=INTEGER},
#{end,mode=IN,jdbcType=INTEGER},
#{count,mode=OUT,jdbcType=INTEGER},
#{users,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=pageMap},
)}
</select>

单元测试

  

/**
* oracle分页:
* 借助rownum:行号;子查询;
* 存储过程包装分页逻辑
*/
@Test
public void testProcedure() {
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Page page =new Page();
page.setStart();
page.setEnd();
page.setStart();
mapper.selectPageByProcedure(page);
System.out.println("总记录数:"+page.getCount());
System.out.println("查出的数据数:"+page.getUsers().size());
System.out.println("查出的数据:"+page.getUsers());
sqlSession.commit();
// 释放资源
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}

3.自定义TypeHandler类型处理枚举类型

  通用枚举类处理

  

package model;

public enum UserStates {

    LOGIN,LOGINOUT,LOCK
}

 添加枚举属性

  

@Alias("user")
public class User { private int id;
private String lastName;
private String email;
private String gender;
private Department dept;
private UserStates state;
<!--public void addUser(User user)-->
<insert id="addUser" parameterType="model.User">
INSERT INTO user (id,last_name,email,user_states) VALUES
(#{id},#{lastName},#{email},#{state})
</insert>
/**
* mybaits 处理枚举对象的时候取名字,EnumTypeHandler(默认执行),存入库中名字
* 改变使用:EnumOrdinalTypeHandler(配置指定)
*/
@Test
public void testEnum() {
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user =new User(,"aa","");
user.setState(UserStates.LOGIN);
mapper.addUser(user);
sqlSession.commit();
// 释放资源
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}

//指定handler后,插入枚举值

<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="model.UserStates"/>
</typeHandlers>

枚举获取其属性demo

@Test
public void testEnumUse() {
UserStates login = UserStates.LOGIN;
System.out.println(login.ordinal());
System.out.println(login.name());
}

自定义:

  存入指定code,输出指定msg

package model;

/**
* 保存状态码
* @author admin
*
*/
public enum UserStates { LOGIN(,"用户登录"),LOGINOUT(,"用户登出"),LOCK(,"用户被锁"); private Integer code;
private String msg;
private UserStates(Integer code,String msg){
this.code=code;
this.msg=msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
//按照状态码返回枚举对象
public static UserStates getUserStatesByCode(Integer code){
switch(code){
case :
return LOGIN;
case :
return LOGINOUT;
case :
return LOCK;
default:
return LOGINOUT;
}
}
}

  测试获取属性

  

@Test
public void testEnumUse() {
UserStates login = UserStates.LOGIN;
System.out.println(login.ordinal());
System.out.println(login.name());
System.out.println(login.getCode());
System.out.println(login.getMsg());
}

自定义类型处理器

package handler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler; import model.UserStates; /**
* 实现TypeHandler接口或者继承BaseTypeHandler
* @author admin
*
*/
public class EnumUserStatesHandler implements TypeHandler<UserStates>{
/**
* 定义参数如何保存
*/
@Override
public void setParameter(PreparedStatement ps, int i, UserStates parameter, JdbcType jdbcType) throws SQLException {
// TODO Auto-generated method stub
ps.setString(i, parameter.getCode().toString());
} @Override
public UserStates getResult(ResultSet rs, String columnName) throws SQLException {
// TODO Auto-generated method stub
int code = rs.getInt(columnName);
System.out.println("从数据库中获取到状态码:"+code);
UserStates states = UserStates.getUserStatesByCode(code);
return states;
} @Override
public UserStates getResult(ResultSet rs, int columnIndex) throws SQLException {
int code = rs.getInt(columnIndex);
System.out.println("从数据库中获取到状态码:"+code);
UserStates states = UserStates.getUserStatesByCode(code);
return states;
} @Override
public UserStates getResult(CallableStatement cs, int columnIndex) throws SQLException {
int code = cs.getInt(columnIndex);
System.out.println("从数据库中获取到状态码:"+code);
UserStates states = UserStates.getUserStatesByCode(code);
return states;
} }

 public void addUser(User user);

 public User selectUserStates(Integer id);

  

<insert id="addUser" parameterType="model.User">
INSERT INTO user (id,last_name,email,user_states) VALUES
(#{id},#{lastName},#{email},#{state})
</insert>
<select id="selectUserStates" resultType="user">
select user_states state from user where id=#{id}
</select>
mybatis-cofig配置
<typeHandlers>
<!--配置自定义类型处理器 -->
<typeHandler handler="handler.EnumUserStatesHandler" javaType="model.UserStates"/>
</typeHandlers>

  

@Test
public void testEnum() {
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user =new User(,"aa","");
//插入数据
user.setState(UserStates.LOGIN);
//mapper.addUser(user);
User selectUserStates = mapper.selectUserStates();
System.out.println(selectUserStates.getState());
sqlSession.commit();
// 释放资源
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}

其他地方配置类型处理器,也可以实现上述效果

Mybatis十( mybatis其他使用)的更多相关文章

  1. 【Mybatis】MyBatis之配置多数据源(十)

    在做项目的过程中,有时候一个数据源是不够,那么就需要配置多个数据源.本例介绍mybatis多数据源配置 前言 一般项目单数据源,使用流程如下: 单个数据源绑定给sessionFactory,再在Dao ...

  2. 【Mybatis】MyBatis之配置自定义数据源(十一)

    本例是在[Mybatis]MyBatis之配置多数据源(十)的基础上进行拓展,查看本例请先学习第十章 实现原理 1.扩展Spring的AbstractRoutingDataSource抽象类(该类充当 ...

  3. Hello Mybatis 02 mybatis generator

    接着上一篇文章通过Mybatis完成了一个User的CRUD的功能之后,这篇开始还需要建立一个Blog类,这样就可以模拟一个简单的微博平台的数据库了. 数据库准备 首先我们,还是需要在数据库中新建一个 ...

  4. 【Mybatis】MyBatis之动态SQL(六)

    MyBatis 的强大特性之一便是它的动态 SQL,本章介绍动态 SQL 查看本章,请先阅读[Mybatis]MyBatis对表执行CRUD操作(三). 本例表结构 CREATE TABLE `emp ...

  5. 【Mybatis】MyBatis之Sql配置文件的使用(四)

    上一章[Mybatis]MyBatis对表执行CRUD操作(三),已经讲了基本操作,本章介绍Sql配置文件中常用功能 1.插入返回主键 2.参数值的获取方式 3.resultMap使用 插入返回主键 ...

  6. MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义

    ----致敬MyBatis官方开放文档让大家翻译,不用看书直接看文档就行了,mybatis的中文文档还需要完备的地方 简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以 ...

  7. 【Mybatis】MyBatis对表执行CRUD操作(三)

    本例在[Mybatis]MyBatis配置文件的使用(二)基础上继续学习对表执行CRUD操作 使用MyBatis对表执行CRUD操作 1.定义sql映射xml文件(EmployeeMapper.xml ...

  8. 【Mybatis】MyBatis配置文件的使用(二)

    本例在[Mybatis]MyBatis快速入门(一)基础上继续学习XML映射配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properti ...

  9. 【转】Mybatis学习---MyBatis知识、原始Dao开发和mapper代理开发

    [原文]https://www.toutiao.com/i6594610137560777223/ 一.什么是MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及 ...

  10. 【MyBatis】MyBatis之如何配置

    1,MyBatis简介 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简 ...

随机推荐

  1. 生成OSIDAAuto.OPCServer失败

    来源:https://pisquare.osisoft.com/message/13441 A failuare of generating OSIDAAuto.OPCServer dorislipe ...

  2. ubantu 重启mysql

    如何启动/停止/重启MySQL一. 启动方式 1.使用 service 启动:service mysql start 2.使用 mysqld 脚本启动:/etc/inint.d/mysql start ...

  3. Django-models-迁移错误

    错误表现:数据表二次迁移时:django.db.utils.InternalError: (1138, 'Invalid use of NULL value') 错误原因:是因为二次修改了null值属 ...

  4. 开始使用GoJS

    GoJS是一个用于实现交互式图表的JavaScript库.本页将向您展示使用GoJS的必要条件. 由于GoJS是一个依赖于HTML5功能的JavaScript库,因此您需要确保您的页面声明它是一个HT ...

  5. 【Java】Java初始化过程总结

    概述 Java字节代码:byte[] Java类在JVM的表现形式:Class类的对象: Java源代码被编译成class字节码 : Java字节代码 --> Class类的对象: 加载:把Ja ...

  6. P2871 手链

    传送 这个题的数据限制没有翻译出来,所以有可能产生爆内存现象 再此翻译一下:1<=n(物品个数)<=3402,1<=M(总重量)<=12880 (就这两个有点用) 显然这是一个 ...

  7. [UE4]时间轴线TimeLine,Lerp插值

    一.TimeLine时间轴线 勾选“User Last Keyframe”表示使用时间轴最后一个关键帧所在时间点作为结束时间,而不是使用设置的5秒作为结束时间点. 二.Lerp插值 Lerp插值一般与 ...

  8. Visual Ribbon Editor for CRM 连接

  9. kafka的安装 (单机)

    https://blog.csdn.net/q282176713/article/details/81112988

  10. Windows NAT端口映射

    由于有需求进行端口映射,又不想装乱七八糟的软件,Windows本身自带的路由远程访问配置太麻烦,还要两块网卡,坑爹啊. 其实Windows本身命令行支持配置端口映射,条件是已经安装了IPV6,启不启用 ...