初识—极速分布式ORM框架---Mango

一、Mango简介

mango的中文名是芒果,它是一个极速分布式ORM框架。

特性:

  • 超高性能,响应速度接近直接使用JDBC

  • 采用接口与注解的形式定义DAO,完美结合db与cache操作

  • 支持动态sql,可以构造任意复杂的sql语句

  • 支持多数据源,分表,分库,事务

  • 提供拦截器功能,利用拦截器可为mango框架扩展各种自定义插件

  • 独创“函数式调用”功能,能将任意复杂的对象,映射到数据库的表中

  • 高效详细的实时统计系统,方便开发者随时了解自己的系统

  • 独立jar包,不依赖其它jar包

  • 提供便捷的spring插件,与spring无缝集成

二、如何使用Mango

方法1.添加pom.xml依赖

<dependency>
    <groupId>org.jfaster</groupId>
    <artifactId>mango</artifactId>
    <version>1.6.1</version>
</dependency>

方法2.导入mango.jar

下载地址:http://search.maven.org/remotecontent?filepath=org/jfaster/mango/1.6.1/mango-1.6.1.jar

三、构造数据源并初始化mango对象

mango框架对java标准数据源 javax.sql.DataSource 进行了简单实现,所以这里构造数据源不需要引入第三方jar包。

初始化数据源需要4个参数:

  • driverClassName:      驱动程序类名,这里我们使用MySQL驱动,所以类名是 com.mysql.jdbc.Driver 。

  • url:      连接数据库的url,这里我们将连接到本地MySQL的mango_example库,所以地址为 jdbc:mysql://localhost:3306/mango_example 。

  • username:      数据库用户名,这里我们使用root作为用户名。

  • password:      用户名所对应的密码,这里我们使用root作为密码。


四、Mango框架的基本操作

更新

更新主要包含insert,delete与update这三种操作。

通常情况化更新操作支持四种类型的返回值:

1、void或java.lang.Void:不返回值

2、int或java.lang.Integer:返回有多少行数据受到了影响

3、long或java.lang.Long:返回有多少行数据受到了影响

4、boolean或java.lang.Boolean:false表示没有数据受到影响,true表示有一到多行数据受到影响

 

批量更新

批量更新主要包含insert,delete与update这三种操作。

批量更新的输入只能有一个参数,参数的类型必须是List或Set或Array。

批量更新的输出支持三种类型的返回值:

1、void或java.lang.Void:不返回值

2、int或java.lang.Integer:返回累计有多少行数据受到了影响

3、int[]或java.lang.Integer[]:返回每条更新语句影响到了多少行数据

五、Mango框架参数绑定方式

参数绑定指的是:将接口参数绑定到SQL指定的位置中,也即向SQL中传入参数。

 

方式1:序号绑定

序号绑定指的是将接口参数的序号绑定到SQL指定的位置中。 参数的序号从1开始,:1表示使用第1个参数,:2表示使用第2个参数,以此类推。 下面是序号绑定的实例:

@SQL("insert into binding_user(uid, name, age) values(:1, :2, :3)")
public void addUserByIndex(int uid, String name, int age);

 

方式2:重命名绑定

可以使用注解@Rename对参数进行重命名绑定,实例:

@SQL("insert into user(name, age, gender, money, update_time) values(:name, :age, :gender, :money, :updateTime)")
public void addUserByRename(@Rename("name")String name, @Rename("age")int age, @Rename("gender")boolean gender, @Rename("money")long money, @Rename("updateTime")Date updateTime);

 

方式3:列表参数绑定

在SQL中使用in操作的时候,我们会使用到列表参数绑定。 下面是列表参数绑定的实例:

@SQL("select id, name, age from user where id in (:1)")
public List<User> getUsersByIds(List<Integer> ids);

需要注意的是, in (:1) 中的参数必须是List或Set或Array,同时返回参数也必须是List或Set或Array。

 

方式4:属性绑定

当接口参数传入的是自定义对象时,我们可以使用属性绑定。 下面是属性绑定的实例:

@SQL("insert into user(id, name, age) values(:1.id, :1.name, :1.age)")
public void addUserByObjIndex(User user);

需要注意的是,User类的属性必须具有get方法, 因为:1.uid将调用getUid()方法获取参数,:1.name将调用getName()方法获取参数,:1.age将调用getAge()方法获取参数。

 

方式5:属性自动匹配

在使用自定义对象时,使用:1.uid或:u.uid绑定参数会显得不够简练,mango实现了属性自动匹配功能,使SQL更加简练。 下面是属性自动匹配的实例:

@SQL("insert into user(id, name, age) values(:id, :name, :age)")
public void addUserByProperty(User user);

 

方式6:混合绑定

各种参数绑定混合使用:

@SQL("insert into user(id, name, age) values(:id, :name, :age)")
public void addUserByMix(@Rename("myid") int id, User user);

六.Mongo框架使用实例

(1)表结构

