第1天(4课时)
创建jdbc应用
创建jdbc应用步骤分7步
1)载入jdbc驱动(指定我要连接到哪种数据库,连接不同数据库用不同驱动)
2)定义连接url(连接准备 url,端口,用户名,密码)
3)建立连接
4)创建PreparedStatement(动态) Statement(静态的)(拼sql语句)
5)执行数据库命令(crud)
6)结果的处理
7)关闭连接
浓缩
1,2连接准备---> 3 连接 ----> 4,5给数据库下指令---> 6处理结果---> 7关闭连接
连接各数据库的文档放在
E:\java16\javase\手册\JDBC—数据库的连接字符串及连接方法(各类数据库)
代码开始
建包
右键src new-package-输入com.neuedu.jdbc -ok
建类
右键包-new class-JdbcInsert.java
public class JdbcInsert {
@Test
public void insert(){
}
}
引入junit
用@Test因为没有引junit会报错,鼠标点击红色叉号,接eclipse指示引入junit
1)载入jdbc驱动(指定我要连接到哪种数据库,连接不同数据库用不同驱动)
https://www.runoob.com/w3cnote/java-class-forname.html
Class.forName("com.mysql.jdbc.Driver");
注意,要把mysql jar包引到工程里。
操作方法:工程右键-build path-configure build path-add libraries选项卡-add exteral jar -选中mysql的jar包-ok
2)定义连接url(连接准备 url,端口,用户名,密码)
String url="jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true";
String user="root";
String password="root";
3)建立连接
Connection conn=DriverManager.getConnection(url, user, password);
4)创建PreparedStatement(动态) Statement(静态的)(拼sql语句)
Statement st=conn.createStatement();
5)执行数据库命令(crud)
executeUpdate: 用于 insert update delete
executeQuery: 用于 select
ResultSet rs= st.executeQuery("select empno,ename,deptno from emp where deptno=10");
6)结果的处理
while(rs.next()){
//双引号里是数据库里的字段名,
String e_name=rs.getString("ename");
System.out.println(e_name);
int emp_no= rs.getInt("empno");
System.out.println(emp_no);
int deptno=rs.getInt("deptno");
System.out.println(deptno);
}
7)关闭连接
rs.close();
st.close();
conn.close();
完整代码
@Test
public void query() throws ClassNotFoundException, SQLException {
//1)载入jdbc驱动(指定我要连接到哪种数据库,连接不同数据库用不同驱动)
Class.forName("com.mysql.jdbc.Driver");
//2)定义连接url(连接准备 url,端口,用户名,密码)
String url="jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true";
String user="root";
String password="root";
//3)建立连接
Connection conn=DriverManager.getConnection(url, user, password);
//4)创建PreparedStatement(动态) Statement(静态的)(拼sql语句)
Statement st=conn.createStatement();
//5)执行数据库命令(crud)
//executeUpdate insert update delete
//executeQuery select
//查询10号部门的员工的员工编号,员工姓名,部门编号
ResultSet rs= st.executeQuery("select empno,ename,deptno from emp where deptno=10");
//6)结果的处理
while(rs.next()){
//双引号里是数据库里的字段名,
String e_name=rs.getString("ename");
System.out.println(e_name);
int emp_no= rs.getInt("empno");
System.out.println(emp_no);
int deptno=rs.getInt("deptno");
System.out.println(deptno);
}
//7)关闭连接
rs.close();
st.close();
conn.close();
}
发现异常不显示,改造代码
@Test
public void query1() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
// 1)载入jdbc驱动(指定我要连接到哪种数据库,连接不同数据库用不同驱动)
Class.forName("com.mysql.jdbc.Driver");
// 2)定义连接url(连接准备 url,端口,用户名,密码)
String url = "jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true";
String user = "root";
String password = "root";
// 3)建立连接
conn = DriverManager.getConnection(url, user, password);
// 4)创建PreparedStatement(动态) Statement(静态的)(拼sql语句)
st = conn.createStatement();
// 5)执行数据库命令(crud)
// executeUpdate insert update delete
// executeQuery select
// 查询10号部门的员工的员工编号,员工姓名,部门编号
rs = st.executeQuery("select empno,ename,deptno from emp where deptno=10");
// 6)结果的处理
while (rs.next()) {
// 双引号里是数据库里的字段名,
String e_name = rs.getString("ename");
System.out.println(e_name);
int emp_no = rs.getInt("empno");
System.out.println(emp_no);
int deptno = rs.getInt("deptno");
System.out.println(deptno);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7)关闭连接
try {
rs.close();
st.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
添加 修改 删除执行的是executeUpdate 返回类型为int而不是ResultSet,所以,这三种操作没有结果集
删除代码如下:
@Test
public void del() {
Connection conn = null;
Statement st = null;
try {
// 1)载入jdbc驱动(指定我要连接到哪种数据库,连接不同数据库用不同驱动)
Class.forName("com.mysql.jdbc.Driver");
// 2)定义连接url(连接准备 url,端口,用户名,密码)
String url = "jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true";
String user = "root";
String password = "root";
// 3)建立连接
conn = DriverManager.getConnection(url, user, password);
// 4)创建PreparedStatement(动态) Statement(静态的)(拼sql语句)
st = conn.createStatement();
// 5)执行数据库命令(crud)
// executeUpdate insert update delete
// executeQuery select
// 查询10号部门的员工的员工编号,员工姓名,部门编号
int count=st.executeUpdate("delete from emp_back where ename='SCOTT'");
System.out.println(count);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7)关闭连接
try {
st.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
作业
1)练习修改和删除
2)写添加和修改
第2天(6课时)
项目阶段(正常)
1)立项
2)需求分析(需求规格说明书)
3)概要设计(界面原型 部署模型 架构)
4)详细设计(包 类 内部接口(输入、输出) 流程图 外部接口)
5)编码(实现类)
6)测试(单元测试 集成测试 模拟现场环境做一个测试环境 性能测试)
7)部署实施(部署到生产环境)
8)上线运行
项目阶段(有时)
1)立项
2)需求分析(需求规格说明书)
3)概要设计(界面原型 部署模型 架构)
5)编码(实现类)
6)测试(单元测试 集成测试 模拟现场环境做一个测试环境 性能测试)
7)部署实施(部署到生产环境)
8)详细设计(包 类 内部接口(输入、输出) 流程图 外部接口)
9)上线运行
10)验收
用户注册
字段:用户id,用户名,密码,邮箱,权限
表名:t_*****
建表语句
/*
Navicat MySQL Data Transfer
Source Server : mysql
Source Server Version : 50553
Source Host : localhost:3306
Source Database : java16
Target Server Type: MYSQL
Target Server Version : 50553
File Encoding : 65001
Date: 2018-10-17 10:30:43
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(20) NOT NULL,
`user_pwd` varchar(20) NOT NULL,
`user_email` varchar(100) DEFAULT NULL,
`user_power` int(11) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS=1;
实体类
public class User {
// 用户id
private int id;
// 登录名
private String name;
// 密码
private String password;
// 邮箱
private String email;
// 权限 0-普通用户 1-管理员
private int power = 0;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getPower() {
return power;
}
public void setPower(int power) {
this.power = power;
}
}
开发主页
package com.neuedu.jdbc.menu;
import java.util.Scanner;
public class MainMenu {
public static void main(String[] args) {
while (true) {
System.out.println("欢迎使用neusoft用户管理系统");
System.out.println("======================");
System.out.println("用户登录---------------1");
System.out.println("用户注册---------------2");
System.out.println("退出程序---------------3");
Scanner sc = new Scanner(System.in);
//接受用户输入
int choice = sc.nextInt();
switch (choice) {//根据用户输入,进入不同界面
case 1:
// @todo进入用户登录界面
System.out.println("用户登录");
break;
case 2:
//用户注册
RegMenu regMenu=new RegMenu();
regMenu.show();
break;
case 3:
System.exit(0);
default:
System.out.println("不好意思,您输入错误!");
break;
}
}
}
}
开发注册页
package com.neuedu.jdbc.menu;
import java.util.Scanner;
import com.neuedu.jdbc.dao.UserManagerDao;
import com.neuedu.jdbc.pojo.User;
public class RegMenu {
public void show() {
//业务层,中间如果有涉及数据库的,咱们调用dao(数据访问对象)类去存库
//让用户输入个人信息
System.out.println("用户注册界面");
System.out.println("======================");
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的用户名:");
String userName=sc.next();
System.out.println("请输入您的密码:");
String userPwd=sc.next();
System.out.println("请输入您的邮箱:");
String email=sc.next();
//@todo做一些必要验证
//封装好一个对象,用于调用存库方法时用
User user=new User();
user.setEmail(email);
user.setUserName(userName);
user.setUserPwd(userPwd);
//把个人信息存库 int 型的结果
//需要调用 dao层进行存库
UserManagerDao umd=new UserManagerDao();
int result=umd.addUser(user);
//根据返回结果给用户提示
if(result>0){
System.out.println("注册成功");
}else{
System.out.println("注册失败");
}
//回到主界面
return;
}
}
创建实现类
package com.neuedu.jdbc.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.neuedu.jdbc.pojo.User;
public class UserManagerDao {
public int addUser(User user) {
Connection conn=null;
PreparedStatement ptst=null;
int result=0;
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/java13?characterEncoding=UTF-8&useUnicode=true";
String username="root";
String password="root";
conn=DriverManager.getConnection(url, username, password);
ptst=conn.prepareStatement("insert into t_user values(null,?,?,?,?)");
ptst.setString(1, user.getUserName());
ptst.setString(2, user.getUserPwd());
ptst.setString(3, user.getEmail());
ptst.setInt(4, user.getUserPower());
result=ptst.executeUpdate();
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
ptst.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
}
作业
练习注册功能
思考用户登录功能开发
第3天(6课时)
第一项任务:把昨天写的代码全删除,从头来一遍(3课时)
新建项目-定义实体类-写main方法-定义menu-写dao接口-写dao实现类,整个上午做完注册全流程
第二项任务:登录功能开发
登录功能
登录用户缓存
package com.neuedu.jdbc.menu;
import com.neuedu.jdbc.pojo.User;
/**
* 虚拟缓存
* @author Administrator
*
*/
public class LoginUser {
//共享对象
public static User currentUser;
public static User getCurrentUser() {
return currentUser;
}
public static void setCurrentUser(User currentUser) {
LoginUser.currentUser = currentUser;
}
}
LoginMenu
package com.neuedu.jdbc.menu;
import java.util.Scanner;
import com.neuedu.jdbc.dao.UserManagerDao;
import com.neuedu.jdbc.pojo.User;
public class LoginMenu {
public void show() {
System.out.println("欢迎登录界面");
System.out.println("======================");
Scanner sc=new Scanner(System.in);
System.out.println("请输入您的用户名");
String userName=sc.next();
System.out.println("请输入您的密码");
String userPwd=sc.next();
//封装一个user对象
User user=new User();
user.setUserName(userName);
user.setUserPwd(userPwd);
//调用dao的鉴权方法,验证用户名密码正确性
UserManagerDao umd=new UserManagerDao();
//根据用户名密码查询用户
User dbUser=umd.findUserByNameAndPassword(user);
//如果用户查询到了,进一步做
if(null!=dbUser){
System.out.println("登录成功!");
LoginUser.currentUser=dbUser;
//向缓存里存一个user对象,static 的,修改成功后,把对象更新
if(dbUser.getUserPower()==0){
//跳转到普通用户界面
UserMenu um=new UserMenu();
um.show();
}else{
//跳转到管理员界面 学生独立完成
}
}else{
System.out.println("没有查询到该用户");
return;
}
}
}
UserManagerDao
public User findUserByNameAndPassword(User user) {
User db_user=null;
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/java13?characterEncoding=UTF-8&useUnicode=true";
String userName="root";
String password="root";
//获取连接
conn=DriverManager.getConnection(url, userName, password);
//新建查询,预处理语句
//根据用户名和密码查询用户
ps=conn.prepareStatement("select * from t_user where user_name=? and user_pwd=?");
ps.setString(1, user.getUserName());
ps.setString(2, user.getUserPwd());
//查询要返回结果集
rs=ps.executeQuery();
//对结果集进行处理 如果确认返回结果是一行用if,如果是多条,用while
if(rs.next()){
//?
db_user=new User();
db_user.setId(rs.getInt("user_id"));
db_user.setUserName(rs.getString("user_name"));
db_user.setUserPwd(rs.getString("user_pwd"));
db_user.setEmail(rs.getString("user_email"));
db_user.setUserPower(rs.getInt("user_power"));
}
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// TODO Auto-generated method stub
return db_user;
}
UserMenu
package com.neuedu.jdbc.menu;
import java.util.Scanner;
import com.neuedu.jdbc.pojo.User;
public class UserMenu {
//四种
//无参无返回值的 public void methodName();
//无参有返回值的public String methodName();
//有参无返回值的 public void methodName(String username,String password);
// public void methodName(User);
//有参有返回值的 public void methodName(String username,String password);
//返回权限修饰符 返回值类型 方法名(参数列表)
//这个方法可以接受参数类型为User的,返回为void的,方法名为show()
public void show(){
while(true){
System.out.println(LoginUser.currentUser.getUserName()+"您好:"+"您的权限是普通用户");
System.out.println("=========================");
System.out.println("修改个人信息---------------1");
System.out.println("查询个人信息---------------2");
System.out.println("退出程序------------------3");
Scanner sc = new Scanner(System.in);
//接受用户输入
int choice = sc.nextInt();
switch (choice) {
case 1:
System.out.println("修改自己的信息");
UpdateUserMenu updateMenu=new UpdateUserMenu();
updateMenu.show();
break;
case 2:
//查询个人信息
System.out.println(LoginUser.currentUser.getId()+" "+LoginUser.currentUser.getUserName()+" "+LoginUser.currentUser.getUserPwd()+" "+LoginUser.currentUser.getEmail()+"普通用户");
break;
case 3:
System.exit(0);
break;
default:
System.out.println("选项错误!");
break;
}
}
}
}
UpdateUserMenu
package com.neuedu.jdbc.menu;
import java.util.Scanner;
import com.neuedu.jdbc.dao.UserManagerDao;
import com.neuedu.jdbc.pojo.User;
public class UpdateUserMenu {
public void show() {
//从缓存中获取当前用户信息
User old_user=LoginUser.currentUser;
System.out.println("您现在的信息是"+old_user.getId()+old_user.getUserName()+old_user.getUserPower()+old_user.getEmail());
System.out.println("================");
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改的姓名");
String new_Name=sc.next();
System.out.println("请输入要修改的密码");
String new_Pwd=sc.next();
System.out.println("请输入要修改的邮箱");
String new_email=sc.next();
User new_user=new User();
new_user.setId(old_user.getId());
new_user.setEmail(new_email);
new_user.setUserName(new_Name);
new_user.setUserPwd(new_Pwd);
//给dao传过去,入库去
UserManagerDao upDate=new UserManagerDao();
//添加,修改,删除都返回int
int count=upDate.updateUser(new_user);
if(count>0){
System.out.println("修改成功");
//更新组成存的用户信息
LoginUser.currentUser=new_user;
}else{
System.out.println("修改失败");
}
}
}
MainMenu
......
case 1:
//用户登录
LoginMenu loginMenu=new LoginMenu();
loginMenu.show();
break;
......
修改用户信息关键代码
public int updateUser(User new_user) {
Connection conn=null;
PreparedStatement ps=null;
int result=0;
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/java13?characterEncoding=UTF-8&useUnicode=true";
String userName="root";
String password="root";
conn=DriverManager.getConnection(url, userName, password);
ps=conn.prepareStatement("update t_user set user_name=?,user_pwd=?,user_email=? where user_id=? ");
ps.setString(1,new_user.getUserName());
ps.setString(2,new_user.getUserPwd());
ps.setString(3,new_user.getEmail() );
ps.setInt(4, new_user.getId());
//返回条数
result=ps.executeUpdate();
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
第四天
制作数据库工具类
第一步:建包
new -package-com.neuedu.utils
制作数据库工具类
第一步:建包
new -package-com.neuedu.utils
public class DBUtil {
// 用于数据库连接的方法
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true";
String UserName = "root";
String password = "root";
conn = DriverManager.getConnection(url, UserName, password);
} catch (Exception e) {
e.printStackTrace();
System.out.println("数据库连接异常" + e.getMessage());
}
return conn;
}
public static void closeConnection(ResultSet rs, Statement st, Connection conn) {
try {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("关闭连接异常" + e.getMessage());
}
}
}
引入db.propertis
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java16?characterEncoding=UTF-8&useUnicode=true
userName=root
passWord=root
完整代码
package com.neuedu.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DBUtil {
// 用于数据库连接的方法
public static Connection getConnection() {
Connection conn = null;
try {
//载入资源文件
Properties prop=new Properties();
prop.load(DBUtil.class.getResourceAsStream("/db.properties"));
//读取资源文件各属性
String driver=prop.getProperty("driver");
String url = prop.getProperty("url");
String UserName = prop.getProperty("userName");
String password = prop.getProperty("passWord");
Class.forName(driver);
conn = DriverManager.getConnection(url, UserName, password);
} catch (Exception e) {
e.printStackTrace();
System.out.println("数据库连接异常" + e.getMessage());
}
return conn;
}
public static void closeConnection(ResultSet rs, Statement st, Connection conn) {
try {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("关闭连接异常" + e.getMessage());
}
}
}
查询所有用户关键代码
dao实现类
@Override
public List<User> findAll() {
conn=DBUtil.getConnection();
List<User> userList=new ArrayList();
try {
st=conn.prepareStatement("select * from t_user");
rs=st.executeQuery();
while(rs.next()){
//每次都新实例化一个对象
User user=new User();
//把从数据库查询到的记录封装到对象里
user.setId(rs.getInt("user_id"));
user.setName(rs.getString("user_name"));
user.setPassword(rs.getString("user_pwd"));
user.setEmail(rs.getString("user_email"));
user.setPower(rs.getInt("user_power"));
//把对象放到list里
userList.add(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return userList;
}
页面展示
System.out.println("查询结果");
for(User u:userlist){
System.out.println(u.getId()+" "+u.getName()+" "+u.getPassword()+" "+u.getEmail()+" "+u.getPower());
System.out.println("================================================");
}
作业:
学生独立完成项目