记录一下orm框架的简单实现

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);
    }
}

添加结果:

猜你喜欢

转载自blog.csdn.net/luo_yu_1106/article/details/92593411