2019-12-14-JDBC以及动态菜单
时间格式转换
//当前时间及格式转换
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
//SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);
String[] split = dateString.split("-");
String date = split[0]+"年"+split[1]+"月"+split[2]+"日";
JDBC的使用
注册驱动
Class.forName("com.mysql.jdbc.Driver");//mysql数据库
//Class.forName("oracle.jdbc.driver.OracleDriver");//Oracle数据库
建立JDBC和数据库之间的connect的连接
Connection c = DriverManager.getConnection("jdbc:mysql://IP:port/exam?characterEncoding=UTF-8", "username", "password");
//Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","username","password");
创建statement或者preparestatement接口
Statement s = conn.createStatement();
String sql = "insert into t_courses values(null,"+"'数学')";
//在statement中使用字符串拼接的方式,这种方式存在诸多问题,后面说明
s.execute(sql);
处理和显示结果
ResultSet rs = s.executeQuery(sql);
释放资源
在JDBC编码的过程中我们创建了Connection、ResultSet等资源,这些资源在使用完毕进行关闭。
补充说明
PreparedStatement与 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接。
使用PreparedStatement时,他的SQL语句不再采用字符串拼接的方式,而是采用占位符的方式。“?”在这里就起到占位符的作用。这种方式除了避免了statement拼接字符串的繁琐之外,还能够提高性能。每次SQL语句都是一样的,数据库就不会再次编译,这样能够显著提高性能。
String sql = "update t_course set course_name =? where course_id=?";
后面需要用到PreparedStatement接口创建的pstmt的set方法给占位符进行赋值。注意一点,这里的参数索引是从1开始的。
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1, courseName); //利用Preparedstatement的set方法给占位符赋值
pstmt.setInt(2, courseId);
pstmt.executeUpdate();
动态菜单
动态菜单是什么
动态菜单即是实现动态权限的菜单管理,是根据不同的用户显示与之相对应的菜单,达到每个用户中的菜单中的内容不一定相同的效果。
动态菜单原理
将数据的角色权限放到数据库中,当一个用户访问菜单时,即刻从数据库中获取当前用户的所 对应的菜单选项。
例如,
数据库中有三张表如下:user(用户表),menu(菜单表),conn(关联表)
访问菜单时查询数据库,
step1,查询出该user,
step2,通过该user查询出conn中的所有可用的menu的id
step3,再通过该menu的id查询出所有menu作为结果集resultList
最后,将结果集resultList反馈给前端。因为每个用户的关联表中关联的内容不同,所以可 以实现不同用户显示不同的菜单选项。
demo
登录页面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<title>test</title>
</head>
<body>
<form action="/temp/loginServlet" method="post" id="myform">
用户名:<input type="text" name="username"/>
<br/>
密 码:<input type="password" name="password"/>
<br>
<input type="submit" value="登录">
<a href="#" id = "res">重置</a>
<br>
校验结果:<span><%=request.getAttribute("msg") %></span>
</form>
</body>
<script type="text/javascript">
document.getElementById("res").onclick = function() {
alert("已重置");
document.getElementById("myform").reset();
}
</script>
</html>
登录后的页面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@page import="bean.Menu"%>
<html>
<style>
.box {
background-color: #EEEEEE;
left: 5px;
top: 3px;
width: 99%;
height: 650px;
overflow: hidden;
overflow-x: hidden;
position: relative;
}
.box1,
.box2, {
/*盒子重叠放置,使用哪个盒子哪个盒子显示*/
background-color: #EEEEEE;
width: 100%;
height: 100%;
overflow: hidden;
overflow-x: hidden;
}
</style>
<head>
<title>test</title>
</head>
<body>
用户登录
<a href="login.jsp"><button>返回登录</button></a>
<br>
<table>
<tr>
<td>
<c:if test="${empty username }">
<a href="login.jsp">请登录</a>
</c:if>
<c:if test="${not empty username }">
用户 ${username } 登录成功
</c:if>
</td>
</tr>
<tr>
<td>登录时间:
<c:if test="${not empty date }">
${date }
</c:if>
</td>
</tr>
</table>
<hr> 功能菜单如下:
<hr>
<div style="float: left;width: 15%;top: 300px;">
<c:forEach items="${menuList }" var="p">
<div>
<br>
<span><a href="${p.URL }">${p.MENU_NAME }</a></span>
<%-- <c:if test="${not empty p.USABLE} ">
<span><a href="${p.URL }">${p.MENU_NAME }</a> 可用</span>
</c:if> --%>
</div>
</c:forEach>
</div>
<div style="float: right;width: 80%;top: 300px;">
<div class="box" id="box">
<div class="box1" id="box1">
<center>
<h1>内容1</h1>
</center>
</div>
<div class="box2" id="box2">
<h2>内容2</h2>
</div>
</div>
</div>
</body>
</html>
servlet
//第一部分
//servlet中doGet,其他部分未附
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置request格式
request.setCharacterEncoding("utf-8");
//接收参数
String username = request.getParameter("username");
String password = request.getParameter("password");
if (username==null||username =="") {
request.setAttribute("msg", "请输入用户名");
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
}
//根据username查询出user实体
UserDao userDao = new UserDao();
User user = userDao.findByUsername(username);
if (password.equals(user.getPassword())) {
//通过验证,更改登录状态flag为1
userDao.updateLoginFlag(1,username);
//更新登录时间
//当前时间及格式转换
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String dateString = formatter.format(currentTime);
System.out.println(dateString);
String[] split = dateString.split("-");
String date = split[0]+"年"+split[1]+"月"+split[2]+"日";
//向数据库中插入时间
userDao.updateLoginDate(date,username);
//根据用户向前端传递菜单实体
MenuDao menuDao = new MenuDao();
Menu menu = new Menu();
List<Menu> list= menuDao.getMenuBean(username);
System.out.println("list:--->>>"+list);
request.setAttribute("menuList", list);
//登录成功,响应前端
request.setAttribute("msg", "登录成功");
request.setAttribute("username", username);
request.setAttribute("date", date);
request.getRequestDispatcher("index.jsp").forward(request, response);
}
else {
request.setAttribute("msg", "请检查用户名或密码");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
//第二部分
//前面第一部分所需要调用的方法如下
public User findByUsername(String username) {
// 根据username查询出user
try {
//获得连接
Connection connection = getConnection();
//创建statement
Statement sql = connection.createStatement();
User user = new User();
ResultSet rs = sql.executeQuery("SELECT \"username\",\"password\" FROM \"temp\" WHERE \"username\" ="+username);
while (rs.next()) {
//结果存到user实体
System.out.println(rs.getString(1)+"--"+rs.getString(2));
user.setUsername(rs.getString(1));
user.setPassword(rs.getString(2));
}
sql.close();
connection.close();
return user;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void updateLoginFlag(Integer i, String username) {
// 更新登录状态
try {
Connection connection = getConnection();
Statement sql = connection.createStatement();
sql.executeUpdate("UPDATE \"temp\" SET \"flag\" = "+i+"WHERE \"username\" ="+username);
sql.close();
connection.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void updateLoginDate(String date,String username) {
// 更新登录时间
try {
Connection connection = getConnection();
Statement sql = connection.createStatement();
//UPDATE "temp" SET "Ltime" = 123456 WHERE "username" = 123
sql.executeUpdate("UPDATE \"temp\" SET \"Ltime\" = '"+date+"' WHERE \"username\" = " +username);
sql.close();
connection.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","user","password");
return connection;
}
//第三部分
//前面第一部分所需要调用的方法如下
public List<Menu> getMenuBean(String username) {
//根据userid
try {
//获得连接
Connection connection = getConnection();
//创建statement
Statement sql = connection.createStatement();
//拼接sql语句
String sqlString = "SELECT A.MENU_ID,A.MENU_NAME,A.URL,A.USABLE "
+ "FROM MENU A,\"temp\" B,MENU_USER C "
+ "WHERE C.USER_ID=B.\"username\" AND A.MENU_ID=C.MENU_ID AND B.\"username\"= "+username;
//执行查询
ResultSet rs = sql.executeQuery(sqlString);
List<Menu> list = new ArrayList<Menu>();
int i = 0;
while (rs.next()) {
Menu menu = new Menu();
//按字段取出值放入menu实体
menu.setMENU_NAME(rs.getString("MENU_NAME"));
menu.setURL(rs.getString("URL"));
menu.setUSABLE(rs.getString("USABLE"));
//判断菜单是否可用
if ("1".equals(menu.getUSABLE())) {
//将menu实体添加到list
list.add(i,menu);
i++;
}
}
sql.close();
connection.close();
return list;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
此外,需要创建menu和user的实体类
public class Menu {
private Integer MENU_ID ;
private String MENU_NAME ;
private String URL ;
private String USABLE ;
@Override
public String toString() {
return "Menu [MENU_ID=" + MENU_ID + ", MENU_NAME=" + MENU_NAME + ", URL=" + URL + ", USABLE=" + USABLE + "]";
}
public Integer getMENU_ID() {
return MENU_ID;
}
public void setMENU_ID(Integer mENU_ID) {
MENU_ID = mENU_ID;
}
public String getMENU_NAME() {
return MENU_NAME;
}
public void setMENU_NAME(String mENU_NAME) {
MENU_NAME = mENU_NAME;
}
public String getURL() {
return URL;
}
public void setURL(String uRL) {
URL = uRL;
}
public String getUSABLE() {
return USABLE;
}
public void setUSABLE(String uSABLE) {
USABLE = uSABLE;
}
}
public class User {
private String username ;
private String password ;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}

浙公网安备 33010602011771号