可以参考有一下这个博客:
https://blog.csdn.net/liyazhou0215/article/details/77431561
sql:
CREATE TABLE `student` (
`student_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`age` int(11) DEFAULT NULL,
`birthday` date DEFAULT NULL,
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
代码:
注解包:
Table
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Description 这个Table注解只可以使用在类上,它有一个方法,用来获得和类名对应的表的名称
* @date 2019年6月13日 上午11:00:59
*/
@Target(ElementType.TYPE)//元素类型, 用在类, 接口 (包括注释类型), 或 枚举 声明
@Retention(RetentionPolicy.RUNTIME)//保留策略
@Documented//文档化
public @interface Table {
String name();
}
Id
/**
* @Description @Id注解包括四个方法,通过它们可以获得表中id的名称,id 的类型,以及id字段的长度,如果是id类型是int型的整数,可以获得自动增长量。
* @date 2019年6月13日 上午11:09:27
*/
@Target(ElementType.FIELD) // 用在字段上
@Retention(RetentionPolicy.RUNTIME) // 注释将被编译器记录在类文件中,在运行时保留VM,因此可以反读。
@Documented // 表明这个注释是由 javadoc记录的
public @interface Id {
String name();
String type() default "int";
int length() default 20;
int increment() default 1;
}
Column
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Description @Column只包含有获得表的名称、类型和长度的三个方法。
* @date 2019年6月13日 上午11:13:15
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
String name();
String type() default "string";
int length() default 20;
}
model包
/**
* @Description
* @date 2019年6月13日 上午10:56:00
*/
@Setter
@Getter
@ToString
@Table(name="student")
public class Student {
@Id(name="student_id")
private Integer studentNo;
@Column(name="name")
private String name;
@Column(name="age",type="int")
private Integer age;
@Column(name="birthday",type="date")
private Date birthday;
public Student() {
super();
}
protected Student(Integer studentNo, String name, Integer age) {
super();
this.studentNo = studentNo;
this.name = name;
this.age = age;
}
}
Utils包
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @Description
* @date 2019年6月13日 上午11:37:53
*/
public class JdbcUtils {
public static Connection getConn() {
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql:///test01?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC", "root", "123456");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
public static int excuteUpdate(String sql, Object[] params) {
Connection connection = null;
PreparedStatement prepareStatement = null;
int result = -1;
try {
connection = getConn();
prepareStatement = connection.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
prepareStatement.setObject(i + 1, params[i]);
}
result = prepareStatement.executeUpdate();
} catch (SQLException e) {
System.out.println("更新数据出现异常");
e.printStackTrace();
} finally {
release(prepareStatement, connection);
}
return result;
}
public static void release(Statement stmt, Connection conn) {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt=null;
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
}
}
import java.lang.reflect.Field;
import java.util.Arrays;
import com.lvmama.test.annontation.Table;
/**
* @Description
* @param <E>
* @date 2019年6月13日 下午1:55:48
*/
public class SimpleDbPipe<E> {
/**
* @Description 添加对象
* @param element
* @return 添加成功返回1,否则返回0
*/
public int add(E element) {
if (element == null)
throw new IllegalArgumentException("插入的元素为空");
Class<? extends Object> clazz = element.getClass();
String tableName = getTableName(clazz);
Field[] fields = clazz.getDeclaredFields();
if (fields == null || fields.length == 0)
throw new RuntimeException(element + "没有属性");
// TODO 去除属性为null的占位符,下一版本优化
String insertSql = getInsertSql(tableName, fields.length);
Object[] sqlParams = getSqlParams(element, fields);
System.out.println("insertSql ="+insertSql);
System.out.println(Arrays.toString(sqlParams));
return JdbcUtils.excuteUpdate(insertSql, sqlParams);
}
private Object[] getSqlParams(E element, Field[] fields) {
Object[] params = new Object[fields.length];
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
try {
params[i] = fields[i].get(element);
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println("获取" + element + "的属性值失败!");
}
}
return params;
}
/**
* @Description 根据值对象的注解获取其对应的表名称
* @param clazz
* @return 表名称
*/
private String getTableName(Class<? extends Object> clazz) {
boolean existTableAnno = clazz.isAnnotationPresent(Table.class);
if (!existTableAnno)
throw new RuntimeException(clazz + "没有Table注解");
Table tableAnno = clazz.getAnnotation(Table.class);
return tableAnno.name();
}
/**
* @Description 插入对象的sql语句
* @param tableName
* 表名称
* @param length
* 字段长度(几个字段)
* @return 插入记录的sql语句
*/
private String getInsertSql(String tableName, int length) {
StringBuilder sql = new StringBuilder();
sql.append("insert into ").append(tableName).append(" values(");
for (int i = 0; i < length; i++) {
sql.append("?,");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
return sql.toString();
}
}
测试类
public class App
{
public static void main( String[] args )
{
Student s=new Student();
s.setAge(12);
s.setBirthday(new Date());
s.setName("小明");
SimpleDbPipe<Student> ss=new SimpleDbPipe<Student>();
int add = ss.add(s);
}
}
添加结果: