JDBC连接数据库(适当的封装查询、新增修改删除)的方法改进

7 篇文章 0 订阅
7 篇文章 0 订阅
package com.connection.ConnCommit;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;

/**
 * 
 * @Detail :JDBC连接数据库
 * @Author: 韩庆
 * @E-mail: IsaidIwillgoon@gmail.com
 * @Date: 2012-11-12
 * @Time: 下午10:32:31
 * 
 */
public class JDBCConnCommit {

	private static String url = "jdbc:mysql://localhost:3306/nms";
	private static String user = "root";
	private static String password = "root";

	public Connection getConnection() {
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, user, password);

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.out.println("类未发现异常...");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("SQL异常....");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("出现异常:" + e.getMessage());
		}
		return conn;
	}

	/**
	 * 执行查询操作
	 * 
	 * @param conn
	 *            数据库连接
	 * @param sql
	 *            需要执行的sql语句
	 * @throws Exception
	 */
	public void createSQLQuery(Connection conn, String sql) throws Exception {
		Statement stmt = null;
		ResultSet rs = null;
		Map map = new HashMap();//可获得执行查询后的map数据
		try {
			if (null == conn) {
				throw new Exception("连接为空!请检查数据库连接!");
			}
			if (null == sql || "".equals(sql)) {
				throw new Exception("sql语句为空!");
			}
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			ResultSetMetaData rsmd = rs.getMetaData();
			// 用于得到字段个数
			int cCount = rsmd.getColumnCount();
			// 遍历每条数据 内部根据个人需求可做相应的处理
			while (rs.next()) {
				for (int i = 0; i < cCount; i++) {
					// 新知识-------改进部分
					String columnName = rsmd.getCatalogName((i+1)).toLowerCase();
					int sqlType = rsmd.getColumnType(i+1);
					Object sqlView = rs.getObject(columnName);
					switch (sqlType) {
					case Types.CHAR:
						map.put(columnName, sqlView.toString().trim());
						break;
					case Types.NUMERIC:
						if (null == sqlView) {
							sqlView = "";
						}
						map.put(columnName, sqlView.toString());
						break;
					default:
						map.put(columnName, sqlView != null ? sqlView.toString()
								: "");
						break;
					}
					
				}
			}

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (null != rs) {
				rs.close();
			}
			if (null != stmt) {
				stmt.close();
			}
			/*
			 * if (null != null) { conn.close();
			 * }//如果单纯的使用一次的话,则连接可以关闭createSQLExecute方法中也是
			 */
		}

	}

	/**
	 * 执行sql的添加、修改、删除操作
	 * 
	 * @param conn
	 * @param sql
	 */
	public void createSQLExecute(Connection conn, String sql) {
		// 有关conn和sql为空的问题,处理同上,省略。。。
		Statement stmt = null;
		try {
			stmt = conn.createStatement();
			int i = stmt.executeUpdate(sql);
			if (i > 0) {
				System.out.println("处理成功!处理条数为" + i);
			} else {
				System.out.println("处理有误!");
			}
		} catch (Exception e) {
			// 应该异常分类处理,这里省略
		} finally {
			try {
				if (null != stmt) {
					stmt.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}

		}
	}

	/**
	 * 测试样例
	 */
	public void exampleDome() {
		JDBCConnCommit jdbcCc = new JDBCConnCommit();
		Connection conn = jdbcCc.getConnection();// 得到连接
		try {
			conn.setAutoCommit(false);// 不自动提交事务
			String queryString = "";// 声明sql语句
			// 测试添加
			queryString = "insert into Table_Name(name,sex,age) values('hank','male',22)";
			jdbcCc.createSQLExecute(conn, queryString);
			// 测试查询
			queryString = "select * from Table_Name where name like '%韩%'";
			jdbcCc.createSQLQuery(conn, queryString);
			// 测试删除
			queryString = "delete from Table_Name where name='hank'";
			jdbcCc.createSQLExecute(conn, queryString);

			conn.commit();// 正常处理完后 提交事务
		} catch (SQLException e) {
			// ...
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != conn) {
					conn.close();// 关闭连接
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

}

//就昨日封装做一点点改进,3Q 永泰~~~~~

仅上述查询方法而言:因为用到别处,所以要给个返回值的。

因而做进一步更改:

 /**
	 * 执行查询操作
	 * 
	 * @param conn
	 *            数据库连接
	 * @param sql
	 *            需要执行的sql语句
	 * @throws Exception
	 */
	public Map createSQLQuery(Connection conn, String sql) throws Exception {
		Statement stmt = null;
		ResultSet rs = null;
		HashMap map = null;//可获得执行查询后的map数据
		try {
			if (null == conn) {
				throw new Exception("连接为空!请检查数据库连接!");
			}
			if (null == sql || "".equals(sql)) {
				throw new Exception("sql语句为空!");
			}
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			ResultSetMetaData rsmd = rs.getMetaData();
			// 用于得到字段个数
			int cCount = rsmd.getColumnCount();
			map = new HashMap();
			// 遍历每条数据 内部根据个人需求可做相应的处理
			while (rs.next()) {
				for (int i = 0; i < cCount; i++) {
					// 新知识-------改进部分
					String columnName = rsmd.getCatalogName((i+1)).toLowerCase();
					int sqlType = rsmd.getColumnType(i+1);
					Object sqlView = rs.getObject(columnName);
					switch (sqlType) {
					case Types.CHAR:
						map.put(columnName, sqlView.toString().trim());
						break;
					case Types.NUMERIC:
						if (null == sqlView) {
							sqlView = "";
						}
						map.put(columnName, sqlView.toString());
						break;
					default:
						map.put(columnName, sqlView != null ? sqlView.toString()
								: "");
						break;
					}
					
				}
			}

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (null != rs) {
				rs.close();
			}
			if (null != stmt) {
				stmt.close();
			}
			/*
			 * if (null != null) { conn.close();
			 * }//如果单纯的使用一次的话,则连接可以关闭createSQLExecute方法中也是
			 */
			return map;
		}
	}

这样既可将查询出的所有数据以map格式返回给调用方法者。 以供做其他处理。

同理,新增、修改、删除均有返回值 如果执行正确则返回正整数,根据是否是正整数来判断是否执行成功。

//可拷贝,昨日已上传文件,做少许更改即可,故而今日不上传其资源了。






好的,我可以提供一个简单的实现步骤,供您参考: 1. 创建一个JavaWeb项目,可以使用Eclipse或其他IDE来创建。 2. 在项目中创建一个JavaBean类,用于定义学生信息的属性和对应的getter/setter方法。例如: ```java public class Student { private int id; private String sno; private String name; private String gender; private int age; private String phone; // getter/setter methods } ``` 3. 在项目中创建一个DAO类,用于连接数据库并实现对学生信息的增删改查操作。可以使用JDBC或其他ORM框架来实现。例如: ```java public class StudentDAO { // 数据库连接信息 private String url = "jdbc:mysql://localhost:3306/test"; private String username = "root"; private String password = "123456"; // 查询所有学生信息 public List<Student> findAll() { // TODO: 查询所有学生信息的SQL语句 String sql = "SELECT * FROM student"; // TODO: 连接数据库并执行SQL语句,返回学生信息列表 // ... } // 根据学生ID查询学生信息 public Student findById(int id) { // TODO: 根据学生ID查询学生信息的SQL语句 String sql = "SELECT * FROM student WHERE id = ?"; // TODO: 连接数据库并执行SQL语句,返回学生信息 // ... } // 新增学生信息 public int add(Student student) { // TODO: 新增学生信息的SQL语句 String sql = "INSERT INTO student (sno, name, gender, age, phone) VALUES (?, ?, ?, ?, ?)"; // TODO: 连接数据库并执行SQL语句,返回新增的学生ID // ... } // 修改学生信息 public int update(Student student) { // TODO: 修改学生信息的SQL语句 String sql = "UPDATE student SET sno = ?, name = ?, gender = ?, age = ?, phone = ? WHERE id = ?"; // TODO: 连接数据库并执行SQL语句,返回受影响的行数 // ... } // 删除学生信息 public int delete(int id) { // TODO: 删除学生信息的SQL语句 String sql = "DELETE FROM student WHERE id = ?"; // TODO: 连接数据库并执行SQL语句,返回受影响的行数 // ... } } ``` 4. 在项目中创建一个Servlet类,用于接收并处理Ajax请求。例如: ```java public class StudentServlet extends HttpServlet { private StudentDAO studentDAO = new StudentDAO(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取请求参数 String action = request.getParameter("action"); int id = Integer.parseInt(request.getParameter("id")); // 根据请求参数执行对应的操作 if ("findAll".equals(action)) { // 查询所有学生信息 List<Student> students = studentDAO.findAll(); // 将学生信息转换为JSON格式,并写入响应 response.setContentType("application/json;charset=utf-8"); PrintWriter out = response.getWriter(); out.write(JSON.toJSONString(students)); out.close(); } else if ("findById".equals(action)) { // 根据ID查询学生信息 Student student = studentDAO.findById(id); // 将学生信息转换为JSON格式,并写入响应 response.setContentType("application/json;charset=utf-8"); PrintWriter out = response.getWriter(); out.write(JSON.toJSONString(student)); out.close(); } else if ("add".equals(action)) { // 新增学生信息 // 获取请求参数 String sno = request.getParameter("sno"); String name = request.getParameter("name"); String gender = request.getParameter("gender"); int age = Integer.parseInt(request.getParameter("age")); String phone = request.getParameter("phone"); // 将请求参数封装为Student对象 Student student = new Student(); student.setSno(sno); student.setName(name); student.setGender(gender); student.setAge(age); student.setPhone(phone); // 执行新增操作 int newId = studentDAO.add(student); // 将新增的学生ID写入响应 response.setContentType("text/plain;charset=utf-8"); PrintWriter out = response.getWriter(); out.write(String.valueOf(newId)); out.close(); } else if ("update".equals(action)) { // 修改学生信息 // 获取请求参数 String sno = request.getParameter("sno"); String name = request.getParameter("name"); String gender = request.getParameter("gender"); int age = Integer.parseInt(request.getParameter("age")); String phone = request.getParameter("phone"); // 将请求参数封装为Student对象 Student student = new Student(); student.setId(id); student.setSno(sno); student.setName(name); student.setGender(gender); student.setAge(age); student.setPhone(phone); // 执行修改操作 int rows = studentDAO.update(student); // 将受影响的行数写入响应 response.setContentType("text/plain;charset=utf-8"); PrintWriter out = response.getWriter(); out.write(String.valueOf(rows)); out.close(); } else if ("delete".equals(action)) { // 删除学生信息 // 执行删除操作 int rows = studentDAO.delete(id); // 将受影响的行数写入响应 response.setContentType("text/plain;charset=utf-8"); PrintWriter out = response.getWriter(); out.write(String.valueOf(rows)); out.close(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ``` 5. 在前端页面中使用Ajax发送请求,并使用JavaScript处理返回结果。例如: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>学生信息管理</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script> $(function() { // 查询所有学生信息 $.get("StudentServlet?action=findAll", function(data) { // 处理返回的学生信息 // ... }); // 根据ID查询学生信息 $.get("StudentServlet?action=findById&id=1", function(data) { // 处理返回的学生信息 // ... }); // 新增学生信息 $.post("StudentServlet?action=add", { sno: "10001", name: "张三", gender: "男", age: 20, phone: "13800138000" }, function(data) { // 处理返回的新增学生ID // ... }); // 修改学生信息 $.post("StudentServlet?action=update&id=1", { sno: "10002", name: "李四", gender: "男", age: 21, phone: "13800138001" }, function(data) { // 处理返回的受影响的行数 // ... }); // 删除学生信息 $.post("StudentServlet?action=delete&id=1", function(data) { // 处理返回的受影响的行数 // ... }); }); </script> </head> <body> <!-- 页面内容 --> </body> </html> ``` 6. 最后,将项目部署到Tomcat等Web服务器上,就可以在浏览器中访问并操作学生信息了。 这只是一个简单的实现框架,具体的实现细节需要根据您的具体需求来进行设计和实现。如果您有其他问题或需要更详细的帮助,可以随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值