<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 默认情况insert和update成功后返回影响行数 -->
<mapper namespace="com.yy.fastcustom.dataoperation.IDataOperationMapper">
<!--=====返回值区=====-->
<resultMap id="idAndNameMap" type="java.util.Map">
<!--column="数据库表字段" property="map中的"-->
<result column="id" javaType="java.lang.String" jdbcType="VARCHAR" property="_id"/>
<result column="name" javaType="java.lang.String" jdbcType="VARCHAR" property="_name"/>
<result column="birthday" javaType="java.lang.String" jdbcType="DATE" property="_birthday"/>
</resultMap>
<!--=====sql区=====-->
<sql id="byId">
<choose>
<!--如果首先判断id,id为null的情况就会报map没有实例化或map属性没有实例化;综上探讨判断attrMap是否为null的时候id出现异常较容易观察-->
<when test="attrMap!=null and attrMap.id!=null and attrMap.id!=''">
id=#{attrMap.id}
</when>
<otherwise>
id=#{id}
</otherwise>
</choose>
</sql> <sql id="where_like">
<!--如果首先判断id,id为null的情况就会报map没有实例化或map属性没有实例化;综上探讨判断attrMap是否为null的时候id出现异常较容易观察-->
<choose>
<when test="v.substring(0,5)=='&lt;-%-&gt;' and v.substring(v.length-5,v.length)=='&lt;-%-&gt;'">
${k} like concat("%",substring_index(substring_index(#{v},"&lt;-%-&gt;",2),"&lt;-%-&gt;",-1),"%")
</when>
<when test="v.substring(0,5)=='&lt;-%-&gt;' and v.substring(v.length-5,v.length)!='&lt;-%-&gt;'">
${k} like concat("%",substring_index(#{v},"&lt;-%-&gt;",-1))
</when>
<when test="v.substring(0,5)!='&lt;-%-&gt;' and v.substring(v.length-5,v.length)=='&lt;-%-&gt;'">
${k} like concat(substring_index(#{v},"&lt;-%-&gt;",1),"%")
</when>
</choose>
</sql> <sql id="where_and_order">
<where>
<foreach collection="attrMap.entrySet()" item="v" index="k" separator=" and ">
<if test="v!=null">
<choose>
<when test="v instanceof java.util.List ">
${k} IN (
<foreach collection="v" item="e" separator=",">
#{e}
</foreach>)
</when>
<otherwise>
<choose>
<when test="v=='' or !v.contains('&lt;-%-&gt;')">
${k}=#{v}
</when>
<otherwise>
<include refid="where_like"></include>
</otherwise>
</choose>
</otherwise>
</choose>
</if>
</foreach>
</where>
<if test="orderList!=null and orderList.size()>0">
order by
<foreach collection="orderList" item="v" separator=",">
${v.v1} ${v.v2}
</foreach>
</if>
</sql> <insert id="basicInsert" parameterType="dataOperationModel">
insert into ${tableName}
<foreach collection="attrMap.keySet()" item="k" separator="," open="(" close=")">
${k}
</foreach>
values
<foreach collection="attrMap.values()" item="v" separator="," open="(" close=")">
#{v}
</foreach>
</insert> <update id="basicUpdate" parameterType="dataOperationModel">
update ${tableName} set
<foreach collection="attrMap.entrySet()" index="k" item="v" separator=",">
<if test="k!='id'">
${k}=#{v}
</if>
</foreach>
<where>
<include refid="byId"></include>
</where>
</update> <delete id="basicDelete" parameterType="dataOperationModel">
delete from ${tableName}
<where>
<include refid="byId"></include>
</where>
</delete> <select id="basicSelect" parameterType="dataOperationModel" resultType="java.util.Map">
select
<foreach collection="attrMap.keySet()" item="k" separator=",">
${k}
</foreach>
from ${tableName}
<include refid="where_and_order"></include>
<if test="limitIndex!=-1l and limitSize!=-1l">
limit #{limitIndex},#{limitSize}
</if>
</select> <select id="basicSelectCount" parameterType="dataOperationModel" resultType="int">
select count(1) from ${tableName}
<include refid="where_and_order"></include>
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载属性文件 -->
<properties resource="db.properties">
<!--properties中还可以配置一些属性名和属性值 -->
<!-- <property name="jdbc.driver" value=""/> -->
</properties>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<!-- 类的别名定义,配置中名称和类型名称间的映射 -->
<typeAlias type="com.yy.fastcustom.bak.Person" alias="person"/>
<typeAlias type="com.yy.fastcustom.dataoperation.DataOperationModel" alias="dataOperationModel"/>
</typeAliases> <environments default="development">
<!--这里除了配置开发环境,也可以配置test环境-->
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis -->
<transactionManager type="JDBC"/>
<!-- druid数据库连接池,由mybatis管理 -->
<dataSource type="com.yy.fastcustom.dataoperation.DruidDataSourceFactory">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments> <!-- 加载 映射文件 -->
<mappers>
<!--通过resource方法一次加载一个映射文件 -->
<!--注意这里的路径和xml文件 -->
<mapper resource="DataOperationMapper.xml"/>
</mappers>
</configuration>
package com.yy.fastcustom.dataoperation;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* Created by zzq on 2019/5/11/011.
*/
public class DataOperationManager {
private static volatile SqlSessionFactory sqlSessionFactory; public static SqlSessionFactory getSqlSessionFactory() {
if (sqlSessionFactory == null)
synchronized (DataOperationManager.class) {
if (sqlSessionFactory == null) {
String filePath = "SqlConfig.xml";
InputStream in = null;
try {
in = Resources.getResourceAsStream(filePath);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(in);
}
}
return sqlSessionFactory;
} public static <T> void operate(Class<T> tClz, DataOperation<T> operation) {
SqlSession ss = getSqlSessionFactory().openSession();
try {
T t = ss.getMapper(tClz);
operation.execute(t);
} catch (Exception e) {
e.printStackTrace();
} finally {
ss.commit();
ss.close();
}
} public static List<Map<String, Object>> basicSelect(DataOperationModel dataOperationModel) {
List<Map<String, Object>> ret = new ArrayList<>();
DataOperationManager.operate(IDataOperationMapper.class, basicMapper -> ret.addAll(basicMapper.basicSelect(dataOperationModel)));
return ret;
} public static int basicSelectCount(DataOperationModel dataOperationModel) {
int ret[] = new int[1];
DataOperationManager.operate(IDataOperationMapper.class, basicMapper -> ret[0] = basicMapper.basicSelectCount(dataOperationModel));
return ret[0];
} public static int basicInsert(DataOperationModel dataOperationModel) {
int ret[] = new int[1];
DataOperationManager.operate(IDataOperationMapper.class, basicMapper -> ret[0] = basicMapper.basicInsert(dataOperationModel));
return ret[0];
} public static int basicDelete(DataOperationModel dataOperationModel) {
int ret[] = new int[1];
DataOperationManager.operate(IDataOperationMapper.class, basicMapper -> ret[0] = basicMapper.basicDelete(dataOperationModel));
return ret[0];
} public static int basicUpdate(DataOperationModel dataOperationModel) {
int ret[] = new int[1];
DataOperationManager.operate(IDataOperationMapper.class, basicMapper -> ret[0] = basicMapper.basicUpdate(dataOperationModel));
return ret[0];
} public interface DataOperation<T> {
void execute(T t);
}
}
package com.yy.fastcustom.dataoperation;

import lombok.Getter;
import lombok.Setter; import java.util.Arrays;
import java.util.List;
import java.util.Map; /**
* Created by zzq on 2019/5/12/012.
*/
@Getter
@Setter
public class DataOperationModel {
private String tableName;
private Map<String, Object> attrMap;
private String id;
private long limitIndex = -1l;
private long limitSize = -1l;
private List<Tuple2> orderList; public DataOperationModel() {
} public DataOperationModel(String tableName, Map<String, Object> attrMap) {
this.tableName = tableName;
this.attrMap = attrMap;
} public DataOperationModel(String tableName, Map<String, Object> attrMap, String id) {
this.tableName = tableName;
this.attrMap = attrMap;
this.id = id;
} public DataOperationModel(String tableName, String id) {
this.tableName = tableName;
this.id = id;
} /**
* 计算分页参数
*
* @param pageIndex
* @param pageSize
*/
public void calcPage(long pageIndex, long pageSize) {
this.limitIndex = (pageIndex - 1) * pageSize;
this.limitSize = pageSize;
} /**
* 排序字段
*
* @param ts
*/
public void orderBy(Tuple2... ts) {
this.orderList = Arrays.asList(ts);
}
}
package com.yy.fastcustom.dataoperation;

import java.util.List;
import java.util.Map; /**
* Created by zzq on 2019/5/12/012.
*/
public interface IDataOperationMapper {
int basicInsert(DataOperationModel dataOperationModel); int basicUpdate(DataOperationModel dataOperationModel); int basicDelete(DataOperationModel dataOperationModel); int basicSelectCount(DataOperationModel dataOperationModel); List<Map<String, Object>> basicSelect(DataOperationModel dataOperationModel);
}
package com.yy.fastcustom.dataoperation;

/**
* Created by zzq on 2019/6/11.
*/
public class Tuple2 {
private String v1;
private String v2; public Tuple2(String v1, String v2) {
this.v1 = v1;
this.v2 = v2;
} public String getV1() {
return v1;
} public String getV2() {
return v2;
}
}
package com.yy.fastcustom.dataoperation;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.DataSourceFactory; import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Properties; /**
* Created by zzq on 2019/5/11/011.
*/
public class DruidDataSourceFactory implements DataSourceFactory {
private Properties props; @Override
public void setProperties(Properties properties) {
this.props = properties;
} @Override
public DataSource getDataSource() {
DruidDataSource dds = new DruidDataSource();
dds.setDriverClassName(this.props.getProperty("driver"));
dds.setUrl(this.props.getProperty("url"));
dds.setUsername(this.props.getProperty("username"));
dds.setPassword(this.props.getProperty("password"));
// 其他配置可以根据MyBatis主配置文件进行配置
try {
dds.init();
} catch (SQLException e) {
e.printStackTrace();
}
return dds;
}
}

DataOperationManager 如果需要手工初始化数据源可以使用如下做法:

 public static SqlSessionFactory getSqlSessionFactory() throws IOException {
if (sqlSessionFactory == null)
synchronized (DataOperationManager.class) {
if (sqlSessionFactory == null) {
// String filePath = "SqlConfig.xml";
// InputStream in = Resources.getResourceAsStream(filePath); TransactionFactory transactionFactory = new JdbcTransactionFactory();
Map<String, DataSource> dataSourceMap = new HashMap<>(); // 配置第一个数据源
DruidDataSource dataSource1 = new DruidDataSource();
dataSource1.setDriverClassName("com.mysql.jdbc.Driver");
dataSource1.setUrl("jdbc:mysql://localhost:3306/ds0?characterEncoding=UTF-8");
dataSource1.setUsername("root");
dataSource1.setPassword("123456");
dataSourceMap.put("ds0", dataSource1); // 配置第二个数据源
DruidDataSource dataSource2 = new DruidDataSource();
dataSource2.setDriverClassName("com.mysql.jdbc.Driver");
dataSource2.setUrl("jdbc:mysql://localhost:3306/ds1?characterEncoding=UTF-8");
dataSource2.setUsername("root");
dataSource2.setPassword("123456");
dataSourceMap.put("ds1", dataSource2); // 配置Order表规则
TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("td_table", "ds${0..1}.td_table${0..1}"); // 配置分库 + 分表策略
orderTableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("id", "ds${id % 2}"));
orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "td_table${order_id % 2}")); // 配置分片规则
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig); // 省略配置order_item表规则... // 获取数据源对象
DataSource dataSource = null;
try {
dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties());
} catch (SQLException e) {
e.printStackTrace();
}
Configuration c = new Configuration();
c.setLogImpl(StdOutImpl.class);
//注册类别名必须在设置Mapper之前,否则mybatis执行时将找不到
c.getTypeAliasRegistry().registerAlias("dataOperationModel", "com.yy.fastcustom.dataoperation.DataOperationModel");
c.addMappers("com.yy.fastcustom.dataoperation"); Environment environment = new Environment("1", transactionFactory, dataSource);
c.setEnvironment(environment);
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(c);
}
}
return sqlSessionFactory;
}

通用mybatis单表操作接口的更多相关文章

  1. mybatis单表操作实现完全java代码封装

    之前在项目中用到mybtis操作数据库时都是手动写sql,对于我这种sql水平不是很好地人来说痛苦死了:动态查询的sql我表示到现在还不会写呀! 还好,利用数据库表反向生成的工具可以帮我解决大部分的s ...

  2. web框架开发-Django模型层(1)之ORM简介和单表操作

    ORM简介 不需要使用pymysql的硬编码方式,在py文件中写sql语句,提供更简便,更上层的接口,数据迁移方便(有转换的引擎,方便迁移到不同的数据库平台)…(很多优点),缺点,因为多了转换环节,效 ...

  3. Django模型层-单表操作

    ORM介绍 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

  4. python 全栈开发,Day71(模型层-单表操作)

    昨日内容回顾 1. {% include '' %} 2. extend base.html: <html> ..... ..... ..... {% block content%} {% ...

  5. ORM 简介 单表操作

    cls超 Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型 ...

  6. Django基础五之django模型层(一)单表操作

    一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

  7. Django模型层:单表操作

    一 ORM简介 查询数据层次图解:如果操作mysql,ORM是在pymysq之上又进行了一层封装

  8. Django-05模型层之单表操作1

    7.1 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开 ...

  9. Django的模型层(1)- 单表操作(上)

    一.ORM简介       MTV或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的 ...

随机推荐

  1. 【CSP模拟赛】独立集(最长上升子序列&大力猜结论)

    题目描述 有一天,一个名叫顺旺基的程序员从石头里诞生了.又有一天,他学会了冒泡排序和独 立集.在一个图里,独立集就是一个点集,满足任意两个点之间没有边.于是他就想把这两 个东西结合在一起.众所周知,独 ...

  2. mysql5.6源码部署

    一.准备环境 环境:centos-7.3 一台软件版本:mysql-5.6.39 1.安装依赖yum -y install autoconf libaio bison ncurses-devel 2. ...

  3. fluent求平均温度、最高低温度和平均传热系数【转载】

    摘自<ANSYS FLUENT技术基础与工程应用:流动传热与环境污染控制领域> 一.平均温度的计算: 双击导航栏中Result下方的Report进入Report任务页面,双击其中的Volu ...

  4. ubuntu之路——day8.1 深度学习优化算法之mini-batch梯度下降法

    所谓Mini-batch梯度下降法就是划分训练集和测试集为等分的数个子集,比如原来有500W个样本,将其划分为5000个baby batch,每个子集中有1000个样本,然后每次对一个mini-bat ...

  5. Qt 操作QDomDocument对象修改节点

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/liulihuo_gyh/article/d ...

  6. 静态导入(static import)

    1.传统静态方法的调用方式 定义一个Common类,里面有静态方法和静态常量 package com.example.common; public class Common { public stat ...

  7. go之web框架 iris

    前言 最近开始学习GO的WEB框架,IRIS号称是Go最快的后端Web框架,目前发展最快的Go Web框架.提供完整的MVC功能并且面向未来. 所以先从它开始. github地址 https://gi ...

  8. Dart接口

    /* 和Java一样,dart也有接口,但是和Java还是有区别的. 首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现. 同样使用implements关 ...

  9. Dart静态方法、对象操作符和类的继承

    /* Dart中的静态成员: 1.使用static 关键字来实现类级别的变量和函数 2.静态方法不能访问非静态成员,非静态方法可以访问静态成员 */ // class Person { // stat ...

  10. JDK动态代理在RPC框架中的应用

    RPC框架中一般都有3个角色:服务提供者.服务消费者和注册中心.服务提供者将服务注册到注册中心,服务消费者从注册中心拉取服务的地址,并根据服务地址向服务提供者发起RPC调用.动态代理在这个RPC调用的 ...