自定义对象转换接口实现JDBC的封装

自定义对象转换接口实现JDBC的封装

项目名:StudentManager7

com.bennett.model;

package com.bennett.model;
import java.util.Date;
/**
 * @Version:1.0 
 * @Description:SM-7
 * 				对象关系映射(ORM)
 * @Author: bennett
 * @Date: 2021年10月22日 下午2:17:32
 */
public class Student {
	private int id;
	private String name;
	private Date birthday;
	public Student() {
	}
	public Student(int id, String name, Date birthday) {
		super();
		this.id = id;
		this.name = name;
		this.birthday = birthday;
	}
	@Override
	public String toString() {
		return "id=" + id + " name=" + name + " birthday=" + birthday;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (id != other.id)
			return false;
		return true;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}

com.bennett.dao

package com.bennett.dao;
import java.util.List;
import com.bennett.model.Student;
/**
 * @Version:1.0 
 * @Description:SM-7
 * 				对象关系映射(ORM)
 * @Author: bennett
 * @Date: 2021年10月22日 下午2:17:32
 */
public interface StudentDao {
	boolean add(Student student);
	boolean delete(int id);
	boolean update(Student student);
	Student get(int id);
	List<Student> getAll();
}

package com.bennett.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import com.bennett.model.Student;
import com.bennett.util.JdbcUtil;
import com.bennett.util.RowMapper;

/**
 * @Version:1.0 
 * @Description:SM-7
 * 				对象关系映射(ORM)
 * @Author: bennett
 * @Date: 2021年10月22日 下午2:17:32
 */
public class StudentImplJdbc implements StudentDao,RowMapper<Student> {
	private JdbcUtil<Student> jdbcUtil =new JdbcUtil<>();
	
	@Override
	public boolean add(Student student) {
		String sql="insert into student"
				+ " (id, name, birthday)"
				+ " values"
				+ " (?,?,?)";
		return jdbcUtil.executeUpdate(sql,
				student.getId(), 
				student.getName(),
				student.getBirthday()
		)==1;		
	}

	@Override
	public boolean delete(int id) {
		String sql="delete student"
				+ " where id = ?";
		return jdbcUtil.executeUpdate(sql,id)==1;		
	}

