案例五:利用注解封装

重复步骤

  • 我们使用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(三):利用注解封装的更多相关文章

  1. Java使用Jdbc操作MySql数据库(一)

    这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...

  2. jdbc操作mysql

    本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...

  3. JDBC操作MySQL(crud)

    这两天复习了一下JDBC操作MySQL,把crud操作的例子记一下, 类库链接(mysql-connector-java-5.1.37-bin.jar):http://files.cnblogs.co ...

  4. JDBC操作MySQL数据库案例

    JDBC操作MySQL数据库案例 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  5. 原生Jdbc操作Mysql数据库开发步骤

    原生Jdbc操作Mysql数据库开发步骤 原生的Jdbc就是指,不使用任何框架,仅用java.sql包下的方法实现数据库查询等的操作. 下面是开发步骤:        1.导入数据库驱动包       ...

  6. [自动化专题]JDBC操作mysql时遇到的拦路虎

    在挫折中成长,在错误中学习.聊聊我们在Selenium自动化中使用JDBC操作mysql数据库中遇到的那些拦路虎: 错误一:Can not issue data manipulation statem ...

  7. java数据库 JDBC操作MySQL数据库常用API 部门表和员工表 创建表 添加数据 查询数据

    package com.swift.department; import java.sql.Connection; import java.sql.PreparedStatement; import ...

  8. 使用JDBC操作MySQL

    使用JDBC操作MySQL 步骤 加载驱动 连接数据库 操作数据库(增删改查) 关闭结果集,操作,数据库 准备工作 java连接MySQL的jar包 加载数据库驱动 public class Load ...

  9. jdbc操作mysql(四):利用反射封装

    前言 有了前面利用注解拼接sql语句,下面来看一下利用反射获取类的属性和方法 不过好像有一个问题,数据库中的表名和字段中带有下划线该如何解决呢 实践操作 工具类:获取connection对象 publ ...

随机推荐

  1. mybatis-4-Mapper映射文件

    Mapper映射文件 映射文件的Mapper标签包含标签 1.CDUS增删改查 2.参数处理 (1)直接传入参数 单个参数 //传入当个参数 public Employee getEmployeeBy ...

  2. 42 张图带你撸完 MySQL 优化

    Hey guys,这里是程序员cxuan,欢迎你阅读我最新一期的文章,这篇文章是 MySQL 调优的汇总版,我加了一下日常开发过程中的调优经验,希望对各位小伙伴们有所帮助.下面开始正文. 一般传统互联 ...

  3. Python中调用Java程序包

    <原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html> 开发Python程序,需求中需要用到Java代 ...

  4. CMS垃圾收集器——重新标记和浮动垃圾的思考

    <深入理解java虚拟机 第二版 JVM高级特性与最佳实践>里面提到 CMS 垃圾收集器. CMS 垃圾收集器的垃圾回收分4个步骤: 初始标记(initial mark) 有 STW 并发 ...

  5. Go通关03:控制结构,if、for、switch逻辑语句

    if 条件语句 func main() { i:=6 if i >10 { fmt.Println("i>10") } else if i>5 && ...

  6. Go语言基础知识总结(持续中)

    Go基础知识总结 变量声明 Go语言中的变量需要声明以后才可以使用(需要提前定义变量)并且声明后必须使用(不适用会报错) 标准声明 var 变量名 变量类型 example: var name str ...

  7. SAS启动时自动执行代码

    有时候我们希望SAS启动时自动执行已经编写好的程序,可以按照以下方法实现: 首先正常打开SAS,编写我们想要让SAS启动时自动执行的代码,例如获取桌面文件夹路径,以便在其他程序中引用这个路径. pro ...

  8. Gitea 1.4.0 目录穿越导致命令执行漏洞

    复现 POST /vulhub/repo.git/info/lfs/objects HTTP/1.1 Host: 192.168.49.2:3000 Accept-Encoding: gzip, de ...

  9. 抽奖动画 - lao虎机抽奖

    本文介绍一个lao虎机抽奖动画的实现,lao虎机抽奖在各类商家营销活动中非常常见,这里主要介绍动画的实现过程,其他细节不做详细分析. ps:lao虎机是敏感词,博客园不允许出现,所有老用拼音. 1. ...

  10. CF559B Equivalent Strings TJ

    前言 题目传送门 正解:模拟,递归. 考试的 T4,还是想复杂了 qwq. 这题不要用 STL,容易 \(\texttt{TLE}\)!! 题意简述 翻译够简了. 对了给一下样例解释的翻译: 第一个样 ...