ByxOrm——模仿MyBatis的轻量级ORM框架
ccwgpt 2024-10-16 08:01 28 浏览 0 评论
ByxOrm是一个模仿MyBatis设计的轻量级ORM框架,支持以下特性:
- 使用动态代理生成Dao接口的实现类
- 使用注解配置Dao方法对应的SQL语句
- 使用注解配置实体类字段与数据库列名的对应关系
- 动态查询和动态更新
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编译选项
由于ByxOrm运行过程中需要读取方法参数名,所以需要在pom.xml中启用-parameters编译选项:
<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>
快速入门
通过一个简单的例子来快速了解ByxOrm的特性。
首先在数据库中创建一个user表,并插入如下数据:
u_id | u_username | u_password |
1 | aaa | 123 |
2 | bbb | 456 |
3 | ccc | 789 |
导入数据库驱动类和连接池依赖,在启动类中写一个方法用来返回DataSource:
public class Main {
private static DataSource dataSource() {
// 返回一个DataSource ...
}
public static void main(String[] args) {
// ...
}
}
编写用户实体类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 ...
}
编写数据访问接口UserDao,并配置每个方法的SQL语句:
public interface UserDao {
/**
* 查询所有用户,返回列表
*/
@Query("SELECT * FROM user")
List<User> listAll();
/**
* 查询指定id的用户,返回单个对象
*/
@Query("SELECT * FROM user WHERE u_id = #{id}")
User getById(Integer id);
/**
* 多条件查询用户,动态构造SQL语句
*/
@DynamicQuery(type = SqlProvider.class, method = "query")
List<User> query(String username, String password);
/**
* 查询用户总数
*/
@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的用户,返回影响行数
*/
@Update("DELETE FROM user WHERE u_id = #{id}")
int delete(Integer id);
class SqlProvider {
/**
* 提供动态查询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函数中依次测试UserDao中的各个方法:
public static void main(String[] args) {
// 生成UserDao的实现类
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("查询用户总数:");
System.out.println(userDao.count());
System.out.println("删除id为1的用户:");
int row = userDao.delete(1);
System.out.println("影响行数:" + row);
System.out.println("查询所有用户列表:");
users = userDao.listAll();
for (User u : users) {
System.out.println(u);
}
}
控制台输出如下:
查询所有用户列表:
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')
查询用户总数:
sql: SELECT COUNT(0) FROM user
4
删除id为1的用户:
sql: DELETE FROM user WHERE u_id = 1
影响行数: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标注的方法的返回值可以为以下形式:
返回值类型 | 说明 |
基本类型或String | 查询单个值或结果总数 |
JavaBean | 查询单行,并把该行数据转换成JavaBean |
List | 查询多行,每行封装成一个JavaBean |
例子:
public interface UserDao {
// 查询所有用户
@Query("SELECT * FROM user")
List<User> listAll();
// 根据id查询用户
@Query("SELECT * FROM user WHERE id = #{id}")
User getById(Integer id);
// 查询用户总数
@Query("SELECT COUNT(0) FROM user")
int count();
}
@Update注解
该注解用于指定更新操作的SQL,更新操作包括insert、update、delete,与MyBatis的Update、Insert、Delete类似,支持#{...}占位符。
使用@Update标注的方法的返回值可以为以下形式:
返回值类型 | 说明 |
int | 返回受影响行数 |
void | 直接执行操作,什么也不返回 |
例子:
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注解
该注解用于动态生成查询SQL字符串,与MyBatis中的SelectProvider类似,需要指定以下两个属性:
- type: 生成SQL字符串的类
- method: 生成SQL字符串的方法名
type中的method方法需要接收与对应的Dao方法相同的参数列表,并返回String类型。
例子:
public interface UserDao {
// 根据用户名或密码查询用户
@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指定的类必须要有默认构造函数
- 如果DynamicQuery不指定method,则默认使用被标注方法的方法名
- 可以使用SqlBuilder来拼接SQL字符串,用法与MyBatis的SQL类似
最主要的是给自己增加知识的储备,有备无患。最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(666)领取,祝大家更上一层楼!!!
相关推荐
- css布局方案汇总(28个实例图文并茂)
-
简介布局在我们前端日常开发来说是非常重要的,一个好的布局能简化代码的同时还能提高网页的性能。常见的布局方法有浮动(float)布局、绝对定位(position)布局、表格布局(table)、弹性(fl...
- 十款免费的CSS框架加速Web开发
-
Pure这是Yahoo最新推出的一款CSS框架,它只有HTML和CSS,没有使用任何JavaScript语言。总大小只有4.4kb,但功能却非常丰富,支持响应式样式和各种导航、表格、表单、按钮、网格和...
- Tailwind CSS 是不是目前世上最好的CSS框架?
-
转载说明:原创不易,未经授权,谢绝任何形式的转载今天看了一篇国外大佬对TailwindCSS的看法,在这里分享给大家,看看大家是否赞同,以下是其相关内容的整理,由于翻译水平有限,欢迎大家讨论和指...
- 下一代 CSS 框架:Mojo CSS,为何如此受欢迎?
-
TailwindCSS推出即受到广大开发者的欢迎,当前Githubstar数已达77.8k。它是一个功能类优先(utility-first)的CSS框架,它提供了一系列功能类,让开发者...
- 常见的几种摄影构图方式
-
摄影构图,是一种在摄影画面中表现结构美、形式美的方式。构图能让摄影主体更加突出,画面更加有序。所以说,构图在摄影中是非常重要的一个环节。无论是前期构图还是后期构图,摄影者都要对构图有一个比较深的了解。...
- 风光摄影10大构图技巧,会用构图,照片更容易好看
-
风光摄影10大构图技巧,会用构图,照片更容易好看先解释一下,为什么会使用构图之后,照片更容易好看?因为,构图是根据很多好看的照片,总结出来的技巧,使用这些构图技巧,就相当于站在了巨人的肩膀上,也就是用...
- 掌握框式构图的摄影技巧,会让摄影爱好者的作品更有魅力!
-
很多摄影爱好者都知道摄影构图中有个框式构图,但大多数人对框式构图的摄影技巧,却一知半解。所以摄影爱好者们有必要更全面、深入的了解,并掌握框式构图,会对你摄影水平的提高更有帮助。【欢迎点击上方关注:金立...
- 这个构图很简洁,但为什么不耐看?
-
摄影爱好者最常犯的错就是过于复杂、主体不明确,但当遇到简单的场景往往又会出现单调、不耐看的状况。为什么会这样?说白了还是观察力不够。下面是本周的摄影入围习作,我们一起来看看这些照片中主体、陪体以及背景...
- 初学者需要记牢的八种常用构图法
-
作者:冯海军摄影中,构图很关键,决定照片是否成功,所以在构图上要加以重视和推敲,虽然说构图无定法,但是也有很多的规律可循,以下列举几种常用构图,会对初学者有很大的帮助。多彩刘卫洲摄苏州姑苏俱乐部(...
- 构图这件事不难!掌握14种构图模式就稳了
-
如果说视觉元素是视觉信息的载体,那么构图就是视觉元素的载体。没有适当形式的构图对视觉元素有机、有序地承载,平面设计将无法传达预定的设计意图和视觉信息。因此,对于平面设计而言,构图是平面设计不可或缺的重...
- 框架构图如何使用?
-
1分钟教你用手机拍大片。今天我们利用框架构图,在不同的运镜方法下拍摄。·首先将手机贴近地面,拍摄人物走过的画面。·然后利用3D效果的背景衬托,将手机贴近地面,以低角度仰拍人物。·最后我们用高清画质来呈...
- 面构图的5种超实用的构图形式 前景构图,框架构图,填充构图
-
面构图的5种超实用的构图形式。为什么有的人拍摄的照片好看又舒适?仔细观察会发现他们善用构图。大家好,今天带大家了解摄影中5种超实用的面构图形式。·一、前景构图。前景是构图中的神奇要素,可以提升照片的表...
- 一看就懂!跟着马格南的大师学构图
-
马格南图片社是迄今为止全球最重要的摄影图片社,其网站包涵了太多经典的名字和照片。细细品味这些经典图片,能够学到很多有用的构图手法。跟着大师走,总不会错吧?前后景的运用这似乎是非常常见的一种手法,仔细看...
- 这才是框架构图,有想法!能给你启发么?
-
框架构图大家并不陌生,但并不是有一个框就行了。框架构图用得不好,就很死板生硬,给人感觉很假。如果你理解透了,拍出的作品不会单调。今天就给大家分享一下框架构图,你看看有哪些妙用?1.广角与长焦的应用长焦...
- 7B小模型写好学术论文,新框架告别AI引用幻觉
-
ScholarCopilot团队投稿量子位|公众号QbitAI学术写作通常需要花费大量精力查询文献引用,而以ChatGPT、GPT-4等为代表的通用大语言模型(LLM)虽然能够生成流畅文本,但...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 若依框架 (41)
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- scrapy框架 (52)
- beego框架 (42)
- java框架spring (43)
- grpc框架 (55)
- 前端框架bootstrap (42)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle v (42)
- oracle字符串长度 (48)
- oracle提交事务 (47)