ByxOrm是一個(gè)模仿MyBatis設(shè)計(jì)的輕量級(jí)ORM框架托修,支持以下特性:
- 使用動(dòng)態(tài)代理生成Dao接口的實(shí)現(xiàn)類
- 使用注解配置Dao方法對(duì)應(yīng)的SQL語句
- 使用注解配置實(shí)體類字段與數(shù)據(jù)庫列名的對(duì)應(yīng)關(guān)系
- 動(dòng)態(tài)查詢和動(dòng)態(tài)更新
項(xiàng)目地址:https://github.com/byx2000/byx-orm
Maven引入
<repositories>
<repository>
<id>byx-maven-repo</id>
<name>byx-maven-repo</name>
<url>https://gitee.com/byx2000/maven-repo/raw/master/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>byx.orm</groupId>
<artifactId>byx-orm</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
開啟-parameters
編譯選項(xiàng)
由于ByxOrm運(yùn)行過程中需要讀取方法參數(shù)名,所以需要在pom.xml
中啟用-parameters
編譯選項(xiàng):
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerVersion>${java.version}</compilerVersion>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
快速入門
通過一個(gè)簡(jiǎn)單的例子來快速了解ByxOrm的特性增炭。
首先在數(shù)據(jù)庫中創(chuàng)建一個(gè)user
表烟阐,并插入如下數(shù)據(jù):
u_id | u_username | u_password |
---|---|---|
1 | aaa | 123 |
2 | bbb | 456 |
3 | ccc | 789 |
導(dǎo)入數(shù)據(jù)庫驅(qū)動(dòng)類和連接池依賴搬俊,在啟動(dòng)類中寫一個(gè)方法用來返回DataSource
:
public class Main {
private static DataSource dataSource() {
// 返回一個(gè)DataSource ...
}
public static void main(String[] args) {
// ...
}
}
編寫用戶實(shí)體類User
紊扬,并配置字段名與列名的映射:
public class User {
@Column("u_id")
private Integer id;
@Column("u_username")
private String username;
@Column("u_password")
private String password;
// 省略getters、setters和toString ...
}
編寫數(shù)據(jù)訪問接口UserDao
唉擂,并配置每個(gè)方法的SQL語句:
public interface UserDao {
/**
* 查詢所有用戶餐屎,返回列表
*/
@Query("SELECT * FROM user")
List<User> listAll();
/**
* 查詢指定id的用戶,返回單個(gè)對(duì)象
*/
@Query("SELECT * FROM user WHERE u_id = #{id}")
User getById(Integer id);
/**
* 多條件查詢用戶玩祟,動(dòng)態(tài)構(gòu)造SQL語句
*/
@DynamicQuery(type = SqlProvider.class, method = "query")
List<User> query(String username, String password);
/**
* 查詢用戶總數(shù)
*/
@Query("SELECT COUNT(0) FROM user")
int count();
/**
* 插入用戶腹缩,無返回值
*/
@Update("INSERT into user(u_username, u_password) " +
"VALUES(#{user.username}, #{user.password})")
void insert(User user);
/**
* 刪除指定id的用戶,返回影響行數(shù)
*/
@Update("DELETE FROM user WHERE u_id = #{id}")
int delete(Integer id);
class SqlProvider {
/**
* 提供動(dòng)態(tài)查詢SQL
*/
public String query(String username, String password) {
return new SqlBuilder(){
{
select("*");
from("user");
if (username != null) {
where("u_username = #{username}");
}
if (password != null) {
where("u_password = #{password}");
}
}
}.build();
}
}
}
在main
函數(shù)中依次測(cè)試UserDao
中的各個(gè)方法:
public static void main(String[] args) {
// 生成UserDao的實(shí)現(xiàn)類
UserDao userDao = new DaoGenerator(dataSource()).generate(UserDao.class);
System.out.println("查詢所有用戶列表:");
List<User> users = userDao.listAll();
for (User u : users) {
System.out.println(u);
}
System.out.println("查詢id為2的用戶:");
User user = userDao.getById(2);
System.out.println(user);
System.out.println("查詢用戶名為ccc的用戶:");
users = userDao.query("ccc", null);
for (User u : users) {
System.out.println(u);
}
System.out.println("插入用戶:");
user.setUsername("byx");
user.setPassword("666");
userDao.insert(user);
System.out.println("查詢用戶總數(shù):");
System.out.println(userDao.count());
System.out.println("刪除id為1的用戶:");
int row = userDao.delete(1);
System.out.println("影響行數(shù):" + row);
System.out.println("查詢所有用戶列表:");
users = userDao.listAll();
for (User u : users) {
System.out.println(u);
}
}
控制臺(tái)輸出如下:
查詢所有用戶列表:
sql: SELECT * FROM user
User{id=1, username='aaa', password='123'}
User{id=2, username='bbb', password='456'}
User{id=3, username='ccc', password='789'}
查詢id為2的用戶:
sql: SELECT * FROM user WHERE u_id = 2
User{id=2, username='bbb', password='456'}
查詢用戶名為ccc的用戶:
sql: SELECT * FROM user WHERE u_username = 'ccc'
User{id=3, username='ccc', password='789'}
插入用戶:
sql: INSERT into user(u_username, u_password) VALUES('byx', '666')
查詢用戶總數(shù):
sql: SELECT COUNT(0) FROM user
4
刪除id為1的用戶:
sql: DELETE FROM user WHERE u_id = 1
影響行數(shù):1
查詢所有用戶列表:
sql: SELECT * FROM user
User{id=2, username='bbb', password='456'}
User{id=3, username='ccc', password='789'}
User{id=4, username='byx', password='666'}
@Query注解
該注解用于指定查詢操作的SQL空扎,與MyBatis的@Select
類似藏鹊,支持#{...}
占位符。
使用@Query
標(biāo)注的方法的返回值可以為以下形式:
返回值類型 | 說明 |
---|---|
基本類型或String
|
查詢單個(gè)值或結(jié)果總數(shù) |
JavaBean | 查詢單行转锈,并把該行數(shù)據(jù)轉(zhuǎn)換成JavaBean |
List |
查詢多行盘寡,每行封裝成一個(gè)JavaBean |
例子:
public interface UserDao {
// 查詢所有用戶
@Query("SELECT * FROM user")
List<User> listAll();
// 根據(jù)id查詢用戶
@Query("SELECT * FROM user WHERE id = #{id}")
User getById(Integer id);
// 查詢用戶總數(shù)
@Query("SELECT COUNT(0) FROM user")
int count();
}
@Update注解
該注解用于指定更新操作的SQL,更新操作包括insert
撮慨、update
宴抚、delete
,與MyBatis的Update
甫煞、Insert
菇曲、Delete
類似,支持#{...}
占位符抚吠。
使用@Update
標(biāo)注的方法的返回值可以為以下形式:
返回值類型 | 說明 |
---|---|
int |
返回受影響行數(shù) |
void |
直接執(zhí)行操作常潮,什么也不返回 |
例子:
public interface UserDao {
// 插入用戶
@Update("INSERT INTO user(username, password) VALUES(#{user.username}, #{user.password})")
int insert(User user);
// 刪除用戶
@Update("DELETE FROM user WHERE id = #{id}")
void delete(Integer id);
// 更新用戶名
@Update("UPDATE user SET username = #{username} WHERE id = #{id}")
void update(Integer id, String username);
}
@DynamicQuery注解
該注解用于動(dòng)態(tài)生成查詢SQL字符串,與MyBatis中的SelectProvider
類似楷力,需要指定以下兩個(gè)屬性:
-
type
: 生成SQL字符串的類 -
method
: 生成SQL字符串的方法名
type
中的method
方法需要接收與對(duì)應(yīng)的Dao方法相同的參數(shù)列表喊式,并返回String
類型。
例子:
public interface UserDao {
// 根據(jù)用戶名或密碼查詢用戶
@DynamicQuery(type = SqlProvider.class, method = "query")
List<User> query(String username, String password);
class SqlProvider {
public String query(String username, String password) {
return new SqlBuilder(){
{
select("*");
from("user");
if (username != null) {
where("u_username = #{username}");
}
if (password != null) {
where("u_password = #{password}");
}
}
}.build();
}
}
}
注:
-
DynamicQuery
的type
指定的類必須要有默認(rèn)構(gòu)造函數(shù) - 如果
DynamicQuery
不指定method
萧朝,則默認(rèn)使用被標(biāo)注方法的方法名 - 可以使用
SqlBuilder
來拼接SQL字符串岔留,用法與MyBatis的SQL
類似