请选择 进入手机版 | 继续访问电脑版

JDBC_CRUD 操作 - 进阶(JdbcTemplate)

发表于 2016-08-08 23:57 显示全部楼层 22 481

继续上面JDBC_CRUD 操作 - 中级(JdbcUtil+properties),进一步优化。

blob.png

package com.langfei._02_.domain;
//数据对象Student
public class Student {
	private Long id;
	private String name;
	private String gender;
	private Integer age;
	private String address;
	private String clzz;
	
	public Student() {
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getClzz() {
		return clzz;
	}
	public void setClzz(String clzz) {
		this.clzz = clzz;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + ", address=" + address
				+ ", clzz=" + clzz + "]";
	}
}
package com.langfei._02_.dao;

import java.util.List;

import com.langfei._02_.domain.Student;

/**
 * student DAO 接口规范,规定student crud操作 
 * @author yexingfei
 */
public interface IStudentDAO {
	void add(Student student);
	int delete(Long id);
	int update(Student student);
	Student find(Long id);
	List<Student> findAll();
}
package com.langfei._02_.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.langfei._02_.domain.Student;


public class JdbcTemplate {
	private JdbcTemplate(){}
	/**
	 * @param sql  使用预编译DML语句(update、insert、delete)
	 * @param params sql中占位符?对应的参数,需要按顺序
	 * @return
	 */
	public static int update(String sql, Object...params){
		Connection connection = JdbcUtil.getConn();
		PreparedStatement preparedStatement = null;
		try {
			preparedStatement = connection.prepareStatement(sql);
			for(int i = 0; i < params.length; i++){
				preparedStatement.setObject(i+1, params[i]);
			}
			return preparedStatement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JdbcUtil.close(connection, preparedStatement, null);
		}
		return -1;
	}
	
	/**
	 * @param sql  使用预编译DML语句(SELETE)
	 * @param params sql中占位符?对应的参数,需要按顺序
	 * @return List<Student>
	 */
	public static List<Student> query(String sql, Object... params){
		Connection connection = JdbcUtil.getConn();
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		
		List<Student> list = new ArrayList<>();
		Student student = null;
		try {
			preparedStatement = connection.prepareStatement(sql);
			for(int i = 0; i < params.length; i++){
				preparedStatement.setObject(i+1, params[i]);
			}
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {
				student = new Student();
				student.setAddress(resultSet.getString("address"));
				student.setAge(resultSet.getInt("age"));
				student.setName(resultSet.getString("name"));
				student.setClzz(resultSet.getString("clzz"));
				student.setGender(resultSet.getString("gender"));
				student.setId(resultSet.getLong("id"));
				list.add(student);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JdbcUtil.close(connection, preparedStatement, resultSet);
		}
		return list;
	}
}
package com.langfei._02_.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * jdbc抽取,
 * 1、共用了获取数据库连接方式
 * 2、共用了数据库资源关闭方式
 * 3、使用properties 方式获取数据连接信息.
 * @author yexingfei
 */
public class JdbcUtil {
	private static String username;
	private static String password;
	private static String url;

