Mybatis十( mybatis其他使用)
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其他使用)的更多相关文章
- 【Mybatis】MyBatis之配置多数据源(十)
在做项目的过程中,有时候一个数据源是不够,那么就需要配置多个数据源.本例介绍mybatis多数据源配置 前言 一般项目单数据源,使用流程如下: 单个数据源绑定给sessionFactory,再在Dao ...
- 【Mybatis】MyBatis之配置自定义数据源(十一)
本例是在[Mybatis]MyBatis之配置多数据源(十)的基础上进行拓展,查看本例请先学习第十章 实现原理 1.扩展Spring的AbstractRoutingDataSource抽象类(该类充当 ...
- Hello Mybatis 02 mybatis generator
接着上一篇文章通过Mybatis完成了一个User的CRUD的功能之后,这篇开始还需要建立一个Blog类,这样就可以模拟一个简单的微博平台的数据库了. 数据库准备 首先我们,还是需要在数据库中新建一个 ...
- 【Mybatis】MyBatis之动态SQL(六)
MyBatis 的强大特性之一便是它的动态 SQL,本章介绍动态 SQL 查看本章,请先阅读[Mybatis]MyBatis对表执行CRUD操作(三). 本例表结构 CREATE TABLE `emp ...
- 【Mybatis】MyBatis之Sql配置文件的使用(四)
上一章[Mybatis]MyBatis对表执行CRUD操作(三),已经讲了基本操作,本章介绍Sql配置文件中常用功能 1.插入返回主键 2.参数值的获取方式 3.resultMap使用 插入返回主键 ...
- MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义
----致敬MyBatis官方开放文档让大家翻译,不用看书直接看文档就行了,mybatis的中文文档还需要完备的地方 简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以 ...
- 【Mybatis】MyBatis对表执行CRUD操作(三)
本例在[Mybatis]MyBatis配置文件的使用(二)基础上继续学习对表执行CRUD操作 使用MyBatis对表执行CRUD操作 1.定义sql映射xml文件(EmployeeMapper.xml ...
- 【Mybatis】MyBatis配置文件的使用(二)
本例在[Mybatis]MyBatis快速入门(一)基础上继续学习XML映射配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properti ...
- 【转】Mybatis学习---MyBatis知识、原始Dao开发和mapper代理开发
[原文]https://www.toutiao.com/i6594610137560777223/ 一.什么是MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及 ...
- 【MyBatis】MyBatis之如何配置
1,MyBatis简介 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简 ...
随机推荐
- C# DataAdapter.Update() 无法更新数据表中删除的数据行
用DataAdapter.Update() 方法更新删除了部分DataRow 的 DataTable .但是数据库中的数据没有随着更新而变化. 原因:DataTable 删除 DataRow 时,使用 ...
- Azure SQL 数据库仓库Data Warehouse (2) 架构
<Windows Azure Platform 系列文章目录> 在上一篇文章中,笔者介绍了MPP架构的基本内容 在本章中,笔者给大家介绍一下Azure SQL Data Warehouse ...
- <亲测>CentOS 7.3下Node.js 8.6安装配置(含NPM以及PM2)
CentOS 7.3下Node.js 8.6安装配置 2017年09月30日 14:12:02 阅读数:2245更多 个人分类: Nodejs 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- DS图遍历--深度优先搜索
DS图遍历--深度优先搜索 题目描述 给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始 注意:图n个顶点编号从0到n-1 代码框架如下: 输入 第一行输入t,表示有t个测试实例 第二行输入n, ...
- C++进阶--解谜operator new/delete
//############################################################################ // 解谜operator new/del ...
- JPanel添加键盘监听事件
因为在自己的游戏需求中谢了要用键盘控制飞机的移动,所以用到键盘监听事件,但是使用了JPanel之后添加了键盘监听事件,按相应的方向键飞机并没有反应.但是如果是为JFrame的内容面板加则会有反应. 为 ...
- PAT 乙级 1043 输出PATest(20) C++版
1043. 输出PATest(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一个长度不超过10000 ...
- Mina2 udp--zhengli
一.包与类名. 1.所有类和方法严格使用驼峰法命名.例:SSLFilter 更名为 SslFilter.NIO传输类在命名时增加 Nio 前缀.因为NIO 并不是 socket/datagram 传输 ...
- HTML背景图片自适应
由于<body>标签的图片不能够拉伸, 解决办法: 1.图片不够大,又background属性不能拉伸图片: 2.只能用个div,把其z-index值设为负,并使这个div大小为整个bod ...
- 廖雪峰Java4反射与泛型-1反射-1Class类
1.Class类与反射定义 Class类本身是一种数据类型(Type),class/interface的数据类型是Class,JVM为每个加载的class创建了唯一的Class实例. Class实例包 ...