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(); }