	private JdbcUtil() {
	}
	static {
		InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc.properties");
		Properties properties = new Properties();
		try {
			properties.load(inputStream);
			username = properties.getProperty("username");
			password = properties.getProperty("password");
			url = properties.getProperty("url");
			Class.forName(properties.getProperty("driver"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static Connection getConn() {
		try {
			return DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void close(Connection connection, Statement ps, ResultSet resultSet) {
		try {
			if (connection != null) {
				connection.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (ps != null) {
				ps.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (resultSet != null) {
				resultSet.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
package com.langfei._02_.dao.impl;

import java.util.List;

import com.langfei._02_.dao.IStudentDAO;
import com.langfei._02_.domain.Student;
import com.langfei._02_.util.JdbcTemplate;

public class StudentDAOImpl implements IStudentDAO {

	@Override
	public void add(Student student) {
		String sql ="INSERT INTO t_student( name, age, gender, address, clzz) values(?,?,?,?,?)";
		Object[] params = {student.getName(), student.getAge(), 
				student.getGender(), student.getAddress(), 
				student.getClzz()};
		JdbcTemplate.update(sql, params);
	}

	@Override
	public int delete(Long id) {
		String sql = "DELETE FROM t_student WHERE id = ? ";
		Object[] params = {id};
		return JdbcTemplate.update(sql, params);
	}

	@Override
	public int update(Student student) {
		String sql ="UPDATE  t_student SET name=?, age=?, gender=?, address=?, clzz=? WHERE id = ? ";
		Object[] params = {student.getName(), student.getAge(), 
				student.getGender(), student.getAddress(), 
				student.getClzz(), student.getId()};
		return JdbcTemplate.update(sql, params);
	}

	@Override
	public Student find(Long id) {
		String sql = "SELECT id, name, gender, age, address, clzz FROM t_student WHERE id = ?";
		Object[] params = {id};
		//通过id去查跟查询全部区别:一个返回1条数据, 一个可能返回多个数据
		List<Student> list = JdbcTemplate.query(sql, params);
		//查出一个,这获取第一个,否则是null
		return list.size() == 1 ? list.get(0):null;
	}

	@Override
	public List<Student> findAll() {
		String sql = "SELECT id, name, gender, age, address, clzz FROM t_student";
		List<Student> list = JdbcTemplate.query(sql);
		return list;
	}
}
package com.langfei._02_.test;

import java.util.List;

import org.junit.Test;

import com.langfei._02_.dao.IStudentDAO;
import com.langfei._02_.dao.impl.StudentDAOImpl;
import com.langfei._02_.domain.Student;

public class StudentDAOTest {

	private IStudentDAO dao = new StudentDAOImpl();
	@Test
	public void testAdd() throws Exception {
		Student student = new Student();
		student.setAddress("广东");
		student.setAge(10);
		student.setClzz("大神1班");
		student.setGender("仔");
		student.setName("飞");
		dao.add(student);
	}
	@Test
	public void testDelete() throws Exception {
		Long id = 6L;
		dao.delete(id);
	}
	@Test
	public void testUpdate() throws Exception {
		Student student = new Student();
		student.setId(6L);
		student.setAddress("广东1");
		student.setAge(12);
		student.setClzz("大神2班");
		student.setGender("妞");
		student.setName("大飞");
		dao.update(student);
	}
	@Test
	public void testFind() throws Exception{
		Student student = dao.find(5L);
		System.out.println(student);
	}
	@Test
	public void testFindAll() throws Exception{
		List<Student> list = dao.findAll();
		for(Student student : list){
			System.out.println(student);
		}
	}
}


总结:

01、中级(JdbcUtil+properties)

存在问题

1> 不符合jdbc-dao结构

2> DML(update、insert、delete)方法, DQL(find、findAll) 依然存在重复

    使用JdbcTemplate.java 抽取update(String, Object...) 跟 query(String sql, Object... params) 方法,对应

 DML 跟 DQL 方法

02、进阶(JdbcTemplate)

1> DQL数据操作类型写死,换成其他domain 不适用


回复 使用道具
举报
黑白

发表于 2017-04-07 15:37 显示全部楼层

666

<hr>

可以的

回复 支持 反对 使用道具
举报
我不想静静

发表于 2017-03-31 06:52 显示全部楼层

回复 支持 反对 使用道具
举报
淡蓝心情

发表于 2017-03-25 13:56 显示全部楼层

为了学币每天必水一下,望见谅

回复 支持 反对 使用道具
举报
认真的屎迪仔

发表于 2017-03-14 08:28 显示全部楼层

回复 支持 反对 使用道具
举报
凉月流沐

发表于 2017-03-06 07:36 显示全部楼层

回复 支持 反对 使用道具
举报
艇仔饭

发表于 2017-03-04 23:25 显示全部楼层

回复 支持 反对 使用道具
举报
馨四君

发表于 2017-03-03 23:03 显示全部楼层

回复 支持 反对 使用道具
举报
寒雪飘影

发表于 2017-02-28 19:30 显示全部楼层

路过,支持一下

回复 支持 反对 使用道具
举报
xmf

发表于 2017-02-27 22:29 显示全部楼层

围观楼主

回复 支持 反对 使用道具
举报
123下一页

发表新文章
叶星飞

小码哥骨干成员

0

学分

968

学币

1059

积分

小码哥骨干成员

Rank: 6Rank: 6

积分
1059
Ta的主页 发消息
精华帖排行榜

精彩推荐

  • 关注小码哥教育