java之实现增删改查的下案例、获取元数据、DBUtils

***数据库操作接口

package dao;

import java.util.List;

import entity.User;

/**
 * @author HaokeMaster
 *操作数据库接口
 */
public interface UserDAO {
    public List<User> findAll()throws Exception;//查询所用用户的信息
	public void delete(int id)throws Exception;//删除用户信息
	public void save(User e)throws Exception;//增加保存用户信息
	public void update(User e)throws Exception;//更新一个用户的信息
	public User findById(int id)throws Exception;//一条记录
public void getData(String tablename)throws Exception;//获取数据库的源数据
public void getPage(int pageSize,int page)throws Exception;//分页查询,page是第几页,pageSize是每页的记录数量
}

***数据库操作实现:

package dao.impls;

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

import com.mysql.cj.jdbc.DatabaseMetaData;
import com.mysql.cj.jdbc.result.ResultSetMetaData;
import com.mysql.cj.protocol.x.ResultMessageListener;

import dao.UserDAO;
import entity.User;
import util.DBUtil;

public class UserDAOone implements UserDAO {

	// 添加
	@Override
	public void save(User e) throws Exception {
		Connection conn = DBUtil.getConnection();
		//使用Statement,sql语句在执行的时候传递;使用PreparedStatement,sql语句在生成语句对象的时候传递
		PreparedStatement prep = conn
				.prepareStatement("insert into " + "PEOPLE(id,name,age,phoneNum) " + "values(null,?,?,?)");
		prep.setString(1, e.getName());//1,2,3表示的是第一第二第三个参数
		prep.setInt(2, e.getAge());
		prep.setString(3, e.getPhoneNum());
		prep.executeUpdate();
		DBUtil.close(conn);
	}

	// 根据id删除
	@Override
	public void delete(int id) throws Exception {
		Connection conn = DBUtil.getConnection();
		PreparedStatement prep = conn.prepareStatement("delete from PEOPLE where id=?");//预编译语句对象
		prep.setLong(1, id);
		prep.executeUpdate();
		DBUtil.close(conn);
	}

	// 更新
	@Override
	public void update(User e) throws Exception {
		Connection conn = DBUtil.getConnection();
		PreparedStatement prep = conn
				.prepareStatement("update PEOPLE " + "set name=?,age=?,phoneNum=? " + "where id=?");
		prep.setString(1, e.getName());
		prep.setInt(2, e.getAge());
		prep.setString(3, e.getPhoneNum());
		prep.setInt(4, e.getId());
		prep.executeUpdate();
		DBUtil.close(conn);
	}

//根据id查询一条记录
	@Override
	public User findById(int id) throws Exception {
		Connection conn = DBUtil.getConnection();
		PreparedStatement prep = conn.prepareStatement("select * " + "from PEOPLE where id=?");
		prep.setInt(1, id);
		ResultSet rs = prep.executeQuery();
		User e = null;
		if (rs.next()) {
			e = new User();
			e.setName(rs.getString("name"));
			e.setId(rs.getInt("id"));
			e.setAge(rs.getInt("age"));
			e.setPhoneNum(rs.getString("phoneNum"));
		}
		DBUtil.close(conn);
		return e;
	}

	// 查询所有
	@Override
	public List<User> findAll() throws Exception {
		Connection conn = DBUtil.getConnection();
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("select * from PEOPLE");
		List<User> users = new ArrayList<User>();
		while (rs.next()) {
			User e = new User();
			e.setName(rs.getString("name"));
			e.setId(rs.getInt("id"));
			e.setAge(rs.getInt("age"));
			e.setPhoneNum(rs.getString("phoneNum"));
			users.add(e);
		}

		DBUtil.close(conn);
		return users;
	}