CREATE TABLE `fruit` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '水果名称',
  `num` int(11) NOT NULL COMMENT '数量',
  `price` decimal(10,2) DEFAULT NULL COMMENT '价格',
  `address` varchar(50) DEFAULT NULL COMMENT '产地',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

(2)项目pom.xml文件配置:

<dependencies>
    <dependency>
        <groupId>org.jfaster</groupId>
        <artifactId>mango</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>19.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.38</version>
    </dependency>
</dependencies>

(3)实体类:

package com.lhf.mango.entity;

import org.jfaster.mango.annotation.ID;

/**
 * @ClassName: Fruit
 * @Desc:  水果实体
 * @Author: liuhefei
 * @Date: 2018/12/20 15:31
 */
public class Fruit {
    @ID
    private Integer id;

    private String name;

    private int num;

    private double price;

    private  String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Fruit{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", num=" + num +
                ", price=" + price +
                ", address='" + address + '\'' +
                '}';
    }
}

(4)Dao类:

package com.lhf.mango.dao;

import com.lhf.mango.entity.Fruit;
import org.jfaster.mango.annotation.DB;
import org.jfaster.mango.annotation.SQL;
import org.jfaster.mango.crud.CrudDao;

import java.util.List;

@DB(table="fruit")
public interface FruitDao extends CrudDao<Fruit, Long> {
    String COLUMNS = "id, name, num, price, address";

    //插入数据
    @SQL("insert into #table(" + COLUMNS + ") values(:id, :name, :num, :price, :address)")
    public void add(Fruit fruit);

    //根据name取num的总和
    @SQL("select sum(num) from #table where name=:1")
    public int getTotalNum(String name);

    //查询所有水果
    @SQL("select " + COLUMNS + " from #table")
    List<Fruit> list();

    //根据水果id查询水果信息
    @SQL("select " + COLUMNS + " from #table where id = :1")
    Fruit getFruitByid(Long id);

    @SQL("select count(*) from #table")
    int countNum();
}

(5)主方法:实现添加、查询功能

package com.lhf.mango;

import com.lhf.mango.dao.FruitDao;
import com.lhf.mango.entity.Fruit;
import org.jfaster.mango.datasource.DriverManagerDataSource;
import org.jfaster.mango.operator.Mango;
import org.jfaster.mango.util.logging.MangoLogger;

import javax.sql.DataSource;

/**
 * @ClassName: MangoDemo
 * @Desc: mango的中文名是“芒果”,它是一个极速分布式ORM框架。
 * 实现增删改查操作,这里也是操作单一数据库实例
 * @Author: liuhefei
 * @Date: 2018/12/20 15:23
 */
public class MangoDemo {
    //定义数据源
    String driverClassName = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/mango_example";
    String username = "root";
    String passowrd = "root";
    DataSource ds = new DriverManagerDataSource(driverClassName,url, username, passowrd);
    Mango mango = Mango.newInstance(ds);  //使用数据源初始化mango

    public static void main(String[] args){
        MangoLogger.useConsoleLogger();   //在控制台输出日志

        MangoDemo mangoDemo = new MangoDemo();
        //添加水果
        mangoDemo.add("苹果", 100, 5.8, "云南昆明");
        mangoDemo.add("香蕉", 200, 3.6, "云南西双版纳");
        mangoDemo.add("雪梨", 340, 8.8, "天山");
        mangoDemo.add("葡萄", 130, 6.4, "新疆吐鲁番");

        mangoDemo.getTotalNum("苹果");

        mangoDemo.list();

        mangoDemo.getFruitByid(3);

        System.out.println("总数:"+mangoDemo.countNum());
    }

    public void add(String name, int num, double price, String address){
        FruitDao fruitDao = mango.create(FruitDao.class);
        Fruit fruit = new Fruit();
        fruit.setName(name);
        fruit.setNum(num);
        fruit.setPrice(price);
        fruit.setAddress(address);
        fruitDao.add(fruit);
    }

    public void getTotalNum(String name){
        FruitDao fruitDao = mango.create(FruitDao.class);
        int num = fruitDao.getTotalNum(name);
        System.out.println(name + "的num是: " + num);
    }

    public void list(){
        FruitDao fruitDao = mango.create(FruitDao.class);
        String fruitList = fruitDao.list().toString();
        System.out.println("fruitList = " + fruitList);
    }

    public void getFruitByid(long id){
        FruitDao fruitDao = mango.create(FruitDao.class);
        String fruit = fruitDao.getFruitByid(id).toString();
        System.out.println("fruit = " + fruit);
    }

    public int countNum(){
        FruitDao fruitDao = mango.create(FruitDao.class);
        int num = fruitDao.countNum();
        return  num;
    }

}

实例效果:

《初识—极速分布式ORM框架---Mango》

今天分享就到这里,后面还会不断更新,感谢诸君的阅读与支持,如果对你有用就点个赞吧!

点赞