本文共 11418 字,大约阅读时间需要 38 分钟。
本人是个新手,写下博客用于自我复习、自我总结。 如有错误之处,请各位大佬指出。 学习资料来源于:尚硅谷
每个人的数据库的名字以及表可能不相同,可以对以下中出现的数据进行相应的修改
通用操作:
package com.guigu.util;import java.io.InputStream;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 JDBCUtils { /** * 获取数据库的连接 * */ public static Connection getConnection() throws Exception { // 1、读取配置文件中的基本信息 InputStream is = ClassLoader.getSystemClassLoader() .getResourceAsStream("jdbc.properties"); Properties pros = new Properties(); pros.load(is); String user = pros.getProperty("user"); String url = pros.getProperty("url"); String password = pros.getProperty("password"); // 2、加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 3、获取链接 Connection conn = DriverManager.getConnection(url, user, password); return conn; } // 关闭资源的操作 public static void closeResource(Connection conn, Statement ps) { try { if (ps != null) ps.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } // 关闭资源的操作 public static void closeResource(Connection conn, Statement ps, ResultSet rs) { try { if (ps != null) ps.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } }}
查询操作的类(一个数据表对应一个java类)
package com.guigu.bean;import java.sql.Date;/** * ORM编程思想(object relational mapping) 一个数据表对应一个java类 表中的一条记录对应java类的一个对象 * 表中的一个字段对应java类的一个属性 * * java与SQL对应数据类型转换表: boolean <--> BIT byte <--> TINYINT short <--> SMALLINT int * <--> INTEGER long <--> BIGINT String <--> CHAR,VARCHAR,LONGVARCHAR byte array * <--> BINARY, VAR BINARY * * java.sql.Date <--> DATE java.sql.Time <--> TIME java.sql.Timestamp <--> * TIMESTAMP * * */public class Student { private String stuname; private double stuscore; private int stunum; private Date stubirth; public Student() { super(); } public Student(String stuname, double stuscore, int stunum, Date stubirth) { super(); this.stuname = stuname; this.stuscore = stuscore; this.stunum = stunum; this.stubirth = stubirth; } public String getStuname() { return stuname; } public void setStuname(String stuname) { this.stuname = stuname; } public double getStuscore() { return stuscore; } public void setStuscore(double stuscore) { this.stuscore = stuscore; } public int getStunum() { return stunum; } public void setStunum(int stunum) { this.stunum = stunum; } public Date getStubirth() { return stubirth; } public void setStubirth(Date stubirth) { this.stubirth = stubirth; } @Override public String toString() { return "Student [stuname=" + stuname + ", stuscore=" + stuscore + ", stunum=" + stunum + ", stubirth=" + stubirth + "]"; }}
package com.guigu.preparedstatement.crud;import java.sql.Connection;import java.sql.Date;import java.sql.PreparedStatement;import java.sql.ResultSet;import com.guigu.bean.Student;import com.guigu.util.JDBCUtils;import org.junit.Test;/** * 针对student表的查询 * */public class StudentForQuery { @Test public void testQuery1(){ Connection conn = null; PreparedStatement ps=null; ResultSet resultSet = null; try { conn = JDBCUtils.getConnection(); String sql = "select stuname,stuscore,stunum,stubirth from student where stuid = ?"; ps = conn.prepareStatement(sql); ps.setObject(1, 6); // 执行并返回结果集 resultSet = ps.executeQuery(); // 处理结果集 if (resultSet.next()) { // 判断结果集的下一条是否有数据,如果返回true,指针下移;否则指针不下移 // 获取当前数据的各个字段值 String stuname = resultSet.getString(1); double stuscore = resultSet.getDouble(2); int stunum = resultSet.getInt(3); Date stubirth = resultSet.getDate(4); // 方式一 //System.out.println("姓名:" + stuname + "分数:" + stuscore + "学号:" // + stunum + "生日:" + stubirth); // 方式二 //Object[] data = new Object[] { stuname, stuscore, stunum, stubirth }; // 方式三 :将数据封装成一个对象(推荐) Student student = new Student(stuname,stuscore,stunum,stubirth); System.out.println(student); } } catch (Exception e) { e.printStackTrace(); } //关闭资源 JDBCUtils.closeResource(conn,ps,resultSet); }}
之后可以写一个针对student的通用查询操作
package com.guigu.preparedstatement.crud;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.Date;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import com.guigu.bean.Student;import com.guigu.util.JDBCUtils;import org.junit.Test;/** * 针对student表的查询 * */public class StudentForQuery { // 针对于student表的通用的查询操作 public Student queryForStudent(String sql, Object... args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 获取结果集的元数据 ResultSetMetaData rsmd = rs.getMetaData(); // 通过ResultSetMetaData获取结果集中的列数 int columnCount = rsmd.getColumnCount(); if (rs.next()) { Student st = new Student(); // 处理结果集一行数据中的每一个列 for (int i = 0; i < columnCount; i++) { // 获取列值 Object columnValue = rs.getObject(i + 1); // 获取每个列的列名 String columnName = rsmd.getColumnName(i + 1); // 给st对象指定的columnName属性,赋值为columnValue,反射完成 Field field = Student.class.getDeclaredField(columnName); field.setAccessible(true); field.set(st, columnValue); } return st; } } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps, rs); } return null; } @Test public void testQueryForStudent(){ String sql = "select stuname,stuscore,stunum,stubirth from student where stuid = ?"; Student st = queryForStudent(sql,6); System.out.println(st); }}
最后需要想办法实现的是对不同的表都可以做到的通用查询方式:
package com.guigu.preparedstatement.crud;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.ArrayList;import java.util.List;import org.junit.Test;import com.guigu.bean.Student;import com.guigu.util.JDBCUtils;//使用PreparedStatement实现对于不同表的通用的查询操作public class PreparedStatementQueryTest { @Test public void testGetInstance() { String sql = "select stuname,stuscore,stunum,stubirth from student where stuid = ?"; Student st = getInstance(Student.class, sql, 6); System.out.println(st); } // 针对于不同的表的通用的查询操作,返回表中的一条记录 publicT getInstance(Class clazz, String sql, Object... args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 获取结果集的元数据 ResultSetMetaData rsmd = rs.getMetaData(); // 通过ResultSetMetaData获取结果集中的列数 int columnCount = rsmd.getColumnCount(); if (rs.next()) { T t = clazz.newInstance(); // 处理结果集一行数据中的每一个列 for (int i = 0; i < columnCount; i++) { // 获取列值 Object columnValue = rs.getObject(i + 1); // 获取每个列的列名 String columnName = rsmd.getColumnName(i + 1); // 给st对象指定的columnName属性,赋值为columnValue,反射完成 Field field = Student.class.getDeclaredField(columnName); field.setAccessible(true); field.set(t, columnValue); } return t; } } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps, rs); } return null; } @Test public void testGetForList() { String sql = "select stuname,stuscore,stunum,stubirth from student where stuid < ?"; List list = getForList(Student.class, sql, 3); int size = list.size(); for (int i = 0; i < size; i++) { System.out.println(list.get(i)); } } // 针对于不同的表的通用的查询操作,返回表中的多条记录 public List getForList(Class clazz, String sql, Object... args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 获取结果集的元数据 ResultSetMetaData rsmd = rs.getMetaData(); // 通过ResultSetMetaData获取结果集中的列数 int columnCount = rsmd.getColumnCount(); // 创建集合对象 ArrayList list = new ArrayList (); while (rs.next()) { T t = clazz.newInstance(); // 处理结果集一行数据中的每一个列:给t对象指定的属性赋值 for (int i = 0; i < columnCount; i++) { // 获取列值 Object columnValue = rs.getObject(i + 1); // 获取每个列的列名 String columnName = rsmd.getColumnName(i + 1); // 给st对象指定的columnName属性,赋值为columnValue,反射完成 Field field = Student.class.getDeclaredField(columnName); field.setAccessible(true); field.set(t, columnValue); } list.add(t); } return list; } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps, rs); } return null; }}
PreparedStatement可以解决sql注入问题
(需要在数据库中建立User表,把有登录权限的人的信息写上, 再在java中写一个User类(像之前那样) 判断输入的用户名和密码能否匹配上,如果匹配上就允许登录,否则不允许)package com.guigu.preparedstatement.crud;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.Scanner;import org.junit.Test;import com.guigu.bean.Student;import com.guigu.util.JDBCUtils;/** * PreparedStatement除了解决Statement的拼串、sql问题之外,PreparedStatement还有哪些好处? * 1、PreparedStatement操作Blob的数据,而Statement做不到 * 2、PreparedStatement可以实现更高效的批量操作 * */public class PreparedStatementTest { @Test public void testLogin() { Scanner scanner = new Scanner(System.in); System.out.println("请输入用户名:"); String user = scanner.nextLine(); System.out.println("请输入密码:"); String password = scanner.nextLine(); String sql = "SELECT user,password FROM user_table WHERE user = ? and password = ?"; User returnUser = getInstance(User.class, sql, user, password); if (returnUser != null) { System.out.println("登陆成功"); } else { System.out.println("用户名不存在或密码错误"); } } // 针对于不同的表的通用的查询操作,返回表中的一条记录 publicT getInstance(Class clazz, String sql, Object... args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 获取结果集的元数据 ResultSetMetaData rsmd = rs.getMetaData(); // 通过ResultSetMetaData获取结果集中的列数 int columnCount = rsmd.getColumnCount(); if (rs.next()) { T t = clazz.newInstance(); // 处理结果集一行数据中的每一个列 for (int i = 0; i < columnCount; i++) { // 获取列值 Object columnValue = rs.getObject(i + 1); // 获取每个列的列名 String columnName = rsmd.getColumnName(i + 1); // 给st对象指定的columnName属性,赋值为columnValue,反射完成 Field field = Student.class.getDeclaredField(columnName); field.setAccessible(true); field.set(t, columnValue); } return t; } } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps, rs); } return null; }}
转载地址:http://yayki.baihongyu.com/