Java基础-JDBC的基本操作
由于自己的记性太差了。不写出来有时候真的太容易忘记了。基础文章。代码记录文不喜勿喷
一、JDBC简介
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,
它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数 据库开发人员能够编写数据库应用程序。
二、快速入门
2.快速入门: * 步骤: 1. 导入驱动jar 包 mysql-connector-java-5.1.37-bin.jar 1.复制mysql-connector-java-5.1.37-bin.jar 到项目的libs 目录下 2. 右键--> Add As Library 2. 注册驱动 3. 获取数据库连接对象 Connection 4.定义sql 语句 5.获取执行sql 语句的对象 Statement 6.执行SQL、 接受返回结果 7.处理结果。 8.释放资源
导入jar包直接把jar包复制到IDEA中。然后右键使用Add As Library 添加为库
2.1注册驱动
Class.forName("com.mysql.jdbc.Driver");
默认是可以不需要注册驱动的,默认中是会自动的去注册驱动
2.2 DriverManager 对象
DriverManager 为驱动管理对象 【翻译文档如下】
DriverManager 最常用的方法为Connection
Connection 此方法为连接数据库的方法一般如下:
Connection root = DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "123456");
如果是本地连接。可以简化至如下:
Connection root = DriverManager.getConnection("jdbc:mysql:///test", "root", "123456");
2.4 Statement 对象
Statement 用于执行静态SQL语句并返回其生成的结果的对象。
首先需要通过Connection 对象来进行建立如下:
Statement statement = root.createStatement();
Statement 对象可以来执行SQL 语句
如下:
String sql="select user()"; ResultSet resultSet = statement.executeQuery(sql)
执行返回的是ResultSet 对象
ResultSet 对象为结果集对象 、封装查询结果集对象
此对象最常用的几个方法法为next 和 getxxx xxx 代表数据类型 int getInt() String getString()
如下:
resultSet.next(); //获取数据 int id=resultSet.getInt(1); String name = resultSet.getString("NAME"); double balance = resultSet.getDouble("balance"); System.out.println(id+"----"+name+"----"+balance); 打印结果 1----zhangsan----3000.0
整体的一个代码为:
package cn.bt.day20.demo01; import java.sql.*; public class JdbcDemo06 { public static void main(String[] args) { Statement statement=null; Connection root =null; ResultSet resultSet=null; try { Class.forName("com.mysql.jdbc.Driver"); root = DriverManager.getConnection("jdbc:mysql:///test", "root", "123456"); String sql="select * from account"; statement = root.createStatement(); resultSet = statement.executeQuery(sql); //让光标向下移动一行 while (resultSet.next()){ //获取数据 int id=resultSet.getInt(1); String name = resultSet.getString("NAME"); double balance = resultSet.getDouble("balance"); System.out.println(id+"----"+name+"----"+balance); } } catch (Exception e) { e.printStackTrace(); }finally { try { resultSet.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } try { root.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
2.5 将查询的结果封装成一个Java类对象
数据库结构如下:
emp对象类如下:
package cn.bt.day20.domain; import java.util.Date; /* 封装Emp表数据的JavaBaen */ public class Emp { private Integer id; private String ename; private Integer job_id; private Integer mgr; private Date joindate; private Double salary; private Double bouns; private Integer dept_id; @Override public String toString() { return "Emp{" + "id=" + id + ", ename='" + ename + '\'' + ", job_id=" + job_id + ", mgr=" + mgr + ", joindate=" + joindate + ", salary=" + salary + ", bouns=" + bouns + ", dept_id=" + dept_id + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public Integer getJob_id() { return job_id; } public void setJob_id(Integer job_id) { this.job_id = job_id; } public Integer getMgr() { return mgr; } public void setMgr(Integer mgr) { this.mgr = mgr; } public Date getJoindate() { return joindate; } public void setJoindate(Date joindate) { this.joindate = joindate; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } public Double getBouns() { return bouns; } public void setBouns(Double bouns) { this.bouns = bouns; } public Integer getDept_id() { return dept_id; } public void setDept_id(Integer dept_id) { this.dept_id = dept_id; } }
查看封装类
package cn.bt.day20.demo01; import cn.bt.day20.domain.Emp; import java.sql.*; import java.util.ArrayList; import java.util.List; /* 定义一个方法。查询emp表的数据将其封装为对象、然后封装集合、返回 */ public class JdbcDemo07 { /* 查看emp对象 @return */ public List<Emp> findAll(){ List<Emp> list= null; ResultSet resultSet=null; Connection conn=null; Statement statement=null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "123456"); String sql="select * from emp"; statement = conn.createStatement(); resultSet = statement.executeQuery(sql); //遍历结果集、封装对象、装载集合 Emp emp=null; list=new ArrayList<Emp>(); while (resultSet.next()){ //获取数据 int id=resultSet.getInt("id"); String ename=resultSet.getString("ename"); int job_id=resultSet.getInt("job_id"); int mgr = resultSet.getInt("mgr"); Date joindate = resultSet.getDate("joindate"); double salary = resultSet.getDouble("salary"); double bouns = resultSet.getDouble("bouns"); int dept_id = resultSet.getInt("dept_id"); emp = new Emp(); emp.setId(id); emp.setEname(ename); emp.setJob_id(job_id); emp.setMgr(mgr); emp.setJoindate(joindate); emp.setSalary(salary); emp.setBouns(bouns); emp.setDept_id(dept_id); //装载集合 list.add(emp); } } catch (Exception e) { e.printStackTrace(); }finally { try { resultSet.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } return list; } public static void main(String[] args) { List<Emp> list =new JdbcDemo07().findAll(); for (Emp emp : list) { System.out.println(emp); } System.out.println(list.size()); } }
运行结果
2.6 JDBC工具类封装
对于每次执行SQL 都需要选择数据库和查询。太过于麻烦。所以包装成一个统一的类进行操作。简化了一个流程
JDBC工具类
package cn.bt.day20.util; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.sql.*; import java.util.Enumeration; import java.util.Properties; /* JDBC 工具类 */ public class JDBCUtils { private static String url; private static String user; private static String passwwd; private static String driver; /* 文件的读取,只需要读取一次即可,拿到这些值 */ static { //读取资源文件。获取值 // Properties 集合类 Properties pro = new Properties(); try { //获取src 路径下文件的方式-->ClassLoader ClassLoader classLoader = JDBCUtils.class.getClassLoader(); URL resources = classLoader.getResource("jdbc.properties"); String path=resources.getPath(); System.out.println(path); pro.load(new FileReader(path)); // 获取数据、赋值 url =pro.getProperty("url"); user=pro.getProperty("user"); passwwd=pro.getProperty("password"); driver=pro.getProperty("driver"); Class.forName(driver); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /* 获取连接 @return 连接对象 */ public static Connection GetConnection() throws SQLException { // return DriverManager.getConnection(url, user, passwwd); } /* 释放资源 */ public static void close(Statement stmt,Connection conn){ close(null,stmt,conn); } public static void close(ResultSet rs,Statement stmt,Connection conn){ if(rs!=null){ try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } if(stmt!=null){ try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
测试工具类的代码
package cn.bt.day20.demo01; import cn.bt.day20.domain.Emp; import cn.bt.day20.util.JDBCUtils; import java.sql.*; import java.util.ArrayList; import java.util.List; /* 定义一个方法。查询emp表的数据将其封装为对象、然后封装集合、返回 */ public class JdbcDemo08 { /* 演示JDBC 工具类 */ public List<Emp> findAll2(){ List<Emp> list= null; ResultSet resultSet=null; Connection conn=null; Statement statement=null; try { conn=JDBCUtils.GetConnection(); String sql="select * from emp"; statement = conn.createStatement(); resultSet = statement.executeQuery(sql); //遍历结果集、封装对象、装载集合 Emp emp=null; list=new ArrayList<Emp>(); while (resultSet.next()){ //获取数据 int id=resultSet.getInt("id"); String ename=resultSet.getString("ename"); int job_id=resultSet.getInt("job_id"); int mgr = resultSet.getInt("mgr"); Date joindate = resultSet.getDate("joindate"); double salary = resultSet.getDouble("salary"); double bouns = resultSet.getDouble("bouns"); int dept_id = resultSet.getInt("dept_id"); emp = new Emp(); emp.setId(id); emp.setEname(ename); emp.setJob_id(job_id); emp.setMgr(mgr); emp.setJoindate(joindate); emp.setSalary(salary); emp.setBouns(bouns); emp.setDept_id(dept_id); //装载集合 list.add(emp); } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.close(resultSet,statement,conn); } return list; } public static void main(String[] args) { List<Emp> list =new JdbcDemo08().findAll2(); for (Emp emp : list) { System.out.println(emp); } System.out.println(list.size()); } }
2.7 druid 连接池
Druid: 步骤: 1.步骤导入jar包:druid-1.0.9.jar 2.定义配置文件: 1.是preoccupation 形式的 2.可以叫任意名称,可以放在任意目录下 3.获取数据库连接池对象: 通过工厂类获取 DruidDataSourceFactroy 加载配置文件: Properties pro = new Properties(); InputStream resourceAsStream = druiddemo.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(resourceAsStream); DataSource dataSource = DruidDataSourceFactory.createDataSource(pro); Connection connection = dataSource.getConnection(); 4. 获取连接:getConnection
对于druid 的配置文件可以放在项目路径下。随便去一个名字都可以。
格式如下:
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/test username=root password=123456 #初始化的连接数 initialSize=5 #最大连接数 maxActive=10 #超时时间 maxWait=3000
测试druid 连接池
package cn.bt.day20.demo02; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.util.Properties; /* druid 演示 */ public class druiddemo { public static void main(String[] args) throws Exception { //1.导入jar包 //2.定义配置文件 //获取连接池对象 Properties pro = new Properties(); InputStream resourceAsStream = druiddemo.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(resourceAsStream); DataSource dataSource = DruidDataSourceFactory.createDataSource(pro); Connection connection = dataSource.getConnection(); System.out.println(connection); } }
对于单独每次都需要去申请连接池,这样对于操作太过于麻烦。这里也采用工具类的方式来进行操作druid 的连接池
package cn.bt.day20.util; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /* Druid 连接池的工具类 */ public class JDBCutils2 { //1.定义一个成员变量DataSource private static DataSource ds; static { //加载配置文件 try { Properties pro = new Properties(); pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); ds= DruidDataSourceFactory.createDataSource(pro); } catch (Exception e) { e.printStackTrace(); } } //获取连接 public static Connection getConnection() throws SQLException { return ds.getConnection(); } //释放资源 public static void close(Statement stmt, Connection conn){ close(null,stmt,conn); } public static void close(ResultSet rs, Statement stmt, Connection conn){ if(rs!=null){ try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } if(stmt!=null){ try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } public static DataSource getDataSource(){ return ds; } }
测试连接池
package cn.bt.day20.demo02; import cn.bt.day20.util.JDBCUtils; import cn.bt.day20.util.JDBCutils2; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; /* 使用新的工具类 */ public class DruidDemo02 { public static void main(String[] args) { /* 完成一个添加的操作 */ Connection conn=null; PreparedStatement pstmt=null; try { conn = JDBCutils2.getConnection(); String sql="insert into account values(null,?,?)"; //获取pstmt对象 pstmt=conn.prepareStatement(sql); pstmt.setString(1,"qqq"); pstmt.setDouble(2,1000); int i = pstmt.executeUpdate(); System.out.println(i); } catch (SQLException throwables) { throwables.printStackTrace(); }finally { JDBCutils2.close(pstmt,conn); } } }
2.8 Spring JDBC
Spring框架对JDBC 简答封装,提供了一个JDBCtemplate 对象简化JDBC的开发
步骤: 1.导入jar包 2.创建JdbcTemplate对象、依赖于数据源DataSource JdbcTemplate temp=new JdbcTemplate(ds) 3.调用JdbcTemplate的方法来完成CRUD的操作 update() 执行DML语句,增删改语句 queryForMap() :查询结果将结果集封装为map集合 queryForList() :查询结果将结果集封装为list集合 query():查询结果将结果集封装为javaBean对象 queryFroObject() :查询结果、将结果封装为对象
druid 连接池+jdbctemplate
package cn.bt.day20.jdbctemple; import cn.bt.day20.util.JDBCutils2; import org.springframework.jdbc.core.JdbcTemplate; /* Jdbctemplate 入门 */ public class jdbctempleDemo01 { public static void main(String[] args) { //1.导入jar包 //创建JdbcTemplate 对象 JdbcTemplate template = new JdbcTemplate(JDBCutils2.getDataSource()); //调用方法 //定义一个sql String sql="update account set balance=5000 where id=?"; int update = template.update(sql, 3); System.out.println(update); } }
各种增删查改
package cn.bt.day20.jdbctemple; import cn.bt.day20.domain.Emp; import cn.bt.day20.util.JDBCutils2; import org.junit.Test; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import java.lang.annotation.Target; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Date; import java.util.List; import java.util.Map; public class JDBCtempleDemo02 { private JdbcTemplate template =new JdbcTemplate(JDBCutils2.getDataSource()); public static void main(String[] args) { //Junit单元测试,可以让方法独立执行 } /* 1.修改1号数据的salary 为10000 */ @Test public void test1(){ //获取JDBC Template对象 JdbcTemplate template=new JdbcTemplate(JDBCutils2.getDataSource()); //定义SQL String sql="update emp set salary=10000 where id=1001"; //执行sql int count=template.update(sql); System.out.println(count); } @Test public void test2(){ String sql="insert into emp(id,ename,job_id,mgr,joindate,salary,bouns,dept_id) values(1015,'郭靖',2,1004,'2021-03-7',1000,234,10)"; int count=template.update(sql); System.out.println(count); } @Test public void test3(){ String sql="delete from emp where id=?"; int count=template.update(sql,1015); System.out.println(count); } @Test public void test4(){ String sql="select * from emp where id=?"; Map<String, Object> stringObjectMap = template.queryForMap(sql, 1001); System.out.println(stringObjectMap); } @Test public void test5(){ String sql="select * from emp"; List<Map<String, Object>> maps = template.queryForList(sql); System.out.println(maps); } @Test public void test6(){ String sql="select * from emp"; List<Emp> query = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class)); System.out.println(query); } @Test public void test7(){ String sql="select count(id) from emp"; Long aLong = template.queryForObject(sql, Long.class); System.out.println(aLong); } }