学完Java基础后,一般会做个项目练手(上一篇博客有讲到 Java在线聊天室课程设计 )
当中肯定会涉及到登录验证,但没学过数据库 ,不知道如何操作;只能把用户账户密码预存在一个txt文本当中,然后通过IO流读取验证
⭐最后去搜相应的资料和网课进行学习,现在问题已解决,给大家做分享⭐
IDEA:编写Java代码,eclipse也可
Navicat:图形化操作数据库,当然IDEA里面也有内置的DataBase,不过社区版只能下载相应的插件。除此,在Navicat内可以进行SQL语句编写
如标题所说,想要简单实现连接数据库去验证登录
请直接跳转 7、用户登录验证实现 ,其余内容为对应需补充的知识点
B站:十分钟上手JDBC
JDBC(Java DataBase Connectivity):是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。
下载地址:mysql_JDBC_jar包
2、 用户信息和url
jdbc_test
这里是数据库的名称,改成自己的就行了
没有表的话,在navicat当中先去建个表
SQL语句可以现在Navicat中编写,再复制到IDEA里面:
运行结果:
完整代码如下:
//第一个JDBC例子
public class JdbcFirstDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1、加载驱动
// DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
Class.forName("com.mysql.cj.jdbc.Driver");//固定写法,加载驱动
//2、用户信息和url
String url="jdbc:mysql://localhost:3306/jdbc_test?useUnicode=true&useCharacter=utf8" +
"&userSSL=false&serverTimezone=GMT%2B8";
String username="root";
//下面一句应该为密码的英文,写博客的时候给我爆风险警告了
//String 密码 ="123456";
//3、连接成功,数据库对象 Connection 代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//4、执行sql的对象 statement
Statement statement = connection.createStatement();
//5、执行sql的对象 去执行sql,可能存在结果,返回结果
String sql="select * from player";
ResultSet resultSet = statement.executeQuery(sql);
//查看输出数据
while(resultSet.next()){
System.out.println("name = "+resultSet.getObject("name"));
System.out.println("number = "+resultSet.getObject("number"));
System.out.println(" 密码 = "+resultSet.getObject("password"));
}//写博客说这里写password有风险,我就改成中文了
//6、释放连接
resultSet.close();
statement.close();
connection.close();
}
}
思想:加载驱动、获取连接、释放连接不变,变的只有sql语句
这里可能有同学不清楚反射,但是没关系,可以先跟着写一遍
可以不用db.properties
这个文件,按照 2.3.5 那种方式编写 ☹️
public class JdbcUtils {
private static String driver=null;
private static String url=null;
private static String username=null;
private static String password=null;
static {
try{
InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(is);
driver=properties.getProperty("driver");
url=properties.getProperty("url");
username=properties.getProperty("username");
password=properties.getProperty("password");
//驱动只加载一次
Class.forName(driver);
}catch(Exception e){
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
//释放连接
public static void release(Connection cnn, Statement stmt, ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(cnn!=null){
try {
cnn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
编写数据库增加数据测试类:
编写数据库删除数据测试类:
编写数据库修改数据测试类:
编写数据库查找数据测试类:
查找相对于增、删、改来说是要容易一些的
大家可能注意到了这里rs.getString()
,如果你知道是返回的是String类型就用这个,那么同理返回的int类型就用 rs.getInt()
;如果不知道用啥就用rs.getObject()
简单模拟一个登陆业务:
运行结果:
如果这个时候更改一下输入的账号和密码,不走寻常路:
可以看到,所有的数据均符合,都被查找出来(rs.next()
一直为true)
可以防止SQL注入!!!
我们可以对之前编写的TestSelect类进行一些变化:
其实IDEA内也可以查看数据库的表,对数据进行增删改查的操作
如果用的不是企业版,是社区版的话,就没有database这个选项
解决办法:下载插件,使用DB Browser
新建连接:
界面如下:
不过有几次我明明对数据进行了操作,刷新IDEA里的表,数据一直没有更新;跑到Navicat里面去看数据已经进行了更新
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
提供1.2.12版本jar包的下载地址:druid-1.2.12.jar下载
导入lib目录,我的IDEA自动解压了;大家若没有自动解压,需要手动Add as Library
根据后面要使用到的DruidDataSourceFactory
的源码,应该对properties
文件的属性进行修改
重写工具类,不过整体和之前的JdbcUtils差不多
可以看到,基本上换汤不换药,依然正常运行
首先我们得在数据库里面有一张对应验证登录的表
我们利用JFrame制作一个简单的登录界面
这个时候是有登录按钮的,按钮绑定监听事件来验证登录是否正确
public class LoginFrame extends JFrame {
private static final Integer WIDTH=600;
private static final Integer HEIGHT=400;
public LoginFrame(){
setTitle("登录界面");
setSize(WIDTH,HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
JLabel jblBg = new JLabel();//可插入背景图片
jblBg.setBounds(0,0,WIDTH,HEIGHT);
jblBg.setLayout(null);
this.add(jblBg);
//账号
JLabel uid = new JLabel("账号");
uid.setBounds(170,120,50,30);
jblBg.add(uid);
//账号输入框
JTextField uidInput = new JTextField();
uidInput.setBounds(240, 120, 160, 30);
jblBg.add(uidInput);
//密码
JLabel upwd=new JLabel("密码");
upwd.setBounds(170, 180, 50, 30);
jblBg.add(upwd);
//密码输入框
JPasswordField upwdInput = new JPasswordField();
upwdInput.setBounds(240, 180, 160, 30);
jblBg.add(upwdInput);
//登录按钮
JButton btnLogin=new JButton("登录");
btnLogin.setBounds(260, 250, 100, 30);
btnLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String getInputUid=uidInput.getText();
String getInputUpwd=upwdInput.getText();
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
conn=JdbcUtils.getConnection();
String sql="SELECT * FROM userinfo WHERE UID =? AND UPWD =?";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,getInputUid);
pstmt.setString(2,getInputUpwd);
rs= pstmt.executeQuery();
//创建弹窗
JDialog dialog = new JDialog();
dialog.setLocationRelativeTo(null);
dialog.setSize(200,200);
if(rs.next()){
dialog.add(new JLabel("登录成功!"));
}else{
dialog.add(new JLabel("登录失败!"));
}
dialog.setVisible(true);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.release(conn,pstmt,rs);
}
}
});
jblBg.add(btnLogin);
setVisible(true);
}
//主函数只需运行loginFrame即可
public static void main(String[] args) {
new LoginFrame();
}
}
登录成功:
登录失败:
我们可以对界面稍稍优化一下
加入背景图片,调整字体、按钮颜色
代码更新:
public class LoginFrame_new extends JFrame {
private static final Integer WIDTH=600;
private static final Integer HEIGHT=400;
public LoginFrame_new(){
setTitle("登录界面");
setSize(WIDTH,HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
ImageIcon imgBg= new ImageIcon("src/images/JRbg.jpg");
JLabel jblBg = new JLabel(imgBg);//可插入背景图片
jblBg.setBounds(0,0,WIDTH,HEIGHT);
jblBg.setLayout(null);
this.add(jblBg);
//账号
JLabel uid = new JLabel("Account:");
uid.setBounds(150, 120, 110, 30);
uid.setFont(new Font("PingFang SC", Font.BOLD, 17));
uid.setForeground(Color.BLACK);
jblBg.add(uid);
//账号输入框
JTextField uidInput = new JTextField();
uidInput.setBounds(260, 120, 180, 30);
jblBg.add(uidInput);
//密码
JLabel upwd=new JLabel("Password:");
upwd.setBounds(150, 180, 110, 30);
upwd.setFont(new Font("PingFang SC", Font.BOLD, 17));
upwd.setForeground(Color.BLACK);
jblBg.add(upwd);
//密码输入框
JPasswordField upwdInput = new JPasswordField();
upwdInput.setBounds(260, 180, 180, 30);
jblBg.add(upwdInput);
//登录按钮
JButton btnLogin=new JButton("Login");
btnLogin.setBounds(270, 250, 110, 40);
btnLogin.setBackground(Color.PINK);
btnLogin.setForeground(Color.WHITE);
btnLogin.setFont(new Font("PingFang SC", Font.BOLD, 17));
btnLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String getInputUid=uidInput.getText();
String getInputUpwd=upwdInput.getText();
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
conn= JdbcUtils.getConnection();
String sql="SELECT * FROM userinfo WHERE UID =? AND UPWD =?";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,getInputUid);
pstmt.setString(2,getInputUpwd);
rs= pstmt.executeQuery();
//创建弹窗
JDialog dialog = new JDialog();
dialog.setLocationRelativeTo(null);
dialog.setSize(200,200);
if(rs.next()){
dialog.add(new JLabel("登录成功!"));
}else{
dialog.add(new JLabel("登录失败!"));
}
dialog.setVisible(true);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.release(conn,pstmt,rs);
}
}
});
jblBg.add(btnLogin);
setVisible(true);
}
//主函数只需运行loginFrame即可
public static void main(String[] args) {
new LoginFrame_new();
}
}
因为数据库连接池是后来加上去的
所以该验证登录程序未做相应的优化
和上面的登录换汤不换药,完全可以用上面登录界面的模板
加上一个注册按钮,点击打开注册界面,去验证注册是否成功
注册成功
注册失败