jdbc中首次了解DAO及其子类

DAO: data(base) access object用于与数据库进行交互

1.实体类Customer.java

package loey.java1.bean;

import java.sql.Date;

/*
 * ORM编程思想  (object relational mapping)
 * 一个数据表对应一个java类
 * 表中的一条记录对应java类的一个对象
 * 表中的一个字段对应java类的一个属性
 * 
 */
public class Customer {
	
	private int id;
	private String name;
	private String email;
	private Date birth;
	public Customer() {
		super();
	}
	public Customer(int id, String name, String email, Date birth) {
		super();
		this.id = id;
		this.name = name;
		this.email = email;
		this.birth = birth;
	}
	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 String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	@Override
	public String toString() {
		return "Customer [id=" + id + ", name=" + name + ", email=" + email + ", birth=" + birth + "]";
	}
	
	
	
}

2.BaseDAO.java

/*
 * DAO: data(base) access object
 * 封装了针对于数据表的通用的操作
 */
public abstract class BaseDAO<T> {
	
	private Class<T> clazz = null;
	
//	public BaseDAO(){
//		
//	}
	
	{	
		//获取当前BaseDAO的子类继承的父类中的泛型
		Type genericSuperclass = this.getClass().getGenericSuperclass();
		ParameterizedType paramType = (ParameterizedType) genericSuperclass;
		
		Type[] typeArguments = paramType.getActualTypeArguments();//获取了父类的泛型参数
		clazz = (Class<T>) typeArguments[0];//泛型的第一个参数
		
	}
	
	
	// 通用的增删改操作---version 2.0 (考虑上事务
	public int update(Connection conn, String sql, Object... args) {// sql中占位符的个数与可变形参的长度相同!
		PreparedStatement ps = null;
		try {
			// 1.预编译sql语句,返回PreparedStatement的实例
			ps = conn.prepareStatement(sql);
			// 2.填充占位符
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);// 小心参数声明错误!!
			}
			// 3.执行
			return ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 4.资源的关闭
			JDBCUtils.closeResource(null, ps);

		}
		return 0;

	}

	// 通用的查询操作,用于返回数据表中的一条记录(version 2.0:考虑上事务
	public T getInstance(Connection conn, String sql, Object... args) {
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {

			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}

			rs = ps.executeQuery();
			// 获取结果集的元数据 :ResultSetMetaData
			ResultSetMetaData rsmd = rs.getMetaData();
			// 通过ResultSetMetaData获取结果集中的列数
			int columnCount = rsmd.getColumnCount();

			if (rs.next()) {
				T t = clazz.newInstance();
				// 处理结果集一行数据中的每一个列
				for (int i = 0; i < columnCount; i++) {
					// 获取列值
					Object columValue = rs.getObject(i + 1);

					// 获取每个列的列名
					// String columnName = rsmd.getColumnName(i + 1);
					String columnLabel = rsmd.getColumnLabel(i + 1);

					// 给t对象指定的columnName属性,赋值为columValue:通过反射
					Field field = clazz.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columValue);
				}
				return t;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.closeResource(null, ps, rs);

		}

		return null;
	}
	// 通用的查询操作,用于返回数据表中的多条记录构成的集合(version 2.0:考虑上事务
	public List<T> getForList(Connection conn, String sql, Object... args) {
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {

			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}

			rs = ps.executeQuery();
			// 获取结果集的元数据 :ResultSetMetaData
			ResultSetMetaData rsmd = rs.getMetaData();
			// 通过ResultSetMetaData获取结果集中的列数
			int columnCount = rsmd.getColumnCount();
			// 创建集合对象
			ArrayList<T> list = new ArrayList<T>();
			while (rs.next()) {
				T t = clazz.newInstance();
				// 处理结果集一行数据中的每一个列:给t对象指定的属性赋值
				for (int i = 0; i < columnCount; i++) {
					// 获取列值
					Object columValue = rs.getObject(i + 1);

					// 获取每个列的列名
					// String columnName = rsmd.getColumnName(i + 1);
					String columnLabel = rsmd.getColumnLabel(i + 1);

					// 给t对象指定的columnName属性,赋值为columValue:通过反射
					Field field = clazz.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columValue);
				}
				list.add(t);
			}

			return list;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.closeResource(null, ps, rs);

		}

		return null;
	}
	//用于查询特殊值的通用的方法
	public <E> E getValue(Connection conn,String sql,Object...args){
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(sql);
			for(int i = 0;i < args.length;i++){
				ps.setObject(i + 1, args[i]);
				
			}
			
			rs = ps.executeQuery();
			if(rs.next()){
				return (E) rs.getObject(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			JDBCUtils.closeResource(null, ps, rs);
			
		}
		return null;
		
	}	
}

