数据库操作案例

整个案例的代码结构:


好吧,废话不多说,直接上代码!

1.表结构如下

/*员工表*/
create table t_employee{
	id_ int primary key auto_increment,
	name_ varchar(20) not null,
	dept_name varchar(30),
	hiredate date not null
);

/*薪水表*/
create table t_salary (
	id_ int primary key auto_increment,
	emp_id int,
	salary_ float not null
	foreign key(emp_id) references t_employee(id_)
);

2.实体类Employee


public class Employee {
	
	private Integer id;
	private String name;
	private String gender;
	private String deptName;
	private Date hireDate;
	
	public Employee() {
	}
	public Employee(String name, String gender, String deptName,Date hireDate) {
		this.name = name;
		this.gender = gender;
		this.deptName = deptName;
		this.hireDate = hireDate;
	}
	public Employee(Integer id, String name, String gender, String deptName,Date hireDate) {
		this.id = id;
		this.name = name;
		this.gender = gender;
		this.deptName = deptName;
		this.hireDate = hireDate;
	}
......省略 setXxx,getXxx方法

3.工具包中类的介绍

①Configuration类

/**
 * 读取连接数据库的配置信息
 * 配置信息说明如下:
 * ①默认配置文件位于src目录下的db.properties文件
 * ②配置文件内容格式:
 * driver_class=com.mysql.jdbc.Driver
 * url=jdbc\:mysql\://localhost\:3306/dbname
 * username=root
 * password=root
 * 
 * @author Geek_ymv
 */
public final class Configuration {
	/**
	 * 读取默认配置文件(位于src目录下的db.properties)
	 * @return
	 */
	public Map<String, String> configure() {
		return configure("/db.properties");
	}
	
	/**
	 * 指定配置文件
	 * @param resource
	 * @return
	 */
	private Map<String, String> configure(String resource){
		
		Map<String, String> dbInfos = new HashMap<String, String>();
		
		Class<?> clazz = Configuration.class;
		InputStream inStream = clazz.getResourceAsStream(resource);
		
		Properties properties = new Properties();
		try {
			properties.load(inStream);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(null != inStream){
					inStream.close();
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}

		String driver_class = properties.getProperty("driver_class");
		String url = properties.getProperty("url");
		String username = properties.getProperty("username");
		String password = properties.getProperty("password");
		
		dbInfos.put("driver_class", driver_class);
		dbInfos.put("url", url);
		dbInfos.put("username", username);
		dbInfos.put("password", password);

		return dbInfos;
	}
}

②DBSource类

public final class DBSource {
	
	private static DBSource source = new DBSource();
	private DBSource(){}
	
	private static Map<String, String> dbinfos = null;
	
