jdbc操作mysql(三):利用注解封装
案例五:利用注解封装
重复步骤
- 我们使用jdbc操作mysql时发现,操作不同表中数据,所写的方法基本相同;比如我们根据id向用户表添加数据,根据id删除商品表的数据,或者查询所有数据并用list集合接收
int add(int id);
int del(int id);
List<Blog> getAll();
List<User> getAll();
解决思路
- 我们发现实现这些方法的sql语句基本上是相同的,操作不同表中的数据时,需要的表名和字段不同;那么我们是否可以将共有的sql语句提取出来,获取表名和字段后,动态拼接sql语句
- 所要解决的问题是:获取将要操作的表的表名和字段,这里我们通过自定义注解获取
- 思路:通过自定义注解保存实体类对应的表的信息,获取表的表名和字段,最后拼接sql语句
实践操作
自定义注解
- 注解到类头,用于设置表对应的实体类的默认值
@Target(ElementType.TYPE) // 表示注解用于什么地方
@Retention(RetentionPolicy.RUNTIME) // 表示需要在什么级别保存注解信息
public @interface Table {
// 自定义注解元素的写法:基本数据类型|String|枚举 方法名() [default] 默认值;
public String name() default "";
}
- 注解到属性上,用来设置字段对应的属性的默认值
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cloumn {
// 默认值为空
public String value() default "";
}
编写实体类
/**
* 使用自定义注解,设置默认值
*/
@Table(name = "t_user")
public class User {
private Integer id;
private Integer age;
@Cloumn(value = "user_name")
private String userName;
private String sex;
private Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User [id=" + id + ", age=" + age + ", userName=" + userName + ", sex=" + sex + ", birthday=" + birthday
+ "]";
}
}
封装工具类
public class AnnotationUtil {
/**
* 获取实体类映射的表名
*/
public static String getTable(Class<?> clazz) {
Table table = clazz.getAnnotation(Table.class); // 通过getAnnotation获取@table的注释内容
if(table != null) {
String name = table.name();
if(name != null && name.trim().length() > 0) {
return name;
}
}
// 如果实体类上没有@Table,则默认tablename = className,getSimpleName方法返回实体类的类名
return clazz.getSimpleName();
}
/**
* 获取实体类映射的字段
*/
public static List<String> getFields(Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields(); // 利用反射获得某个类的所有声明的字段
List<String> list = new ArrayList<String>(); // 将数组中的值遍历进list集合
for(Field field : fields) {
// 获取@Cloumn的注解内容
Cloumn cloumn = field.getAnnotation(Cloumn.class);
//使用了@Cloumn注解,则向list集合添加注解内容value,没有使用注解,则向list集合添加字段
if(cloumn != null) {
String value = cloumn.value();
if(value != null && value.trim().length() > 0) {
list.add(value);
}
} else {
list.add(field.getName());
}
}
return list;
}
}
拼接sql语句
/**
* 例如操作t_user表中的数据:select id, age, user_name, sex, birthday from t_user;
*/
public String getAll(Class<?> clazz) {
SQL sql = new SQL(); // new一个对象存放sql语句
List<String> fields = AnnotationUtil.getFields(clazz); // 获取字段
StringBuilder sb = new StringBuilder();
fields.forEach(f -> sb.append(f + ",")); // 拼接上逗号
String str = sb.substring(0, sb.length()-1);
sql.SELECT(str);
sql.FROM(AnnotationUtil.getTable(clazz)); // select 字段 from 表名
System.out.println("sql:" + sql.toString());
return sql.toString();
}
jdbc操作mysql(三):利用注解封装的更多相关文章
- Java使用Jdbc操作MySql数据库(一)
这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...
- jdbc操作mysql
本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...
- JDBC操作MySQL(crud)
这两天复习了一下JDBC操作MySQL,把crud操作的例子记一下, 类库链接(mysql-connector-java-5.1.37-bin.jar):http://files.cnblogs.co ...
- JDBC操作MySQL数据库案例
JDBC操作MySQL数据库案例 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...
- 原生Jdbc操作Mysql数据库开发步骤
原生Jdbc操作Mysql数据库开发步骤 原生的Jdbc就是指,不使用任何框架,仅用java.sql包下的方法实现数据库查询等的操作. 下面是开发步骤: 1.导入数据库驱动包 ...
- [自动化专题]JDBC操作mysql时遇到的拦路虎
在挫折中成长,在错误中学习.聊聊我们在Selenium自动化中使用JDBC操作mysql数据库中遇到的那些拦路虎: 错误一:Can not issue data manipulation statem ...
- java数据库 JDBC操作MySQL数据库常用API 部门表和员工表 创建表 添加数据 查询数据
package com.swift.department; import java.sql.Connection; import java.sql.PreparedStatement; import ...
- 使用JDBC操作MySQL
使用JDBC操作MySQL 步骤 加载驱动 连接数据库 操作数据库(增删改查) 关闭结果集,操作,数据库 准备工作 java连接MySQL的jar包 加载数据库驱动 public class Load ...
- jdbc操作mysql(四):利用反射封装
前言 有了前面利用注解拼接sql语句,下面来看一下利用反射获取类的属性和方法 不过好像有一个问题,数据库中的表名和字段中带有下划线该如何解决呢 实践操作 工具类:获取connection对象 publ ...
随机推荐
- element UI+vue关于日期范围选择的操作,picker-options属性的使用
一般 <el-date-picker />使用会出现起始日期和结束日期,结束日期不能早与起始日期,选择了其实日期后,结束日期大于起始日期的不可选,置灰,同理先选结束日期后再选起始日期,那么 ...
- Web实时更新客户端数据
1 轮询方式实现客户端数据及时更新 在基于Web的即时通信.股票行情这样的系统中,需要客户端能够及时更新内容.由于B/S架构的特性(Http连接是无状态连接, 即服务器处理完客户的请求, ...
- vue使用GraphVis开发无限拓展的关系图谱
1.去GraphVis官网下载对应的js,新版和旧版的js有所不同,看自己需求引入旧版还是新版(GraphVis官方网址:http://www.graphvis.cn/) visgraph.min.j ...
- mongo-express 远程代码执行漏洞(CVE-2019-10758)
影响版本 mongo-express 0.53.0 POST /checkValid HTTP/1.1 Host: 192.168.49.2:8081 Accept-Encoding: gzip, d ...
- Java面向对象10——方法重写
方法重写 static : package oop.demon01.demon05; public class Application { public static void ...
- 化学专业大二转战Android开发,终于拥有了鹅厂暑期实习offer
我是双非学校,应用化学专业,一年前我大二,现在我大三.一年前我两手空空,现在我拥有了鹅厂暑期实习的offer. 虽然结果是好的,但我春招实习的道路远没有这么简单和辉煌,它是无比坎坷的:每个人应该量力而 ...
- CircuitBreaker断路器Fallback如何获取异常
在Spring Cloud 2020新版里, 可以使用新版的 CircuitBreaker 断路器, 可以配置Fallback, 可以是内部的, 也可以是外部的Fallback. 内部 Fallbac ...
- Subversion Backup and Restore
Backup Specified Revision Backup specified revision (here is 20): $ cd /opt/svnRepo $ svnadmin dump ...
- WPF 线程开启等待动画
public static Dictionary<string, object> Dic = new Dictionary<string, object>();//定义一个字典 ...
- 如何删除windows10右键新建中不需要的选项
参考博客https://blog.csdn.net/Kinglen_R/article/details/102983259 首先打开注册表程序,可以点击开始按钮后直接输入regedit点击进入 (或者 ...