	@Override
	public boolean update(Student student) {
		String sql="update student"
				+ " set name = ?,"
				+ " birthday = ?"
				+ " where id = ?";
		return jdbcUtil.executeUpdate(sql,
				student.getName(),
				student.getBirthday(),
				student.getId()
		)==1;		
	}

//	@Override
//	public Student get(int id) {
//		String sql="select id, name, bitthday from student"
//				+ " where id = ?";
//		return jdbcUtil.findOne(sql, this, id);
		return jdbcUtil.findOne(sql, new RowMapper<Student>() {
			
			@Override
			public Student row2Object(ResultSet rs) {
				try {
					return new Student(
							rs.getInt("id"),
							rs.getString("name"),
							rs.getDate("bitthday")
							);
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return null;
			}
		}, id);
//	}

	@Override
	public List<Student> getAll() {
		String sql="select id, name, birthday from student"
				+ " order by id";
		return jdbcUtil.findList(sql, this);
//		return jdbcUtil.findList(sql, (rs)->{
//			try {
//				return new Student(
//						rs.getInt("id"),
//						rs.getString("name"),
//						rs.getDate("bitthday")
//						);
//			} catch (SQLException e) {
//				e.printStackTrace();
//			}
//			return null;
//		});
	}

	@Override
	public Student row2Object(ResultSet rs) {
		try {
			return new Student(
					rs.getInt("id"),
					rs.getString("name"),
					rs.getDate("birthday")
			);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public Student get(int id) {
		String sql="select id, name, birthday from student"
				+ " where id = ?";
		return jdbcUtil.findOne(sql, Student.class, id);
	}
}
//class StudentRowMaper implements RowMapper<Student>{
//
//	@Override
//	public Student row2Object(ResultSet rs) {
//		try {
//			return new Student(
//					rs.getInt("id"),
//					rs.getString("name"),
//					rs.getDate("bitthday")
//			);
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		return null;
//	}
//	
//}

com.bennett.util

package com.bennett.util;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
/**
 * @Version:1.0 
 * @Description:SM-7
 * 				对象关系映射(ORM)
 * @Author: bennett
 * @Date: 2021年10月22日 下午2:17:32
 */
public class JdbcUtil<T> {
	private static Connection connection;
	static {
		try {
			String diverClassName="oracle.jdbc.driver.OracleDriver";
			Class.forName(diverClassName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	private Connection getConnection()  {
		try {
			if(connection==null || connection.isClosed()) {
				String url="jdbc:oracle:thin:@localhost:1521:xe";
				Properties info=new Properties();
				info.load(new FileReader("db.properties"));
				connection=DriverManager.getConnection(url, info);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return connection;
	}
	
	public int executeUpdate(String sql,Object...params){
		try {
			PreparedStatement statement = getConnection().prepareStatement(sql);
			for (int i = 0; i < params.length; i++) {
				statement.setObject(i+1, params[i]);
			}
			int result = statement.executeUpdate();
			statement.close();
			return result;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return -1;
	}
	
	public List<T> findList(String sql,RowMapper<T> rowMapper, Object...params){
		try(PreparedStatement statement = getConnection().prepareStatement(sql);) {
			for (int i = 0; i < params.length; i++) {
				statement.setObject(i+1, params[i]);
			}
			ResultSet rs = statement.executeQuery();
			List<T> list=new LinkedList<T>();
			while (rs.next()) {
				list.add(rowMapper.row2Object(rs));
			}
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	public T findOne(String sql,RowMapper<T> rowMapper,Object...params){
		try(PreparedStatement statement = getConnection().prepareStatement(sql);) {
			for (int i = 0; i < params.length; i++) {
				statement.setObject(i+1, params[i]);
			}
			ResultSet rs = statement.executeQuery();
			if(rs.next()) {
				return rowMapper.row2Object(rs);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	public T findOne(String sql,Class<T> klazz,Object...params){
		try(PreparedStatement statement = getConnection().prepareStatement(sql);) {
			for (int i = 0; i < params.length; i++) {
				statement.setObject(i+1, params[i]);
			}
			ResultSet rs = statement.executeQuery();
			if(rs.next()) {
				ResultSetMetaData metaData = rs.getMetaData();
				int columnCount = metaData.getColumnCount();
				T result=klazz.newInstance();
				for (int i = 1; i <= columnCount; i++) {
					String columnName = metaData.getColumnName(i).toLowerCase();
					Field field = klazz.getDeclaredField(columnName);
					field.setAccessible(true);
					System.out.println(metaData.getColumnTypeName(i));
					System.out.println(metaData.getColumnType(i));
					switch (metaData.getColumnType(i)) {
						case java.sql.Types.NUMERIC:
							field.set(result, rs.getInt(i));
							break;
						case java.sql.Types.VARCHAR:
							field.set(result, rs.getString(i));
							break;
						case java.sql.Types.DATE:
							field.set(result, rs.getDate(i));
							break;
						default:
							field.set(result, rs.getObject(i));
							break;
					}
					
				}
				return result;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

package com.bennett.util;
import java.sql.ResultSet;
/**
 * @Version:1.0 
 * @Description:SM-7
 * 				对象关系映射(ORM)
 * @Author: bennett
 * @Date: 2021年10月22日 下午2:17:32
 */
public interface RowMapper<T> {
	T row2Object(ResultSet rs);
}

com.bennett.dao.test

package com.bennett.dao.test;

import static org.junit.jupiter.api.Assertions.*;

import java.sql.Date;
import java.util.List;

import org.junit.jupiter.api.Test;

import com.bennett.model.Student;
/**
 * @Version:1.0 
 * @Description:SM-7
 * 				对象关系映射(ORM)
 * @Author: bennett
 * @Date: 2021年10月22日 下午2:17:32
 */
class StudentImplJdbcTest {
	private StudentDao studentDao = new StudentImplJdbc();

	@Test
	void testAdd() {
		assertTrue(studentDao.add(new Student(1002, "李广", Date.valueOf("2003-3-3"))));
		assertTrue(studentDao.add(new Student(1003, "张恒", Date.valueOf("2003-3-3"))));
		assertTrue(studentDao.add(new Student(1004, "郭开", Date.valueOf("2003-3-3"))));
	}

	@Test
	void testDelete() {
		assertTrue(studentDao.delete(1004));
	}

	@Test
	void testUpdate() {
		assertTrue(studentDao.update(new Student(1004, "李渊", Date.valueOf("2005-3-3"))));
	}

	@Test
	void testGetAll() {
		List<Student> results = studentDao.getAll();
		for (Student student : results) {
			System.out.println(student);
		}
	}

	@Test
	void testRow2Object() {
		fail("Not yet implemented");
	}

	@Test
	void testGet() {
		System.out.println(studentDao.get(1001));
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值