<?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. Redis哨兵日志说明

    一.说明

  2. PC 端常用软件

    WPS  金山文档  有道云笔记  格式工厂 运行精灵 UC 遨游 360 Firefox 浏览器 光影魔术手 美图秀秀 2345好压 火绒安全软件 有道云笔记 悟空游戏厅 微信 QQ 迅雷 百度网盘 ...

  3. 深度学习面试题27:非对称卷积(Asymmetric Convolutions)

    目录 产生背景 举例 参考资料 产生背景 之前在深度学习面试题16:小卷积核级联卷积VS大卷积核卷积中介绍过小卷积核的三个优势: ①整合了三个非线性激活层,代替单一非线性激活层,增加了判别能力. ②减 ...

  4. [转] Filezilla server设置指南及中文乱码、登录欢迎语问题解决

    一.filezilla server 安装指南:FileZilla是一款免费而且开源的FTP工具.包括FileZilla Client,FileZilla Server两个版本.FileZilla S ...

  5. python 处理geoJson to shp 互转

  6. 【json/regex】将简单对象生成的json文进行内部排序后再输出

    有这样一个实体类: package com.hy; public class Emp { private int id; private int age; private String name; p ...

  7. Windows 10 Tensorflow 2 gpu正式版安装和更新日志

    Windows 10 Tensorflow 2 gpu正式版安装和更新日志 Tensorflow 2.0.0 released on2019年10月1日星期二 Link: https://github ...

  8. 前端通用下载文件方法(兼容IE)

    之前在网上看到一个博主写的前端通用的下载文件的方法,个人觉得很实用,所以mark一下,方便以后查阅 源文地址(源文还有上传/下载excel文件方法) 因为项目要求要兼容IE浏览器,所以完善了一下之前博 ...

  9. OpenGL ES: (5) OpenGL的基本概念、OpenGL ES 在屏幕产生图片的过程、OpenGL管线(pipeline)

    一. OpenGL的基本概念 OpenGL 的结构可以从逻辑上划分为下面 3 个部分: 图元(Primitives) 缓冲区(Buffers) 光栅化(Rasterize) 图元(Primitives ...

  10. ubuntu18 更换屏幕分辨率

    ubuntu18.04怎么修改屏幕分辨率 最近在自己的电脑中安装了ubuntu18.04系统,默认分辨率不对所以只好自己修改分辨率,但是在桌面右键并没找到设置分辨率的选项,那么我们应该在哪里设置分辨率 ...