	//获取数据库的元数据
	public void getData(String tablename)throws Exception{
		String sql="select *from " + tablename;
		Connection conn = DBUtil.getConnection();
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		try {
			//获取数据库的元数据
			 DatabaseMetaData dmd=(DatabaseMetaData) conn.getMetaData();
			 //数据库名
			 String dbname=dmd.getDatabaseProductName();
			 //数据库的版本号
			 int version=dmd.getDatabaseMajorVersion();
			 //数据库的连接地址
			 String url=dmd.getURL();
			//数据库用户名
			 dmd.getUserName();
			 
			 //获取结果集元数据
			 ResultSetMetaData rsmd=(ResultSetMetaData) rs.getMetaData();
			 //获取列数
			 int colCount=rsmd.getColumnCount();
			 //获取第i列的字段名,jdbc中字段的序号从1开始;
			String colname= rsmd.getColumnName(1);
			
			 
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	//分页查询,page是第几页,pageSize是每页的记录数量
	public void getPage(int pageSize,int page)throws Exception{
		int begin =(page-1)*pageSize+1;// 记录的起点
		String sql="select *from PEOPLE";
		Connection conn = DBUtil.getConnection();
		Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//第一个参数是表示可滚动的结果集,可以跳步;第二个参数设置并发性其他用户只读
		ResultSet rs = stmt.executeQuery(sql);
		//指针定位到绝对位置,第三条记录
		rs.absolute(3);
		//定位到相对位置,相对于上一个的位置基础上加5.到第8条记录
		rs.relative(5);
		 //下一条,第9条记录
		rs.next();
		//前一条,第8条记录
		rs.previous();
	
		
		
		
	}

}

****实体类:

package entity;

/**
 * @author HaokeMaster 实体类
 */
public class User {
	private int id;
	private String name;
	private int  age;
    private String phoneNum;
	
	public String getPhoneNum() {
		return phoneNum;
	}

	public void setPhoneNum(String phoneNum) {
		this.phoneNum = phoneNum;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int  getAge() {
		return age;
	}

	public void setAge(int  age) {
		this.age = age;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}

	



}

****配置文件工具类:

package util;

import java.io.InputStream;
import java.util.Properties;

/**
 * @author HaokeMaster
 *配置文件读取的工具
 *使用:ConfigUtil.getPropertiesParam("mysqlUse.properties");
 *String url=	ConfigUtil.getValue("url");
 */
public class ConfigUtil {
private static	Properties propes=new Properties();
//static代码块: static{}
//static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,
//它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,
//JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次

	//获取属性文件中的内容
		public static  void getPropertiesParam(String filename) {
			//***方法1。在classpath的目录下(即在src的目录下)用getclassload方法获取
		ClassLoader loader=ConfigUtil.class.getClassLoader();//获取类加载器
			try {
				InputStream fis = loader.getResourceAsStream(filename);  
				//加载输入流指定的文件
				propes.load(fis);

			}catch (Exception e) {
	
			}
		
		}
		//获取配置文件中的键值,key是配置文件中的键
		public static String getValue(String key) {
			return propes.getProperty(key);
			
		}
		
		
}

*****数据库连接和关闭工具类:

package util;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author HaokeMaster 数据连接和关闭的工具类
 * commmand +shift+o 自动导包
 */
public class DBUtil {
	private static String url;
	private static String dbUser;
	private static String dbPassword;
	
//获取属性文件中的内容
	public static  void getPropertiesParam(String filename) {
//		//***方法1。在classpath的目录下(即在src的目录下)用getclassload方法获取
//		Properties propes=new Properties();
//		try {
//			InputStream fis = DBUtil.class.getClassLoader().getResourceAsStream(filename);  
//			//加载输入流指定的文件
//			propes.load(fis);
//			//获取文件中对应的键的值
//			url=propes.getProperty("url");
//			dbUser=propes.getProperty("dbUser");
//			dbPassword=propes.getProperty("dbPassword");
//			
//			System.out.println(url);
//		}catch (Exception e) {
//
//		}
		
		//*****方法2.不在classpath的目录下(即不在src的目录下),必须使用完整路径
		Properties propes=new Properties();
		File file=new File(filename);
		try {
			FileInputStream fis=new FileInputStream(file);
			//加载输入流指定的文件
			propes.load(fis);
			//获取文件中对应的键的值
			url=propes.getProperty("url");
			dbUser=propes.getProperty("dbUser");
			dbPassword=propes.getProperty("dbPassword");
			
			System.out.println(url);
		}catch (Exception e) {
			
		}
	}
	
	// 建立数据库连接
	public static Connection getConnection() throws Exception {
		
		DBUtil.getPropertiesParam("/Users/HaokeMaster/Desktop/javatest01/First/src/mysqlUse.properties");//对应上面的方法2;不在classpath的目录下(即在src的目录下),这个必须是完整路径
//		DBUtil.getPropertiesParam("mysqlUse.properties");//对应上面的方法1;在classpath的目录下(即在src的目录下),直接写文件名加后缀
		Connection conn = null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");// 加载MYSQL JDBC驱动程序
//			 conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/firstDB", "root",
//					"1234567890");// 连接URL为 jdbc:mysql//服务器地址:端口号/数据库名 ,后面的2个参数分别是登陆用户名和密码
			conn = DriverManager.getConnection(url, dbUser,
					dbPassword);
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
		return conn;
	}

	// 关闭数据库连接
	public static void close(Connection conn){
		if(conn!=null){
		    try {
		    conn.close();
		   } catch (SQLException e) { 
			e.printStackTrace();
		   } 
		}
		
	}

	// 用于测试 DBUtil
	public static void main(String[] args) throws Exception {
		System.out.println(getConnection());
	}
}

******工厂类:

package util;

import dao.impls.UserDAOone;

/**
 * @author HaokeMaster
 *工厂方法
 */
public class DAOFactory {
	public static Object getInstance(String type){ 
	Object obj = null;
	if(type.equals("UserDAOone")){
	obj = new UserDAOone();
	}
	return obj; 
	}
}

****添加用户Servlet:

package web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.impls.UserDAOone;
import entity.User;

/**
 * Servlet implementation class AddUserServlet
 * 添加用户
 */
@WebServlet("/AddUserServlet")
public class AddUserServlet extends HttpServlet {
	public void service(
			HttpServletRequest request, HttpServletResponse response)
			throws ServletException,IOException{
			//这行代码要放在 getParameter()执行前。
		request.setCharacterEncoding("utf-8");
			String name = request.getParameter("name"); 
			int age = Integer.parseInt(request.getParameter("age"));
	        String phoneN = request.getParameter("phoneNum");
	        System.out.println("姓名"+name+","+"年龄"+name+"手机号码"+phoneN);
			try {
			UserDAOone dao =
			new UserDAOone(); 
			User e = new User();
			e.setName(name);
			e.setAge(age);
			e.setPhoneNum(phoneN);
			// 添加用户
			dao.save(e);
		System.out.println(e);
			//重定向到list,是get请求
			response.sendRedirect("list");
			} catch (Exception e) {
			//step1 先记录日志
			e.printStackTrace();
			//step2 抛出
			throw new ServletException(e);
			}
			}
}

*****删除用户Servlet:

package web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.impls.UserDAOone;

/**
 * Servlet implementation class DeleteUserServlet
 * 删除
 */
@WebServlet("/DeleteUserServlet")
public class DeleteUserServlet extends HttpServlet {
	public void service( HttpServletRequest request,
			HttpServletResponse response) throws ServletException,IOException{

		int id =Integer.parseInt( request.getParameter("id")); 
			try {
			UserDAOone dao =
			new UserDAOone();
			// 删除指定id的用户
			dao.delete(id);
			//重定向到用户列表
			response.sendRedirect("list"); 
			}catch(Exception e){
			e.printStackTrace();
			throw new ServletException(e);
			} 
			}

}

****修改用户Servlet:

package web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.impls.UserDAOone;
import entity.User;

/**
 * Servlet implementation class ModifyUserServlet
 * 修改用户信息
 */
@WebServlet("/ModifyUserServlet")
public class ModifyUserServlet extends HttpServlet {
	public void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException,IOException{
		request.setCharacterEncoding("utf-8");//设置浏览器或app发过来的参数时的编码方式
		int id =Integer.parseInt( request.getParameter("id"));//客户端发过来的参数都是字符串
		String name = request.getParameter("name");
		int age = Integer.parseInt( request.getParameter("age"));
		String phoneN=request.getParameter("phoneNum");
		try {
		UserDAOone dao =
		 new UserDAOone();
		User e = new User(); 
		e.setId(id);
		e.setName(name); 
		e.setAge(age); 
		e.setPhoneNum(phoneN);
		//更新用户信息
		dao.update(e);
		// 重定向到用户列表
		response.sendRedirect("list");
		}catch(Exception e){
		e.printStackTrace();
		 
		throw new ServletException(e); }
		}

}

****用户列表Servlet:

package web;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.impls.UserDAOone;
import entity.User;
import util.DAOFactory;

/**
 * Servlet implementation class ListUserServlet
 * 查看用户列表
 */
@WebServlet("/ListUserServlet")
public class ListUserServlet extends HttpServlet {
	public void service(HttpServletRequest request,
			HttpServletResponse response)
			throws ServletException,IOException{ //使用 dao 访问数据库
			try {
			UserDAOone dao = (UserDAOone) DAOFactory .getInstance("UserDAOone");
			List<User> users =
			dao.findAll(); //使用查询得到的结果,生成一个表格
			response.setContentType("text/ html;charset=utf-8");
			PrintWriter out = response.getWriter();
			out.println(
			"<table border='1' width='60%' " + "cellpadding='0' cellspacing='0'>");
			out.println("<tr><td>id</td>" +
			"<td>姓名</td>" +
			"<td>薪水</td>" + "<td>年龄</td>" +
			"<td>操作</td></tr>"); 
			for(int i=0;i<users.size();i++){
			User e = users.get(i);
			out.println( "<tr><td>"
			 + e.getId() + "</td><td> "
			+ e.getName() + "</td><td>" + e.getAge() + "</td><td> " + e.getPhoneNum() + "</td><td>" + "<a href='delete?id="
			+ e.getId() + "'>删除</a>" + "&nbsp;<a href='load?id="
			+ e.getId() +"'>修改" + "</a></td></tr>");
			 }
			out.println( "</table>");
			out.println("<a href='index.jsp'>" + "增加新雇员</a>"); 
			out.close();
			} catch (Exception e) {
			e.printStackTrace();
			throw new ServletException(e); 
			}
			}
}

***修改用户信息Servlet:

package web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.impls.UserDAOone;
import entity.User;

/**
 * Servlet implementation class LoadEmptyUserServlet
 * 修改页用户信息的页面,从LisUserServlet.java 中的修改按钮来。
 */
@WebServlet("/LoadEmptyUserServlet")
public class LoadEmptyUserServlet extends HttpServlet {
	public void service(
			HttpServletRequest request,
			HttpServletResponse response) throws ServletException,IOException{
			 
			int id =Integer.parseInt( request.getParameter("id"));
			try {
			UserDAOone dao =
			new UserDAOone();
			User e = dao.findById(id);
			response.setContentType("text/html;charset=utf-8");
			PrintWriter out = response.getWriter();
			out.println(
			"<form action='modify?id="
			+ id + "' method='post'>"); out.println(
			"id:" + id + "<br/>");
			out.println(
					"姓名:<input name='name' value='" + e.getName() + "'/><br/>");
					out.println(
					"年龄:<input name='age' value='"
					+ e.getAge() + "'/><br/>"); out.println(
					"手机号:<input name='phoneNum' value='"
					+ e.getPhoneNum() + "'/><br/>"); out.println(
					"<input type='submit' " +
					"value='确认'/>"); out.println( "</form>");
					out.close();
					 }catch(Exception e){ e.printStackTrace();
					throw new ServletException(e); }
					}

}

******配置文件mysqlUse.properties:

url=jdbc:mysql://127.0.0.1:3306/firstDB
dbUser=root
dbPassword=1234567890

虚拟主机在tomcat中的server.xml中配置

******元数据:数据库中表,列、库的定义信息。
DataBaseMetaData数据库元数据、
ParameterMetaData参数元数据:主要获取sql语句中?占位符的信息;注意:在获取参数类型时会产生异常,解决:在url后面添加参数generateSimpleParameterMetada=true;;
ReseultSetMetaData结果集元数

//获取数据库的元数据
    public void getData(String tablename)throws Exception{
        String sql="select *from " + tablename;
        Connection conn = DBUtil.getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        try {
            //获取数据库的元数据
             DatabaseMetaData dmd=(DatabaseMetaData) conn.getMetaData();
             //数据库名
             String dbname=dmd.getDatabaseProductName();
             //数据库的版本号
             int version=dmd.getDatabaseMajorVersion();
             //数据库的连接地址
             String url=dmd.getURL();
            //数据库用户名
             dmd.getUserName();
             
             //获取结果集元数据
             ResultSetMetaData rsmd=(ResultSetMetaData) rs.getMetaData();
             //获取列数
             int colCount=rsmd.getColumnCount();
             //获取第i列的字段名,jdbc中字段的序号从1开始;
            String colname= rsmd.getColumnName(1);
            
             
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

***DBUtils:jdbc封装工具;是apache的工具,需要导入jar包comons-dbutils.jar;
DBUtils中:
**QueryRunner是框架的核心类,所有数据库的操作丢必须通过queryRunner进行;
query用于执行select语句,update用于执行insert,update,delete;batch批处理;
QueryRunner在创建的时候没有传递Datasource参数,使用的query,update,insert的时候要传递参数,这时是手动事务;
QueryRunner在创建的时候传递Datasource参数,使用的query,update,insert的时候不需要传递参数,这时是自动事务;;
**ResultSetHandler:结果集封装接口,将ResultSet封装为一个java对象;一个可以封装成单个对象,也可封装成list集合。
ResultSetHandler的九个实现类:
*ArrayHandler:将结果集第一条记录封装到Objct数组中,数组中的每一个元素是字段值;
*ArrayListHandler:将结果集每一条记录放到一个数组,然后把所有数组放到list集合中;
*ColumnListHandler:将结果集中指定列封装到list集合;
KedHandler;每一条记录封装到Map中,key是字段的名,value是记录map的封装;
MapHandler:将结果集中第一条记录封装到Map集合中,key是字段名,value是字段值;
MapListHandler;
*BeanHandler:将结果集中的第一条记录直接封装成javaBean;
*BeanListHandler:
*ScalarHandler:单值查询封装。

**Dbutils工具类提供驱动管理,事务管理,释放资源等;

使用案例:https://www.cnblogs.com/wangrongchen/p/9303502.html

猜你喜欢

转载自blog.csdn.net/u011146511/article/details/87783475