关于使用反射和泛型写JDBC

关于使用反射和泛型写JDBC

最近学习了用反射和泛型来写JDBC,发现可以省掉很多代码。下面是我个人的理解,有错误的地方请指出。谢谢。

我是做一个简单的小例子,使查询结果输出在控制台。我这里使用的是eclipse、MySQL数据库,随意创建一个表名字为users,里面的字段有id、name、pwd。那个连接数据库的jar包可以去官网下载,我这里也有[https://pan.baidu.com/s/1JjYHbee5JTNyprD9QOIDEg],提取码:kwoz.

新建一个java项目
把jar包放进去Build Path一下,这个时候就开始创建需要的包,我这里用的包如下
在这里插入图片描述
首先,我先创建了一个javabean类,里面主要是数据库的字段,代码如下:

package com.hp.bean;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter

public class User{

	private int id;
	private String name;
	private String pwd;
	
}

我这里用了一个插件jar包,lombok.jar,这样子可以不用写get、set、toString等等方法,直接用@NoArgsConstructor、@AllArgsConstructor、@ToString、@Getter、@Setter这些引入就好了。jar包下载地址:[https://pan.baidu.com/s/19bhDrEnkVmaQZmCz51RVyg]提取码:31ff。这个有的需要运行一下然后配置一点东西,这里网上有很多教程,如果这里不能用的话可以直接用最原始的方式,get set…。
其次,我创建了一个DBUtil类,这个类主要是连接数据库的。代码如下:

package com.hp.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBUtil {

	public static final String url = "jdbc:mysql://localhost:3306/test";
	public static final String name = "root";
	public static final String pwd = "root";
	public static Connection conn;
	public static PreparedStatement ps;
	public static ResultSet rs;
	/**
	 * 连接数据库
	 * @return
	 */
	public static Connection getConn() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, name, pwd);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	/**
	 * 关闭数据库
	 */
	public static void closeConn() {
		try {
			conn.close();
			ps.close();
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

可能写法上有点不一样,不过都是可以用的。
然后,我开始创建接口,dao接口和接口的实现,还有service接口和接口的实现,我这里只用了一个查询的方法。
UserDao.java

package com.hp.dao;

import java.util.List;
import java.util.Map;


public interface UserDao {
	/**
	 * 查询所有
	 * @return
	 */
	public <E> List<E> selectType(E e,String sql);
	
}

UserDaoImpl.java

package com.hp.dao.impl;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.hp.dao.UserDao;
import com.hp.util.DBUtil;

public class UserDaoImpl implements UserDao{

	@Override
	public <E> List<E> selectType(E e,String sql) {
		Connection conn = DBUtil.getConn();
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<E> list = new ArrayList<>();
		try {
			ps = conn.prepareStatement("select * "+sql);
			rs = ps.executeQuery();
			while (rs.next()) {
				e = (E) e.getClass().newInstance();//通过反射创建实例化对象
				Field[] fields = e.getClass().getDeclaredFields();
				
				for (int i = 0; i < fields.length; i++) {
					String cname = fields[i].getName();
					fields[i].setAccessible(true);
					try {
						fields[i].set(e, rs.getObject(cname));
					} catch (IllegalArgumentException e1) {
						e1.printStackTrace();
					} catch (IllegalAccessException e1) {
						e1.printStackTrace();
					}
				}
				list.add(e);
			}
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		
		return list;
	}
}

UserService.java

package com.hp.service;

import java.util.List;
import java.util.Map;

import com.hp.bean.User;

public interface UserService {
	/**
	 * 查询所有
	 * @return
	 */
	public <E> List<E> selectType(E e,String sql);
	
}

UserServiceImpl.java

package com.hp.service.impl;

import java.util.List;
import java.util.Map;

import com.hp.bean.User;
import com.hp.dao.UserDao;
import com.hp.dao.impl.UserDaoImpl;
import com.hp.service.UserService;

public class UserServiceImpl implements UserService{

	UserDao userDao = new UserDaoImpl();
	@Override
	public <E> List<E> selectType(E e,String sql) {
		return userDao.selectType(e,sql);
	}
}

到最后就是这些服务的调用了。我命名为UserAction.java

package com.hp.action;

import java.util.List;

import com.hp.bean.User;
import com.hp.service.UserService;
import com.hp.service.impl.UserServiceImpl;

public class UserAction {


	public static void main(String[] args) {
		User user = new User();
		UserService userService = new UserServiceImpl();
		String sql = "from users";
		List<User> list = userService.selectType(user,sql);
		System.out.println(list);
	}
}

这就是我用反射和泛型写的简单的查询的JDBC.

发布了31 篇原创文章 · 获赞 13 · 访问量 7947

猜你喜欢

转载自blog.csdn.net/weixin_42322648/article/details/85633984