Java链接MySQL练习题:格式化日期、性别;避免代码注入

一、查询人员名单,按序号 姓名 性格(男或女) 民族(某族) 生日(年月日)输出

import java.sql.*;
import java.text.SimpleDateFormat;


public class Hr {

    public static void main(String[] args) throws Exception{
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","");
        Statement state=conn.createStatement();
        String sql="select * from info";
        ResultSet rs=state.executeQuery(sql);
        
        while(rs.next()){
            System.out.print(rs.getString(1)+"\t");
            System.out.print(rs.getString(2)+"\t");
            System.out.print(rs.getBoolean(3)?"男"+"\t":"女"+"\t");//三目运算符 ?:
            System.out.print(minZu(rs.getString(4))+"\t");//调用minZu方法,按民族代码查到民族名称
            System.out.print(riQi(rs.getDate(5))+"\n");//调用riQi方法格式化日期
        }
        conn.close();
    }
    public static String riQi(Date d) {//新建一个方法riQi,格式化日期为xxxx年xx月xx日
        SimpleDateFormat f=new SimpleDateFormat("yyyy年MM月dd日");
        return f.format(d);
    }
    
    public static String minZu(String mz) throws Exception{//新建一个方法
        String mzmc="";
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","");
        Statement state=conn.createStatement();
        String sql="select * from nation where code='"+mz+"' ";//在nation表,按民族代码查到民族名称
        ResultSet rs= state.executeQuery(sql);
        if(rs.next()==true){
            mzmc=rs.getString(2);
        }
        conn.close();
        return mzmc;                
        
    }

}

输出结果

p001    胡军    男    满族    1985年08月09日
p002    周丹    女    汉族    1984年04月17日
p003    吴倩    女    苗族    1981年10月29日
p004    唐墨    男    汉族    1983年02月25日

 

二、输入账号、密码实现登陆

import java.sql.*;
import java.util.Scanner;

public class Login {
        public static void main(String[] args) throws Exception{
        //输入账号密码
        Scanner sc=new Scanner(System.in);
        System.out.println("账号:");
        String uid=sc.nextLine();
        System.out.println("密码:");
        String pwd=sc.nextLine();
        
        uid=uid.replace("\'", "\"");//将用户输入的内容中单引号(')替换为双引号(")
        /*如果输入内容存在单引号(')就会破坏sql语句的结构,例如uid=a' or 1=1 #
        sql语句就变成了 select * from users where username='a' or 1=1 #' and password='"+pwd+"'
        这样整段sql语句就会被破坏掉,这种方式叫做代码注入*/
        
        //到数据库连接用户名密码正确与否
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=GBK", "root", "");
        Statement state=conn.createStatement();
        String sql="select * from users where username='"+uid+"' and password='"+pwd+"'";
        ResultSet rs=state.executeQuery(sql);
        //输出
        if(rs.next()){
            System.out.println("登陆成功,欢迎"+rs.getString(3));
            
        }else{
            System.out.println("用户名或密码错误");
        }
        conn.close();
    }

}

推荐用PreparedStatement接口避免代码注入

public static void main(String[] args) throws Exception{
        //输入账号密码
        Scanner sc=new Scanner(System.in);
        System.out.println("账号:");
        String uid=sc.nextLine();
        System.out.println("密码:");
        String pwd=sc.nextLine();
        
        //连接到数据库判断账号密码
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=GBK","root","");
        String sql="select * from users where username=? and password=? ";//语句避免出现单引号('),无论用户输入什么内容都不会造成代码注入
        PreparedStatement state=conn.prepareStatement(sql);
        state.setString(1, uid);//表示sql语句中的第一个“?”
        state.setString(2, pwd);//与上同理
        ResultSet rs=state.executeQuery();
        //输出结果
        if(rs.next()){
            System.out.println("登陆成功,欢迎"+rs.getString(3));
        }else{
            System.out.println("用户名或密码错误");
        }
        
        conn.close();
    }

三、往数据库表里插入新内容

public static void main(String[] args) throws Exception{
        //输入数据
        Scanner sc=new Scanner(System.in);
        System.out.println("账号:");
        String uid=sc.nextLine();
        System.out.println("密码:");
        String pwd=sc.nextLine();
        System.out.println("昵称:");
        String nick=sc.nextLine();
        
        //连接数据库并处理
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=GBK","root","");
        String sql="insert into users values(?,?,?)";
        PreparedStatement state=conn.prepareStatement(sql);
        state.setString(1, uid);//数字1表示sql语句中第一个“?”
        state.setString(2, pwd);
        state.setString(3, nick);
        state.executeUpdate();
        conn.close();        
    }

 

posted @ 2017-01-04 18:57  囧雪诺  阅读(597)  评论(0编辑  收藏  举报