jsp学习(七.JDBC(1))

JDBC的常用方法

JDBC是一个java处理mysql的一个方法库和驱动

链接JDBC

使用可以获取连接

Connection connection = DriverManager.getConnection(urlString,user,password);

urlString的格式为(注意引号和问号):
192.168.101.121:服务器地址
3306:端口
database:链接的数据库

jdbc:mysql://192.168.101.121:3306/"+database+"?useSSL=false&serverTimezone=CST&characterEncoding=utf-8

useSSL=false&serverTimezone=CST&characterEncoding=utf-8为传递的属性,字面意思能理解

获取mysql对象

链接获取好后要获取mysql对象Statement (声明的意思)

Statement sql = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

一般createStatement()无参就行,里面的参数下面会提

查询(是否为立即执行,和游标的移动)

执行查询
executeQuery(执行查询的意思)

ResultSet rSet = sql.executeQuery("select * from "+tableName);

执行查询就不能进行增删等操作,如果进行增删需要使用executeUpdate()

sql.executeUpdate("update tb_user set score = 59 where id = 5;");

当然execute()都能执行

获取到的资源会存到一个ResultSet 中

遍历ResultSet :
i是第几列的元素(从1开始)
rSet.next()会将游标移到下一行(什么是游标-下面)

while (rSet.next()) {
	System.out.print(rSet.getString(i));
}

游标:
理解成一个卡子,初始状态卡在第一行的前面,每个rSet.next()会将卡子移到下一行
,每次rSet.getString(i)获取的都是卡子所在(刚经过)一行的第i列的元素

如果我们在上面createStatement()时没有参数,那么游标就只能下移动(不太确定,不过不重要)
下面是createStatement的用法
createStatement(int type, int concurrency)

type的取值决定滚动的方式:
在这里插入图片描述

Concurrency取值觉得是否可以用结果集更新数据(防止只查询却更改了数据库的误操作)
在这里插入图片描述

滚动查询经常用到ResultSet的下述方法
在这里插入图片描述

获取行数

rSet.last();
int row = rSet.getRow();

getRow()会记录游标上面的行

预处理语句

就是把mysql命令提前翻译成mysql的底层指令传给mysql数据库软件,加快执行速度

PreparedStatement pre = con.prepareStatement(String sql)
pre.execute()//执行sql

通配符

直接举例子:
?我们可以使用
pre.setFloat(1,65)
进行赋值,1是第一个?的意思,65为值

pre = con.prepareStatment("select * from >booklist where price  < ?")
pre.setFloat(1,65)
pre.execute()//执行sql

另外有setDate,setDouble等不同设置类型

事务

还是举个例子,比如我转账,大体有两个步骤:1.我扣钱 2.他收钱。不能我扣钱执行成功了,二他收钱就失败了。如果他失败了我们就要把我扣钱的步骤给撤回。

实现的原理:关闭自动提交模式,让结果集reSult就算是执行了execute()也不会立马提交到mysql数据库
关闭自动提交:con.setAutoCommit(false);
开启自动提交:con.setAutoCommit(true);

例如:

con.setAutoCommit(false);
sql.executeUpdate("update tb_user set score = 59 where id = 5;");
sql.executeUpdate("update tb_user set score = 59 where id = 6;");
con.setAutoCommit(true);

只有当con.setAutoCommit(true);时才会真正执行

分页显示

下面这个例子就是分页显示的例子,我们需要用到几个方法:

ResultSetMetaData rsmData = (ResultSetMetaData) rSet.getMetaData();
int columnCount = rsmData.getColumnCount();
rsmData.getColumnName(1+i);

Result的getMetaData方法可以获得一个ResultSetMetaData,ResultSetMetaData可以使用getColumnCount获得mysql的列数
getColumnName(i)可以获得第i列的名字

例子

在前面我们已经知道了MVC模式,下面时使用MVC模式的一个数据库链接例子
在这里插入图片描述
在这里插入图片描述

结构:
input.jsp为登录界面
show.jsp为展示界面
jdbc_Servlet.java为处理程序
Record_bean为对象数据bean
在这里插入图片描述
input.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
<style type="text/css">


	.bg {
		
		width: 300px;
		height: 255px;
		margin: 200px auto;
		background-color: gray;
	}
</style>
</head>
<body>
	<div class="bg">
	<form action="servlet" method="post">
		<table>
			<tr><td>数据库:</td><td><input type="text" name="database"></td></tr>
			<tr><td>表名:</td><td><input type="text" name="tableName"></td></tr>
			<tr><td>用户名:</td><td><input type="text" name="user"></td></tr>
			<tr><td>密码:</td><td><input type="text" name="password"></td></tr>
			<tr><td><input type="submit" value="提交"></td></tr>
		</table>
		</form>
	</div>
