JDBC连接数据库
一、登录 二、数据库的一般操作 三、使用工具类连接 四、数据库连接需要的数据
……………………………………………………………………………………………………………………………………………………………………………………………………………………
实例一:
//实体类对象 package com.qf.login; public class User { private int id; private String username; private String password; }
//登录 package com.qf.login; //从控制台输入用户名和密码,判断登录是否成功 public class Login { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名"); String username = sc.nextLine(); System.out.println("请输入密码"); String password = sc.nextLine(); // 封装对象 User user = new User(); user.setUsername(username); user.setPassword(password); // 调用具体的业务处理类 DoLogin dl = new DoLogin(); User u = dl.findUser(user); if (u == null) { System.out.println("登录失败"); } else { System.out.println("欢迎" + u.getUsername() + "登录成功"); } } }
//处理事务 package com.qf.login; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DoLogin { public User findUser(User u) { User user = null; try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee02", "root", "admin"); Statement stmt = conn.createStatement(); String sql = "select * from user where username='" + u.getUsername() + "' and password='" + u.getPassword() + "'"; ResultSet rs = stmt.executeQuery(sql); if (rs.next()) { user = new User(); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return user; } }
实例二:
package com.neusoft.oracle.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Scanner; public class Test3 { public static void main(String[] args) { String driver = "oracle.jdbc.driver.OracleDriver"; String oravleUr1="jdbc:oracle:thin:@//localhost:1521/neusoft"; String user = "scott"; String Password="tiger"; // String sql = "select * from user1 " // +"where username = ? " // +"and password = ?"; StringBuilder sb = new StringBuilder(); sb.append("select * "); sb.append("from user1 "); sb.append("where username = ? "); sb.append("and password = ?"); try { Class.forName(driver); Connection conn = DriverManager.getConnection(oravleUr1, user, Password); //PreparedStatement pstmt = conn.prepareStatement(sql); PreparedStatement pstmt = conn.prepareStatement(sb.toString()); Scanner sc = new Scanner(System.in); System.out.println("please input username"); String username = sc.nextLine(); System.out.println("please input password"); int password1 = sc.nextInt(); pstmt.setString(1, username); pstmt.setInt(2, password1); ResultSet rs = pstmt.executeQuery(); if(rs.next()){ System.out.println("登陆成功"); }else{ System.out.println("登录失败"); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
(一)JDBC:连接数据库 (二)JDBC:增删改查 (三)SQL语句注入的区别 (四)遍历结果集封装对象存储到list结合 (五)Junit简单使用
1.需要jar包支持。 驱动直接去jar里找。
2.步骤。
public class DemoJdbc01 { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // a:加载驱动 Class.forName("com.mysql.jdbc.Driver"); // DriverManager.registerDriver(new com.mysql.jdbc.Driver()); // b:创建连接 // conn = // DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee02", // "root", "admin"); // conn = // DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee02?user=root&password=admin"); Properties info = new Properties(); info.setProperty("user", "root"); //封装用户名和属性 info.setProperty("password", "admin"); //名值对 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee02", info); // c:创建执行sql语句的Statement对象 stmt = conn.createStatement(); // d:执行sql语句并处理结果 String sql = "select * from emp"; // 执行查询语句返回结果集 rs = stmt.executeQuery(sql); // 结果集光标默认在第一条记录上方,调用next()光标向下移动一行 // 如果有新行,返回true;如果到达末尾返回false while (rs.next()) { //使用get方法获得 String ename = rs.getString(2);// 字段索引,从1开始 int sal = rs.getInt("sal");// 字段名 System.out.println(ename + "," + sal); } } catch (Exception e) { e.printStackTrace(); } finally { // e:关闭资源 try { if (rs != null) { rs.close(); } if (stmt != null) stmt.close(); if (conn != null) { conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
next()将光标从当前位置向前移一行。
返回:如果新的当前行有效,则返回true;如果不存在下一行,则返回false。
package com.qf.jdbc; import org.junit.Test; public class DemoJdbc02 { @Test public void testInsert01() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee02", "root", "admin"); Statement stmt = conn.createStatement(); String sql = "insert into student(name,age,sex,birthday,score,description) " + "values('tom',20,'M','1999-9-9',99.5,'tom is good boy')"; // 返回值为影响表的行数 int n = stmt.executeUpdate(sql); if (n > 0) { System.out.println("success"); } } @Test public void testInsert02() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee02", "root", "admin"); Statement stmt = conn.createStatement(); String name = "jack"; int age = 21; String date = "2000-9-9"; String sql = "insert into student(name,age,sex,birthday,score,description) " + "values('" + name + "'," + age + ",'M','" + date + "',99.5,'tom is good boy')"; // 返回值为影响表的行数 int n = stmt.executeUpdate(sql); if (n > 0) { System.out.println("success"); } } @Test public void testUpdate() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee02", "root", "admin"); Statement stmt = conn.createStatement(); String sql = "update student set score=90 where id=2"; // 返回值为影响表的行数 int n = stmt.executeUpdate(sql); // System.out.println(n); if (n > 0) { System.out.println("success"); } } @Test public void testDelete() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee02", "root", "admin"); Statement stmt = conn.createStatement(); String sql = "delete from student where id=2"; // 返回值为影响表的行数 int n = stmt.executeUpdate(sql); if (n > 0) { System.out.println("success"); } } @Test public void testCount() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee02", "root", "admin"); Statement stmt = conn.createStatement(); String sql = "select count(*) c from emp"; ResultSet rs = stmt.executeQuery(sql); if (rs.next()) // System.out.println(rs.getInt(1)); System.out.println(rs.getInt("c")); } }
statement和preparedstatement的区别:
package com.neusoft.oracle.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Scanner; public class Test2 { public static void main(String[] args) { String driver = "oracle.jdbc.driver.OracleDriver"; String oracleUrl = "jdbc:oracle:thin:@//localhost:1521/neusoft"; String user = "scott"; String password = "tiger"; try { Class.forName(driver); Connection conn = DriverManager.getConnection(oracleUrl, user, password); Statement stmt = conn.createStatement(); Scanner sc = new Scanner(System.in); System.out.println("please input username"); String username = sc.nextLine(); System.out.println("please input password"); String password1 = sc.nextLine(); //sql注入 String sql = "select * " + "from user1 " + "where username = '"+username+"' " + "and password = "+password1; System.out.println(sql); ResultSet rs = stmt.executeQuery(sql); if(rs.next()){ System.out.println("登陆成功"); }else{ System.out.println("登陆失败"); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package com.neusoft.oracle.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class AnotherTest { public static void main(String[] args) { String driver = "oracle.jdbc.driver.OracleDriver"; String oracleUrl = "jdbc:oracle:thin:@//localhost:1521/neusoft"; String user = "scott"; String password = "tiger"; int empno1 = 7369; String ename1 = "SMITH"; String sql = "select * " + "from emp " + "where empno = ? " + "and ename = ?"; try { Class.forName(driver); Connection conn = DriverManager.getConnection(oracleUrl, user, password); PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, empno1); pstmt.setString(2, ename1); ResultSet rs = pstmt.executeQuery(); while(rs.next()){ System.out.println(rs.getInt("empno")); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
//实体类,get,set,tostring package com.qf.entity; public class Student { private int id; private String name; private int age; private String sex; private String birthday; private double score; private String description; }
package com.qf.jdbc; public class DemoJdbc03 { public static void main(String[] args) { DemoJdbc03 dj = new DemoJdbc03(); System.out.println(dj.findAll()); } public List<Student> findAll() { List<Student> list = new ArrayList<Student>(); Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee02", "root", "admin"); stmt = conn.createStatement(); String sql = "select * from student"; rs = stmt.executeQuery(sql); // 遍历结果集 while (rs.next()) { //封装对象 Student stu = new Student(); stu.setId(rs.getInt("id")); stu.setName(rs.getString("name")); stu.setAge(rs.getInt("age")); stu.setBirthday(rs.getString("birthday")); stu.setSex(rs.getString("sex")); stu.setDescription(rs.getString("description")); // 将对象存储到集合中 list.add(stu); } } catch (Exception e) { e.printStackTrace(); } finally { // e:关闭资源 try { if (rs != null) { rs.close(); } if (stmt != null) stmt.close(); if (conn != null) { conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return list; } }
package com.qf.junit; public class Cal { public int add(int a, int b) { return a + b; } public int mul(int a, int b) { return a * b; } }
package com.qf.junit; import org.junit.After; import org.junit.Before; import org.junit.Test; import junit.framework.Assert; public class Demo { // 单元测试的方法是无参数无返回值 @Before //Junit执行之前执行 public void before() { System.out.println("before"); } @SuppressWarnings("deprecation") @Test // 注解。也就是说这是一个单元测试方法 public void testAdd() { Cal cal = new Cal(); // 断言:需要判断方法的返回值与预期的值是否一致 Assert.assertEquals(3, cal.add(1, 2)); } @After public void after() { System.out.println("after"); } }
(一)工具类的使用 (二)封装数据库工具类 (三)分页 (四)转账
//连接数据库,进行增删改查 package com.qf.jdbc; public class Demo01 { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = DBUtils.getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from emp"); while (rs.next()) { System.out.println(rs.getString("ename")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { DBUtils.closeAll(rs, stmt, conn); } } }
为了解决sql注入: ('jgh' or '1'='1' ),只要有or则前面的被后面的覆盖掉,成功运行。所以statement改用preparedstatement,将不会出现这种失误。
1 package com.qf.jdbc; 2 3 public class Demo02 { 4 5 @Test //数据库的增删改一样 6 public void testInsert() { 7 try { 8 Connection conn = DBUtils.getConnection(); 9 //创建PreparedStatement对象,封装SQL语句 10 String sql = "insert into user(username,password) values(?,?)"; 11 PreparedStatement pstmt = conn.prepareStatement(sql); 12 //给上面的问号赋值。参数索引从1开始 13 pstmt.setString(1, "abc"); 14 pstmt.setString(2, "def"); 15 16 int n = pstmt.executeUpdate(); 17 if (n > 0) { 18 System.out.println("success"); 19 } 20 } catch (SQLException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 } 25 26 @Test 27 public void testUpdate() { 28 try { 29 Connection conn = DBUtils.getConnection(); 30 String sql = "update user set username=?,password=? where id=?"; 31 PreparedStatement pstmt = conn.prepareStatement(sql); 32 pstmt.setString(1, "aaa"); 33 pstmt.setString(2, "bbb"); 34 pstmt.setInt(3, 3); 35 36 int n = pstmt.executeUpdate(); 37 if (n > 0) { 38 System.out.println("success"); 39 } 40 } catch (SQLException e) { 41 // TODO Auto-generated catch block 42 e.printStackTrace(); 43 } 44 45 } 46 47 @Test 48 public void testDelete() { 49 try { 50 Connection conn = DBUtils.getConnection(); 51 String sql = " delete from user where id=?"; 52 PreparedStatement pstmt = conn.prepareStatement(sql); 53 pstmt.setInt(1, 3); 54 55 int n = pstmt.executeUpdate(); 56 if (n > 0) { 57 System.out.println("success"); 58 } 59 } catch (SQLException e) { 60 // TODO Auto-generated catch block 61 e.printStackTrace(); 62 } 63 64 } 65 }
1.第一种方法
在同包下建立feil文件,输入下列代码:
//db.properties driver = com.mysql.jdbc.Driver mysqlUrl = jdbc:mysql://localhost:3306/RUNOOB user = root password = root
1 package com.neusoft.oracle.jdbc; 2 3 public class DBUtil { 4 private static String driver = null; 5 private static String mysqlUrl = null; 6 private static String user = null; 7 private static String password = null; 8 private static Connection conn = null; 9 static{ 10 try { 11 Properties p = new Properties(); 12 p.load(DBUtil.class.getResourceAsStream("db.properties")); 13 driver = p.getProperty("driver"); 14 mysqlUrl = p.getProperty("mysqlUrl"); 15 user = p.getProperty("user"); 16 password = p.getProperty("password"); 17 Class.forName(driver); 18 conn = DriverManager.getConnection(mysqlUrl, user, password); 19 } catch (IOException e) { 20 // TODO Auto-generated catch block 21 e.printStackTrace(); 22 }catch (ClassNotFoundException e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 }catch (SQLException e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 } 29 } 30 private DBUtil(){ 31 32 } 33 public static Connection getConnection(){ 34 return conn; 35 } 36 } 37 //关闭一个流 38 public static void close(ResultSet rs,PreparedStatement pstmt,Connection conn){ 39 if(rs != null){ 40 try { 41 rs.close(); 42 } catch (SQLException e) { 43 // TODO Auto-generated catch block 44 e.printStackTrace(); 45 } 46 } 47 if(pstmt != null){ 48 try { 49 pstmt.close(); 50 } catch (SQLException e) { 51 // TODO Auto-generated catch block 52 e.printStackTrace(); 53 } 54 } 55 if(conn != null){ 56 try { 57 conn.close(); 58 } catch (SQLException e) { 59 // TODO Auto-generated catch block 60 e.printStackTrace(); 61 } 62 } 63 } 64 }
2.第二种方法
配置文件 DBConfig.properties //文件名 driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/java username=root password=admin
1 DBUtil.java //文件名 2 package com.qf.utils; 3 4 import java.sql.Connection; 5 import java.sql.DriverManager; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 import java.util.ResourceBundle; 10 11 //数据库工具类 12 //获得配置文件内容,创建获得连接的方法,关闭资源的方法 13 public class DBUtils { 14 private static String driverClass; 15 private static String url; 16 private static String username; 17 private static String password; 18 19 static { 20 // 读取配置文件信息 21 ResourceBundle rb = ResourceBundle.getBundle("DBConfig"); 22 driverClass = rb.getString("driverClass"); 23 url = rb.getString("url"); 24 username = rb.getString("username"); 25 password = rb.getString("password"); 26 27 try { 28 Class.forName(driverClass); 29 } catch (ClassNotFoundException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 } 34 35 // 获得连接 36 public static Connection getConnection() throws SQLException { 37 return DriverManager.getConnection(url, username, password); 38 } 39 40 // 关闭资源 41 public static void closeAll(ResultSet rs, Statement stmt, Connection conn) { 42 try { 43 if (rs != null) 44 rs.close(); 45 if (stmt != null) 46 stmt.close(); 47 if (conn != null) 48 conn.close(); 49 } catch (SQLException e) { 50 // TODO Auto-generated catch block 51 e.printStackTrace(); 52 } 53 } 54 55 }
分页:数据量大时需要分页。
select * from emp limit 起始行索引,长度(个数)
1.规定每页显示的记录数
pageSize=3;
2.获得表中的总记录数
total
select count(*) from emp
3.计算页数
pageCount
total%pageSize==0?total%pageSize:total%pageSize+1
Math.ceiling(total*1.0/pageSize);
4.获得每页显示的数据
select * from emp limit 0,3
select * from emp limit 3,3
select * from emp limit 6,3
获得每页数据,只需要获得页码(pageNo 1,2,3……)即可
select * from emp limit (pageNo-1)*pageSize,pageSize;
1 创建实体类 2 package com.qf.entity; 3 4 public class Emp { 5 private int empno; 6 private String ename; 7 private int sal; 8 9 @Override 10 public String toString() { 11 return "Emp [empno=" + empno + ", ename=" + ename + ", sal=" + sal + "]"; 12 } 13 }
1 package com.qf.page; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.util.ArrayList; 8 import java.util.Iterator; 9 import java.util.List; 10 import java.util.Scanner; 11 12 import com.qf.entity.Emp; 13 import com.qf.utils.DBUtils; 14 15 public class DemoPage { 16 17 private static int pageSize = 3;// 每页显示的记录数 18 private static int total;// 总记录数 19 private static int pageCount;// 总页数 20 21 public static void main(String[] args) { 22 // 首先打印页码,以及第一页内容 23 Connection conn = null; 24 PreparedStatement pstmt = null; 25 ResultSet rs = null; 26 try { 27 conn = DBUtils.getConnection(); 28 String sql = "select count(*) from emp"; 29 pstmt = conn.prepareStatement(sql); 30 rs = pstmt.executeQuery(); 31 if (rs.next()) { 32 total = rs.getInt(1); //获得总的记录数 33 } 34 // 计算总页数 35 pageCount = (int) Math.ceil(total * 1.0 / pageSize); 36 37 // 打印页码 38 for (int i = 1; i <= pageCount; i++) { 39 System.out.print(i + " "); 40 } 41 System.out.println(); 42 43 int pageNo = 1; 44 // 显示第一页数据 45 print(pageNo); 46 47 System.out.println("请输入页码"); 48 Scanner sc = new Scanner(System.in); 49 pageNo = Integer.parseInt(sc.next()); 50 51 if (pageNo <= pageCount && pageNo > 0) 52 print(pageNo); 53 else { 54 System.out.println("请输入正确页码"); 55 } 56 } catch (SQLException e) { 57 // TODO Auto-generated catch block 58 e.printStackTrace(); 59 } 60 61 } 62 63 /根据页码获得每页数据,打印数据 64 * @param pageNo 65 */ 66 private static void print(int pageNo) { 67 List<Emp> list = getData(pageNo); 68 Iterator<Emp> it = list.iterator(); 69 while (it.hasNext()) { 70 System.out.println(it.next()); 71 } 72 } 73 74 /** 75 * 封装方法,获得每页的数据 76 * @param pageNo,页码 77 * @return 78 */ 79 public static List<Emp> getData(int pageNo) { 80 List<Emp> list = new ArrayList<Emp>(); 81 try { 82 Connection conn = DBUtils.getConnection(); 83 String sql = "select empno,ename,sal from emp limit ?,?"; 84 PreparedStatement pstmt = conn.prepareStatement(sql); 85 pstmt.setInt(1, (pageNo - 1) * pageSize); 86 pstmt.setInt(2, pageSize); 87 88 ResultSet rs = pstmt.executeQuery(); 89 while (rs.next()) { 90 Emp emp = new Emp(); 91 emp.setEmpno(rs.getInt(1)); 92 emp.setEname(rs.getString(2)); 93 emp.setSal(rs.getInt(3)); 94 95 list.add(emp); 96 } 97 } catch (SQLException e) { 98 // TODO Auto-generated catch block 99 e.printStackTrace(); 100 } 101 return list; 102 } 103 }
1 package com.neusoft.oracle.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 8 public class TestConn { 9 public static void main(String[] args) { 10 Connection conn = OracleDBUtil.getConnection(); 11 try { 12 conn.setAutoCommit(false); 13 give(conn); 14 recieve(conn); 15 conn.commit(); 16 } catch (SQLException e) { 17 // TODO Auto-generated catch block 18 try { 19 conn.rollback(); 20 } catch (SQLException e1) { 21 // TODO Auto-generated catch block 22 e1.printStackTrace(); 23 } 24 } 25 } 26 public static void give(Connection conn) throws SQLException{ 27 String sql = "update bankuser set userbalance=userbalance-100 where userid = 1"; 28 PreparedStatement pstmt = conn.prepareStatement(sql); 29 pstmt.executeUpdate(); 30 } 31 public static void recieve(Connection conn) throws SQLException{ 32 String sql = "update bankuser set userbalance=userbalance+100 where userid = 2"; 33 PreparedStatement pstmt = conn.prepareStatement(sql); 34 pstmt.executeUpdate(); 35 } 36 }
oracle.jdbc.driver.OracleDriver
"jdbc:oracle:thin:@//localhost:1521/ORCL" "scott" "123456"
"com.mysql.jdbc.Driver" "jdbc:mysql://localhost:3306/RUNOOB" "root" "123456"

浙公网安备 33010602011771号