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. 查看耗时长,CPU 100% 的SQL

    [session_id], [request_id], [start_time] AS '开始时间', [status] AS '状态', [command] AS '命令', dest.[text] ...

  2. WPF DataGrid 导出Excel

    #region Excel导出 private void btnExportExcel_Click(object sender, RoutedEventArgs e) { Export(this.dg ...

  3. 关于HTML元素点击的时候,背景颜色秒进,缓缓退出的方法

    废话不多说,上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  4. 关于java多线程理解到集群分布式和网络设计的浅析

    对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题, 另外关于java多线程的知识也是非常的多,本文中先介绍和说明一 ...

  5. python中numpy的random模块

    1. rand(d0,d1,.....,dn)产生[0,1]的浮点随机数,括号里面的参数可以指定产生数组的形状    例如:np.random.rand(3,2)则产生 3×2的数组,里面的数是0-1 ...

  6. unittest框架 assertEqual 报错 让其出现中文的方法(这个问题出现时 我找了老半天) 还追加了 报错信息自定义的方法

    1,发现如果assertEqual里面放的是变量,不会展示中文出来 2,放的是中文(注意前面加u)就可以展示中文出来 改进后的方法:(可以放入变量去对比还可以展示中文的方法)

  7. windows修改远程桌面端口3389

    regedit 按照路径打开,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-T ...

  8. PHP程序员的进阶之路

    第1阶段:初级PHP程序员 重点:把LNMP搞熟练(核心是安装配置基本操作)目标:能够完成基本的LNMP环境安装,简单配置维护:能够做基本的简单系统的PHP开发:能够在PHP中型系统中支持某个PHP功 ...

  9. T-SQL 类型转换

    use StudentManageDB go --定义变量并查询 declare @sumScore int select @sumScore=(CSharp+SQLServerDB) from Sc ...

  10. 怎么查看SAS到期时间

    通过以下命令,可以查看SAS到期时间: proc setinit; run;