</body>
</html>

show.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<jsp:useBean id="recordBean" class="com.ljq.Record_bean" scope="session"/>
<!-- 通过表单的参数设置bean -->
<jsp:setProperty name="recordBean" property="pageSize" param="pageSize"/>
<jsp:setProperty name="recordBean" property="currentPage" param="currentPage"/>
<body>
	<table border=2>
		<% 
			
			String [][] table = recordBean.getTableRecord();
			String [] columnName = recordBean.getColumnName();
			if (table == null || columnName == null){
				out.print("没有记录");
				return;
			}
			out.print("<tr>");
				for (int i = 0; i < columnName.length; i++){
					out.print("<th>"+columnName[i]+"</th>");
				}
			out.print("</tr>");
			int CurrentPage = recordBean.getCurrentPage();
			int totalRecord = table.length;
			int pageSize = recordBean.getPageSize();
			int totalPage = recordBean.getTotalPage();
			if (totalRecord % pageSize == 0){
				totalPage = totalRecord / pageSize;
			}
			else {
				totalPage = totalRecord / pageSize + 1;
			}
			recordBean.setTotalPage(totalPage);
			if (CurrentPage < 0){
				recordBean.setCurrentPage(recordBean.getTotalPage());
				CurrentPage = recordBean.getTotalPage();
			}
			else if (CurrentPage > recordBean.getTotalPage()){
				recordBean.setCurrentPage(1);
				CurrentPage = 1;
			}
			int start = (recordBean.getCurrentPage() - 1) * pageSize;
			for (int i = start; i < pageSize + start; i++){
				if (i == recordBean.getTotalRecord()){
					break;
				}
				out.print("<tr>");
					for (int j = 0; j < recordBean.getColumnName().length; j++){
						out.print("<td>"+table[i][j]+"</td>");
					}
				out.print("</tr>");
			}
		%>
	</table>
</body>
</html>

jdbc_Servlet.java

package com.ljq;

public class Record_bean {

	String []columnName=null;
	String [][] tableRecord = null;
	int pageSize = 3;
	int totalPage = 1;
	int currentPage = 1;
	int totalRecord = 0;
	public String[] getColumnName() {
		return columnName;
	}
	public void setColumnName(String[] columnName) {
		this.columnName = columnName;
	}
	public String[][] getTableRecord() {
		return tableRecord;
	}
	public void setTableRecord(String[][] tableRecord) {
		this.tableRecord = tableRecord;
	}
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getTotalPage() {
		return totalPage;
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public int getTotalRecord() {
		return totalRecord;
	}
	public void setTotalRecord(int totalRecord) {
		this.totalRecord = totalRecord;
	}
	

}

Record_bean.java

package com.ljq;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.catalina.User;
import org.omg.CORBA.PUBLIC_MEMBER;

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

public class jdbc_Servlet extends HttpServlet{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	}
	
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		String user = req.getParameter("user");
		String password = req.getParameter("password");
		String database = req.getParameter("database");
		String tableName = req.getParameter("tableName");
		if (user.length() == 0 || password.length() == 0 || database.length() == 0 || tableName.length() == 0) {
			resp.sendRedirect("input.jsp");
			return;
		}
		
		Connection connection;
		Statement sql;
		HttpSession session = req.getSession(true);
		Record_bean record_bean = new Record_bean();
		String urlString = "jdbc:mysql://192.168.101.121:3306/"+database+"?useSSL=false&serverTimezone=CST&characterEncoding=utf-8";
		try {
			connection = DriverManager.getConnection(urlString,user,password);
			sql = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
			ResultSet rSet = sql.executeQuery("select * from "+tableName);
			ResultSetMetaData rsmData = (ResultSetMetaData) rSet.getMetaData();
			int columnCount = rsmData.getColumnCount();
			String []columnName = new String[columnCount];
			for (int i = 0; i < columnCount; i++) {
				columnName[i] = rsmData.getColumnName(1+i);
			}
			record_bean.setColumnName(columnName);
			rSet.last();
			int row = rSet.getRow();
			String [][] tableRecordStrings = new String[row][columnCount];
			rSet.beforeFirst();
			int j = 0;
			while (rSet.next()) {
				for (int i = 0; i < columnCount; i++) {
					tableRecordStrings[j][i] = rSet.getString(i+1);
				}
				j++;
			}
			record_bean.setTotalRecord(j);
			record_bean.setTableRecord(tableRecordStrings);
			session.setAttribute("recordBean", record_bean);
			connection.close();
			resp.sendRedirect("show.jsp");
			
		} catch (Exception e) {
			// TODO: handle exception
			resp.getWriter().print("<h2>"+e);
			System.out.println(e);
		}
		
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req, resp);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I Am Rex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值