1、什么是jdbc?
jdbc(Java Database Connectivity,java数据库连接),就是使用java让sql在MysqL中执行。为访问不同的关系型数据库提供了统一方式,它是一组由java语言开发类和接口。jdbc为数据库连接提供了基准。
jdbc中只有接口,没有具体实现。体现了多态和定制规则。
Application:java应用程序
JDBC Driver Interface:jdbc接口
Oracle/sqlServer/MysqL JDBC Driver:各个数据库厂商根据jdbc接口实现的驱动包
2、jdbc如何使用
①使用之前先导入mysql-connector-java-5.6.21-bin.jar
②分为DML和DQL两种语句使用介绍:
Ⅰ、DML语句(update\delete\insert)
在jdbc中,这三种语句使用一个方法executeUpdate();
会有两种代码示例,一种是只能使用静态sql的Statement类,一种是PrepareStatement类,可以使用动态sql
详细代码示例:
1、使用的Statement,只能使用静态sql,容易被sql注入,不推荐使用
public static void main(String[] args){ //1、加载驱动 Class.forName("com.MysqL.jdbc.Driver"); //Class.forName()是反射中的,通过类全限定名来找到Driver字节码文件 //2、创建连接 String url="jdbc:MysqL://localhost:数据库端口号/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai" Connection conn=DriverManager.getConnection(url,username,password); //3、执行sql String sql="insert into role values(null,'怡宝')"; Statement statement= conn.createStatement();//Statement类用于执行sql并返回结果对象,该类之能执行静态sql,容易造成sql注入 int i=statement.executeUpdate(sql); //4、关闭连接 statement.close(); conn.close(); }
2、使用PrepareStatement类,可以使用动态sql,推荐使用
public static void main(String[] args){ //1、加载驱动 Class.forName("com.MysqL.jdbc.Driver"); //Class.forName()是反射中的,通过类全限定名来找到Driver字节码文件 //2、创建连接 String url="jdbc:MysqL://localhost:数据库端口号/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai" Connection conn=DriverManager.getConnection(url,username,password); //3、预编译sql String sql="insert into role values(null,?)"; //使用 ? 来作为占位符 PrepareStatement ps= conn.PrepareStatement(sql);//PrepareStatement类用于执行sql并返回结果对象,该类之能执行动态sql ps.setobject(1,'万岁山'); //setobject(index,value):index表示是sql语句的第几个占位符,value是要向该占位符中输入的值 //4、执行sql int i=statement.executeUpdate(); //4、关闭连接 ps.close(); conn.close(); }
Ⅱ、DQL语句 (select)
在jdbc中,select语句使用executeQuery()方法
本次示例只使用PrepareStatement类来编写
public static void main(String[] args){ //1、加载驱动 Class.forName("com.MysqL.jdbc.Driver"); //2、创建连接 String url="jdbc:MysqL://localhost:数据库端口号/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"; Connection conn =DriverManager.getConnection(url,username,password); //3、预编译sql String sql="select * from role where id>?"; PrepareStatement ps=conn.PrepareStatement(sql);//获取PrepareStatement类对象 ps.setobject(1,2);//给动态sql赋值 //4、执行sql ResultSet rs=ps.execteQuery(); //ResultSet类:表示数据库查询后的数据表 System.out.println(rs); //输出rs的地址值 //5、关闭连接 rs.close(); ps.close(); conn.close(); }
2、使用List<List>来接收ResultSet中的值
public static void main(String[] args){ // 1、加载驱动 Class.forName("com.MysqL.jdbc.Driver"); // 2、创建连接 String url="jdbc:MysqL://localhost:数据库端口号/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"; Connection connection = DriverManager.getConnection(url, "root", "root"); // 3、预编译sql String sql="select * from role where id>?"; PreparedStatement ps = connection.prepareStatement(sql); //向sql中传参 ps.setobject(1,1); // 4、执行sql ResultSet resultSet = ps.executeQuery(); //ResultSet中包含数据库语句执行后的数据表对象 // 将表信息转存入到list ArrayList<List> biglists = new ArrayList<List>(); //存储整张表结构 // next():该方法是ResultSet类中的方法,用来判断是否还有下一条数据 while (resultSet.next()){ //获取数据表中的每行 ArrayList<Object> sList = new ArrayList<>(); //存储每一行数据 //getMetaData():用来获取数据表中每行的列数量,属性和类型。 //getColumnCount():获取每行的总列数 for(int i=1;i<=resultSet.getMetaData().getColumnCount();i++){ //遍历每行中的每列 Object o = resultSet.getobject(i); sList.add(o); System.out.println(sList); } biglists.add(sList); } System.out.println(biglists); resultSet.close(); ps.close(); connection.close(); }
3、使用List<Map>来存储数据表,就从ResultSet resultSet = ps.executeQuery();以下的代码有差异,本次仅修改这一部分
//创建List来存储查出来的所有数据 ArrayList<Map> mList = new ArrayList<>(); //next()方法判断数据表中是否还有下一行数据 while(resultSet.next()){ //遍历数据表中的每行 HashMap<String, Object> sMap = new HashMap<>();//使用map来存储每一行数据 //getMetaDate()检索此resultset对象中列的数量,类型和属性 //getColumnCount():得到列的数量 for(int i=1;i<=resultSet.getMetaData().getColumnCount();i++){ //检索每行中的每列 //getColumnName():得到列的名字 getobject():得到列的值 sMap.put(resultSet.getMetaData().getColumnName(i),resultSet.getobject(i)); } mList.add(sMap); }
4、使用List<对象>来存储数据表中的值,就从ResultSet resultSet = ps.executeQuery();以下的代码有差异,本次仅修改这一部分
该方法需要先创建一个和查询的数据库表相对应的实体实体类,类中的属性和表中的列名相对应
实体类:Role
public class Role implements Serializable { private int id; private String rolename; public Role() { } public Role(int id, String rolename) { this.id = id; this.rolename = rolename; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getRolename() { return rolename; } public void setRolename(String rolename) { this.rolename = rolename; } @Override public String toString() { return "Role{" + "id=" + id + ", rolename='" + rolename + '\'' + '}'; } }View Code
jdbc类的代码:
// 创建List集合来存储数据表的所有值 ArrayList<Role> roles = new ArrayList<>(); while (resultSet.next()){ // 创建对象来存储每行的值 Role role = new Role(); // 由于id存储的是int类型,getobject(index)获取每行第几列的值,得到的是Object类型,需要转换 int id=Integer.parseInt(resultSet.getobject(1)+""); role.setId(id); role.setRolename(resultSet.getobject(2).toString()); roles.add(role); }
Ⅲ、异常处理
// 提升这三个对象的作用域 Connection conn=null; PreparedStatement ps=null; ResultSet resultSet=null; try { // 1、连接驱动 Class.forName("com.MysqL.jdbc.Driver"); //2、创建连接 String url="jdbc:MysqL://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"; conn = DriverManager.getConnection(url, "root", "root"); //3、预编译sql String sql="select * from role"; ps = conn.prepareStatement(sql); //4、执行sql resultSet = ps.executeQuery(); //创建List<Map>来接收数据,先创建外层List ArrayList<Map> bigList = new ArrayList<>(); while (resultSet.next()){ HashMap<String, Object> hM = new HashMap<>();//创建map来存储每行的数据 for(int i=1;i<=resultSet.getMetaData().getColumnCount();i++){ hM.put(resultSet.getMetaData().getColumnName(i), resultSet.getobject(i)); } bigList.add(hM); } System.out.println(bigList); } catch (ClassNotFoundException e) { e.printstacktrace(); } catch (sqlException throwables) { throwables.printstacktrace(); }finally { // 5、关闭连接 try{ if(resultSet!=null){ resultSet.close(); } }catch (sqlException throwables) { throwables.printstacktrace(); }finally { try{ if(ps!=null){ ps.close(); } }catch (sqlException throwables) { throwables.printstacktrace(); }finally { try{ if(conn!=null){ conn.close(); } }catch (sqlException throwables) { throwables.printstacktrace(); } } } }View Code