一、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; } }
实例效果:
今天分享就到这里,后面还会不断更新,感谢诸君的阅读与支持,如果对你有用就点个赞吧!