一、Mango简介
mango的中文名是“芒果”,它是一个极速分布式ORM框架。
特性:超高性能,响应速度接近直接使用JDBC
采用接口与注解的形式定义DAO,完美结合db与cache操作
支持动态sql,可以构造任意复杂的sql语句
支持多数据源,分表,分库,事务
提供拦截器功能,利用拦截器可为mango框架扩展各种自定义插件
独创“函数式调用”功能,能将任意复杂的对象,映射到数据库的表中
高效详细的实时统计系统,方便开发者随时了解自己的系统
独立jar包,不依赖其它jar包
提供便捷的spring插件,与spring无缝集成
二、如何使用Mango
方法1.添加pom.xml依赖
org.jfaster
mango
1.6.1
方法2.导入mango.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 getUsersByIds(List 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文件配置:
org.jfaster
mango
1.6.1
mysql
mysql-connector-java
5.1.46
com.google.code.gson
gson
2.8.5
com.google.guava
guava
19.0
org.apache.commons
commons-lang3
3.4
com.alibaba
fastjson
1.2.38
(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 {
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 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;
}
}
实例效果:
今天分享就到这里,后面还会不断更新,感谢诸君的阅读与支持,如果对你有用就点个赞吧!