	static{
		Configuration configuration = new Configuration();
		dbinfos = configuration.configure();
		try {
			Class.forName(dbinfos.get("driver_class"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static DBSource getInstance(){
		return source;
	}
	
	public Connection getConnection(){
		try {	
			return DriverManager.getConnection(dbinfos.get("url"), 	//
					dbinfos.get("username"), dbinfos.get("password"));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return null;
	}

}

③DBUtil类

public class DBUtil {
	
	/**
	 * 查询操作
	 * @param sql	要执行的SQL语句
	 * @param handler	类型转换
	 * @param paras 可变参数
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static List queryObject(String sql, Convert2Object handler, Object... paras){
		
		List datas = new ArrayList();
		
		Connection ct = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		ct = DBSource.getInstance().getConnection();
		
		try {
			ct.setAutoCommit(false);
			
			ps = ct.prepareStatement(sql);
			
			//参数绑定
			if(null != paras && paras.length > 0){
				for(int i = 0; i < paras.length; i++){
					Object obj = paras[i];
					ps.setObject(i+1, obj);
				}
			}
			rs = ps.executeQuery();
			
			while(rs.next()) {
				Object obj = handler.convert(rs);
				datas.add(obj);
			}
			
			ct.commit();
			
		} catch (Exception e) {
			try {
				if(null != ct){
					ct.rollback();
				}
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		} finally {
			close(ct, ps, rs);
		}
		
		return datas;
	}
	
	/**
	 * 增、删、改操作
	 * @param sql
	 * @param paras
	 * @return
	 */
	public static boolean execute(String sql, Object...paras){
		boolean res = true;
		
		Connection ct = null;
		PreparedStatement ps = null;

		ct = DBSource.getInstance().getConnection();
		try {
			ct.setAutoCommit(false);
			ps = ct.prepareStatement(sql);
			//参数绑定
			if(null != paras && paras.length > 0){
				for(int i = 0; i < paras.length; i++){
					Object obj = paras[i];
					ps.setObject(i+1, obj);
				}
			}
			
			ps.executeUpdate();
			
			ct.commit();
			
		} catch (Exception e) {
			res = false;
			try {
				if(null != ct){
					ct.rollback();
				}
			} catch (SQLException ex) {
				ex.printStackTrace();
			}
			e.printStackTrace();
		} finally {
			close(ct, ps, null);
		}
		
		return res;
	}
	
	
	/**
	 * 关闭资源
	 * @param ct
	 * @param ps
	 * @param rs
	 */
	private static void close(Connection ct, PreparedStatement ps, ResultSet rs) {
		try {
			if(null != rs){
				rs.close();
			}
			if(null != ps){
				ps.close();
			}
			if(null != ct){
				ct.close();
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

④Convert2Object接口

/**
 * 定义将表中的一行记录转换成一个实体对象的接口
 * @author Geek_ymv
 */
public interface Convert2Object {
	
	public Object convert(ResultSet rs);
	
}

⑤DateUtil 日期处理工具类

public class DateUtil {
	
	private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
	
	/**
	 * 将日期对象转换成字符串
	 * @param date
	 * @return
	 */
	public static String convert2String(Date date){
		
		return format.format(date);
	}
	
	/**
	 * 将日期格式的字符串转换成日期
	 * @param source
	 * @return
	 */
	public static Date convert2Date(String source){
		try {
			return format.parse(source);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return null;
	}

}

db.properties文件内容


EmployeeService类

注:由于案例较小,就不写dao层了

public class EmployeeService {
	
	private Convert2Object handler = new Convert2Object(){
		@Override
		public Object convert(ResultSet rs) {
			
			try {
				int id = rs.getInt(1);
				String name = rs.getString(2);
				String gender = rs.getString(3);
				String deptName = rs.getString(4);
				Date hireDate = rs.getDate(5);
				
				Employee emp = new Employee(id, name, gender, deptName, hireDate);
				
				return emp;
				
			} catch (Exception e) {
				e.printStackTrace();
			}
			return null;
		}
	};
	
	
	/**
	 * 分页查询Employee信息
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Employee> queryEmpByPage(int pageNo, int pageSize){
		
		int startIndex = (pageNo-1) * pageSize;
		
		String sql = "select * from t_employee limit ?, ?";
		
		return (List<Employee>)DBUtil.queryObject(sql, handler, startIndex, pageSize);
	}
	
	
	/**
	 * 添加员工
	 * @param emp
	 * @return
	 */
	public boolean addEmp(Employee emp){
		
		String hireDate = DateUtil.convert2String(emp.getHireDate());
		
		String sql = "insert into t_employee(name_, gender_, dept_name, hiredate) values(?,?,?,?)";
		Object[] paras = {emp.getName(), emp.getGender(), emp.getDeptName(), hireDate};
		
		
		return DBUtil.execute(sql, paras);
	}
	
	
	
	
	/**
	 * 获得t_employee表中记录数
	 * @return
	 */
	public int rowCounts(){
		String sql = "select count(*) from t_employee";
		
		Integer rows = (Integer)DBUtil.queryObject(sql, new Convert2Object(){
			@Override
			public Object convert(ResultSet rs) {

				try {
					return rs.getInt(1);
					
				} catch (SQLException e) {
					e.printStackTrace();
				}
				
				return null;
			}
		}).get(0);
		
		return rows;
	}

}

Client测试类

public class Client {
	
	public static void main(String[] args) {
		
		EmployeeService service = new EmployeeService();
//		
//		
//		List<Employee> emps = service.queryEmpByPage(1, 3);
//		
//		
//		for(Employee e : emps) {
//			
//			System.out.println(e.getId());
//			
//		}

		Employee emp = new Employee("笑笑", "男", "信息部", new Date());
		service.addEmp(emp);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值