5.CRUD操作

1.增加

package cn.edu.hbue.wmp;

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

public class GeneralJDBCInsert {
	
	public static void main(String args[]){
		
		
		Student stu = new Student(14,"小汤","18462@edu","2000-4-1");
		String sql = "insert into student values(?,?,?,?)";
		isnert(sql,stu);
		
	}
	
	public static void isnert(String sql,Student stu){  //插入一条学生记录
		
		PreparedStatement ps = null;
		Connection connection = null;
		
		
		//1.获取连接
		connection = JDBCUtil.getConn();
		
		try {
			//2.预编译sql
			ps = connection.prepareStatement(sql);
			

			
			//3.填充占位符
			ps.setInt(1, stu.getId());
			ps.setString(2, stu.getName());
			ps.setString(3, stu.getEmail());
			ps.setString(4, stu.getBirth());
			
			
			//4.执行操作
			ps.execute();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			
			//5.关闭资源
			JDBCUtil.closeConn(ps, connection);
		}
		
		
	}

}

2.删除

package cn.edu.hbue.wmp;

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

public class GeneralJDBCUpdate {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String sql = "delete from student where id = ?";
		update(sql,11);

	}
	
	//要传入sql语句和不确定的占位符
	public static void update(String sql,Object ... args){
		
		Connection connection = null;
		PreparedStatement ps = null;
		//1.获取连接
		connection = JDBCUtil.getConn();
		
		try {
			//2.预编译sql语句
			ps = connection.prepareStatement(sql);
			
			//3.填充占位符
			for(int i = 0;i < args.length;i++){
				ps.setObject(i + 1, args[i]);
			}
			
			//4.执行sql语句
			ps.execute();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			
			//5.关闭资源
			JDBCUtil.closeConn(ps,connection);
			
		}
	
	}

}

3.修改

package cn.edu.hbue.wmp;

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

public class GeneralJDBCAlter {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String sql = "update student set name = ? where id = ?";
		alter(sql,"汤汤",14);
		
	}

	
	public static void alter(String sql,Object...args)
	{
		
		PreparedStatement ps = null;
		Connection connection = null;
		
		
		//1.获取连接
		connection = JDBCUtil.getConn();
		
		try {
			//2.预编译sql语句
			ps = connection.prepareStatement(sql);
			
			//3.填充占位符
			for(int i = 0;i<args.length;i++){
				
				ps.setObject(i+1, args[i]);
			}
			
			
			//4.执行操作
			ps.execute();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			
			//5.关闭资源
			JDBCUtil.closeConn(ps, connection);
		}
		
		
		
	}
}

4.查询(最难)

在查询中如果数据库字段名和java类中属性名不一致,就在sql语句中起别名,然后在后面操作中
// 不获取列名获取列别名,不用rsmd.getColumnName(i+1)(获取列名)
String columnName = rsmd.getColumnLabel(i + 1); // 最好不管有没有不同都用这个

package cn.edu.hbue.wmp;

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

import com.mysql.cj.jdbc.result.ResultSetMetaData;
import com.mysql.cj.result.Field;

public class GeneralJDBCQuery {

	public static void main(String[] args) {
	
		String sql = "select id,name,email from student where id = ?";
		Student stu = query(sql,12);
		System.out.println(stu);
		
}
	
	public static Student query(String sql,Object...args){
		
		Connection connection = null;
		ResultSet rs = null;
		PreparedStatement ps = null;
		
		//1获取连接
		connection = JDBCUtil.getConn();
		
		
	
		
		
			try {

				//2预编译SQL语句
				ps = connection.prepareStatement(sql);
				
				
				// 3.填充占位符
				for(int i = 0;i<args.length;i++){
					ps.setObject(i+1, args[i]);
				}
				

				//4.执行executeQuery(),得到结果集:ResultSet
				rs = ps.executeQuery();
				

				// 5.得到结果集的元数据:ResultSetMetaData
				ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();
				

				// 6.1通过ResultSetMetaData得到columnCount,columnLabel;通过ResultSet得到列值
				//不知道要查询多少列,列数在结果集元数据有
				int columnCount = rsmd.getColumnCount();
				
				if(rs.next()){
					
					Student stu = new Student();   //先造对象,之后通过查询到的设置其value
					
					for(int i = 0;i<columnCount;i++){
						
						Object columnVal = rs.getObject(i + 1); //获取到了值但不知道是哪一列
						
						// 获取列的别名:列的别名,使用类的属性名充当
						String columnName = rsmd.getColumnLabel(i + 1); 
						
						// 6.2使用反射,给对象的相应属性赋值
						//将columnVal名字的属性赋值columnName
						java.lang.reflect.Field field = Student.class.getDeclaredField(columnName);
						field.setAccessible(true);
						field.set(stu, columnVal);
						
						
					}
					
					return stu;
				}
			} 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 (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				
				JDBCUtil.closeConn(rs, ps, connection);
				
			}
	
		return null;
		
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,出现"Cannot invoke "java.sql.Connection.prepareStatement(String)" because "com.crud.BookManage.conn" is null"的错误是因为"conn"对象为空,无法调用prepareStatement方法。这通常是由于未正确初始化或连接数据库导致的。要解决这个问题,你可以按照以下步骤进行操作: 1. 确保已正确初始化数据库连接对象"conn"。检查代码中是否存在连接数据库的代码,并确保连接对象已正确创建和赋值。 2. 检查数据库连接是否成功。可以尝试使用其他方法来验证数据库连接是否正常,例如执行简单的查询语句或打印连接对象的状态。 3. 检查数据库驱动程序是否正确加载。如果使用的是MySQL数据库,确保已正确导入并加载了MySQL的JDBC驱动程序。可以通过检查类路径或查看错误日志来确认驱动程序是否正确加载。 4. 检查数据库连接字符串是否正确。确保连接字符串中包含正确的数据库名称、用户名和密码,并且与数据库服务器的配置相匹配。 5. 检查数据库服务器是否正常运行。确保数据库服务器已启动并且可以正常访问。可以尝试使用其他数据库客户端工具连接数据库来验证服务器的可用性。 如果以上步骤都没有解决问题,可能需要进一步检查代码逻辑和错误日志以获取更多详细信息。请注意,以上步骤仅提供了一般性的解决方案,具体的解决方法可能因实际情况而异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值