3.CustomerDAO.java

/*
 * 此接口用于规范针对于customers表的常用操作
 */
public interface CustomerDAO {
	/**
	 * 
	 * @Description 将cust对象添加到数据库中
	 * @author shkstart
	 * @date 上午11:00:27
	 * @param conn
	 * @param cust
	 */
	void insert(Connection conn,Customer cust);
	/**
	 * 
	 * @Description 针对指定的id,删除表中的一条记录
	 * @author shkstart
	 * @date 上午11:01:07
	 * @param conn
	 * @param id
	 */
	void deleteById(Connection conn,int id);
	/**
	 * 
	 * @Description 针对内存中的cust对象,去修改数据表中指定的记录
	 * @author shkstart
	 * @date 上午11:02:14
	 * @param conn
	 * @param cust
	 */
	void update(Connection conn,Customer cust);
	/**
	 * 
	 * @Description 针对指定的id查询得到对应的Customer对象
	 * @author shkstart
	 * @date 上午11:02:59
	 * @param conn
	 * @param id
	 */
	Customer getCustomerById(Connection conn,int id);
	/**
	 * 
	 * @Description 查询表中的所记录构成的集合
	 * @author shkstart
	 * @date 上午11:03:50
	 * @param conn
	 * @return
	 */
	List<Customer> getAll(Connection conn);
	/**
	 * 
	 * @Description 返回数据表中的数据的条目数
	 * @author shkstart
	 * @date 上午11:04:44
	 * @param conn
	 * @return
	 */
	Long getCount(Connection conn);
	
	/**
	 * 
	 * @Description 返回数据表中最大的生日
	 * @author shkstart
	 * @date 上午11:05:33
	 * @param conn
	 * @return
	 */
	Date getMaxBirth(Connection conn);
	
}	

4.CustomerDAOImpl.java

public class CustomerDAOImpl extends BaseDAO<Customer> implements CustomerDAO{
	

	@Override
	public void insert(Connection conn, Customer cust) {
		String sql = "insert into customers(name,email,birth)values(?,?,?)";
		update(conn, sql,cust.getName(),cust.getEmail(),cust.getBirth());
	}

	@Override
	public void deleteById(Connection conn, int id) {
		String sql = "delete from customers where id = ?";
		update(conn, sql, id);
	}

	@Override
	public void update(Connection conn, Customer cust) {
		String sql = "update customers set name = ?,email = ?,birth = ? where id = ?";
		update(conn, sql,cust.getName(),cust.getEmail(),cust.getBirth(),cust.getId());
	}

	@Override
	public Customer getCustomerById(Connection conn, int id) {
		String sql = "select id,name,email,birth from customers where id = ?";
		Customer customer = getInstance(conn, sql,id);
		return customer;
	}

	@Override
	public List<Customer> getAll(Connection conn) {
		String sql = "select id,name,email,birth from customers";
		List<Customer> list = getForList(conn, sql);
		return list;
	}

	@Override
	public Long getCount(Connection conn) {
		String sql = "select count(*) from customers";
		return getValue(conn, sql);
	}

	@Override
	public Date getMaxBirth(Connection conn) {
		String sql = "select max(birth) from customers";
		return getValue(conn, sql);
	}

}

5.测试

package loey.java1.dao.junit;

import loey.DBCUtil.DBCUtil;
import loey.java1.bean.Customer;
import loey.java1.dao.CustomerDAOImpl;
import org.junit.Test;

import java.net.DatagramSocket;
import java.sql.Connection;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.List;

public class CustomerDAOImplTest {

    private CustomerDAOImpl dao = new CustomerDAOImpl();

    @Test
    public void testInsert() {
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            java.util.Date date = sdf.parse("1992-11-27");
            Customer cust = new Customer(1, "朴灿烈", "pcy@163.com", new Date(date.getTime()));

            dao.insert(conn, cust);

            System.out.println("添加成功!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testDeleteById(){
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            int id = 24;
            dao.deleteById(conn,id);

            System.out.println("删除成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testUpade(){
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            java.util.Date date = sdf.parse("1992-04-06");
            Customer cust = new Customer(23,"边伯贤","bbx@163.com",new Date(date.getTime()));

            dao.update(conn,cust);

            System.out.println("修改成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testGetCustomerById(){

        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            int id = 6;
            Customer customer = dao.getCustomerById(conn, id);

            System.out.println(customer);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testGetAll(){
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            int id = 6;
            List<Customer> customers = dao.getAll(conn, id);

          customers.forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testGetCount(){
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            Long count = dao.getCount(conn);

            System.out.println("该表共有" + count + "人");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCUtil.close(conn,null,null);
        }
    }

    @Test
    public void testGetMaxBirth() {
        Connection conn = null;
        try {
            conn = DBCUtil.getConnection();

            Date maxBirth = dao.getMaxBirth(conn);

            System.out.println("最大的生日为:" + maxBirth);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            DBCUtil.close(conn, null,null);

        }
    }

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个使用 JDBC 和 SQL Server 构建用户功能界面的代码示例。在这个示例,我们将使用 Java Swing 编写用户界面,并使用 JDBC 连接到 SQL Server 数据库。 首先,我们需要创建一个数据库表来存储用户数据。我们可以使用以下 SQL 语句在 SQL Server 创建一个名为 "users" 的表: ``` CREATE TABLE users ( id INT PRIMARY KEY IDENTITY, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL, email VARCHAR(50) NOT NULL ); ``` 接下来,我们需要编写 Java 代码来连接到数据库并执行 SQL 查询。我们将使用 Microsoft 提供的 SQL Server JDBC 驱动程序来连接到数据库。以下是一个示例代码: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class UserDAO { private static final String url = "jdbc:sqlserver://localhost:1433;databaseName=mydatabase"; private static final String user = "myusername"; private static final String password = "mypassword"; public User getUser(String username) { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; User user = null; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn = DriverManager.getConnection(url, user, password); stmt = conn.prepareStatement("SELECT * FROM users WHERE username = ?"); stmt.setString(1, username); rs = stmt.executeQuery(); if (rs.next()) { user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); user.setEmail(rs.getString("email")); } } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return user; } // TODO: Add methods for saving and updating users } ``` 在这个示例,UserDAO 类包含一个 getUser() 方法,该方法接受一个用户名作为参数,并返回与该用户名匹配的用户对象。该方法使用 JDBC 驱动程序连接到数据库,并执行一个 SQL 查询来检索用户数据。如果查询返回结果,则将结果转换为 User 对象,并将其返回。 接下来,我们需要编写用户界面代码。我们将使用 Java Swing 编写一个简单的登录表单。以下是一个示例代码: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class LoginFrame extends JFrame implements ActionListener { private JLabel usernameLabel; private JTextField usernameField; private JLabel passwordLabel; private JPasswordField passwordField; private JButton loginButton; public LoginFrame() { super("Login"); setLayout(new GridLayout(3, 2)); usernameLabel = new JLabel("Username:"); usernameField = new JTextField(); passwordLabel = new JLabel("Password:"); passwordField = new JPasswordField(); loginButton = new JButton("Login"); loginButton.addActionListener(this); add(usernameLabel); add(usernameField); add(passwordLabel); add(passwordField); add(new JLabel()); add(loginButton); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public void actionPerformed(ActionEvent e) { UserDAO dao = new UserDAO(); User user = dao.getUser(usernameField.getText()); if (user != null && user.getPassword().equals(new String(passwordField.getPassword()))) { JOptionPane.showMessageDialog(this, "Login successful"); } else { JOptionPane.showMessageDialog(this, "Login failed"); } } public static void main(String[] args) { new LoginFrame(); } } ``` 在这个示例,我们创建了一个名为 LoginFrame 的 JFrame 类。该类包含一个用于输入用户名和密码的表单,以及一个登录按钮。当用户单击登录按钮时,我们将调用 UserDAO 类的 getUser() 方法来检索与输入的用户名匹配的用户对象。如果找到该用户并且密码匹配,则显示一个消息框,表示登录成功。否则,显示一个消息框,表示登录失败。 需要注意的是,在实际应用程序,我们需要更加复杂和安全的身份验证机制来保护用户数据。这个示例只是一个简单的演示,以说明如何使用 JDBC 和 SQL Server 构建用户功能界面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值