Skip to content

Repository files navigation

Features

Join the chat at https://gitter.im/monalisa-orm/community

  • Using the database takes only 1 line of code
  • Generic ORM functions(CRUD)
  • Auto-Generate DTOs
  • Object fields
  • Reload SQL dynamically
  • Sharding support
  • Write multi-line strings easily

5 minutes video: Youtube / YouKu

Example Project | Eclipse Plugin

Usage

Using Database with plugin

image

Using Database without plugin

@DB(url="jdbc:mysql://127.0.0.1:3306/test" ,username="root", password="root")
publicinterfaceTestDB{
publicstaticDBConfigDB=DBConfig.fromClass(TestDB.class); publicstaticclassNewsModelGenerator{
publicstaticvoidmain(String[] args) {
DBModelGenerateMain.generateModelClass(TestDB.class);
}
}
}
newUser().setName("zzg.zhou").setStatus(1).save();

Auto-Generate DTOs (need eclipse-plugin)

image

publicclassUserBlogDao {
@Select(name="test.result.UserBlogs") // <--- Auto create/update: test.result.UserBlogspublicListselectUserBlogs(intuser_id){ // <--- Auto replace List to List<UserBlogs>Queryq=TestDB.DB.createQuery();
q.add(""/**~{ SELECT a.id, a.name, b.title, b.content, b.create_time FROM user a, blog b  WHERE a.id=b.user_id AND a.id=?  }*/, user_id);
returnq.getList(); // <--- Auto replace getList() to getList<UserBlogs>
} }

Database Service

Direct Database Access by HTTP, see: monalisa-service

 curl http://localhost:8080/your_web_app/dbs/testdb/your_table_name

Query Example

Insert

//insertnewUser().setName("zzg.zhou").setStatus(1).save();
//parse data from type: Map, json/xml string, JsonObject(Gson), HttpServletRequest, JavaBeannewUser().parse("{'name':'oschina','status':0}").save();
newUser().parse("<data> <name>china01</name><status>1</status> </data>").save();
newUser().parse(request).save();
//Object fieldAddressaddress=newAddress("guangdong","shenzhen");
user.setAddress(address).save();
//File fieldStringdetail_save_path="path/001.txt";
Stringcontent="This is a big text.";
user.setDetail(path,content.getBytes()).save(); user.getDetailAsString();

Delete

//delete user by primary key or unique keyuser.delete();
//SQL: DELETE FROM `user` WHERE `name`='china01'User.WHERE().name.eq("china01").delete();
User.DELETE().deleteAll();
User.DELETE().truncate(); 

Update

//update by primary keyUseruser=User.SELECT().selectOne("name=?", "zzg.zhou");
user.setStatus(3).update();
//SQL: UPDATE user SET name='tsc9526' WHERE name like 'zzg%'	UserupdateTo=newUser().setName("tsc9526");
User.WHERE().name.like("zzg%").update(updateTo);

Select

//select by primary keyUser.SELECT().selectByPrimaryKey(1);
//SQL: SELECT * FROM `user` WHERE `name` = 'zzg.zhou'User.SELECT().selectOne("name=?", "zzg.zhou");
//SQL: SELECT `name`, `status` FROM `user`User.SELECT().include("name","status").select();
//SQL: SELECT * FROM `user` WHERE (`name` like 'zzg%' AND `status` >= 0) // OR (`name` = 'zzg' AND `status` > 1) ORDER BY `status` ASC for(Userx:User.WHERE()
.name.like("zzg%").status.ge(0)
.OR()
.name.eq("zzg").status.gt(1)
.status.asc()
.SELECT().select()){ //SELECT / delete / updateSystem.out.println(x);
}
//PagePage<User> page=User.WHERE()
.name.like("zzg%")
.status.in(1,2,3)
.SELECT().selectPage(10,0); 

Query

TestDB.DB.select("SELECT * FROM user WHERE name like ?","zzg%");
TestDB.DB.createQuery()
.add("SELECT * FROM user WHERE name like ?","zzg%")
.getList(User.class);

DataTable

Queryq=newQuery(TestDB.DB);
DataTable<DataMap> rs=q.add("SELECT * FROM user WHERE name like ?","zzg%")
.add(" AND status ").in(1,2,3)
.getList();
//Query inside DataTable//SQL: SELECT name, count(*) as cnt FROM _THIS_TABLE WHERE status>=0 GROUP BY name ORDER BY name ASCDataTable<DataMap> newTable=rs.select("name, count(*) as cnt","status>=0","name ASC","GROUP BY name");	

Transaction

//transactionTx.execute(newTx.Atom() {
publicintexecute() {
newUser().setName("name001").setStatus(1).save();
newUser().setName("name002").setStatus(2).save();
//... other database operationreturn0;
}
});

Record

//Dynamic model: RecordRecordr=newRecord("user").use(TestDB.DB);
r.set("name", "jjyy").set("status",1)
.save();
//SQL: SELECT * FROM `user` WHERE (`name` like 'jjyy%' AND `status` >= 0)// OR (`name` = 'zzg' AND `status` > 1) ORDER BY `status` ASC for(Recordx:r.WHERE()
.field("name").like("jjyy%").field("status").ge(0)
.OR()
.field("name").eq("zzg").field("status").gt(1)
.field("status").asc()
.SELECT().select()){
System.out.println(x);
} //SQL: DELETE FROM `user` WHERE `name` like 'jjyy%' AND `status` >= 0r.WHERE()
.field("name").like("jjyy%").field("status").ge(0)
.delete();

Sharding

publicclassShardingUserextendsUser{
//OverridepublicTabletable(){
StringtableName= "user_"+( getId()%10 );
returnModelMeta.createTable(tableName);
}
//OverridepublicDBConfigdb(){
returngetId()<10 ? TestDB.DB1 : TestDB.DB2;
}
}
ShardingUseruser1=newShardingUser(1);
user1.save(); //Will be saved to table: user_1, database: TestDB.DB1ShardingUseruser2=newShardingUser(15);
user2.save(); //Will be saved to table: user_5, database: TestDB.DB2

Multi-line strings

see Multiple-line-syntax

publicstaticvoidmain(String[] args) {
Stringname="zzg";
Stringlines = ""/**~!{ SELECT *  FROM user WHERE name="$name" }*/;
System.out.println(lines);
}

Output will be:

SELECT*FROM user
WHERE name="zzg"

Details

Maven:

	<dependency>
<groupId>com.tsc9526</groupId>
<artifactId>monalisa-orm</artifactId>
<version>2.1.0</version>
</dependency>

Change Log

  • 2.1.0 Add oracle dialect
  • 2.0.0 Only Mysql

TODO list

  • Other database's dialect
  • Automatic refresh the query cache in the background
  • ...

If you have any ideas or you want to help with the development just write me a message.

zzg zhou, 11039850@qq.com

About

Very Simple ORM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages