Day04笔记
一、JDBC
1.理解
**jdbc:**java database connectivity java与数据库的连接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4oDcw25o-1581080407101)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1581072073736.png)]
2.角色分类
服务器(db): a)、接收 sql b)、执行 sql c)、返回结果
**客户端(java):**a)、接收数据 b)、组装sql c)、发送SQL(与数据库建立联系)d)、分析结果
3.面向接口编程
接口名称 作用 java.sql.Connection 连接 java.sql.Statement 静态处理块 java.sql.PreparedStatement 预处理块 java.sql.ResultSet 结果集 java.sql.ResultSetMetaData 结果集元信息
二、JDBC使用
1.连接
1)准备工作
1.1先去Oracle数据库安装路径下,获取到ojdbc6.jar 拿到项目中,新建一个资源文件夹,objc6.java放进去
2.2点击右键build path->add to build path
2.步骤
java基本流程:
- 1.加载驱动
- 2.获取连接
- 3.准备sql语句
- 4.获取处理块
- 5.执行完毕的结果,接收结果集
- 6.处理数据
- 7.关闭
public class JDBCDemo01 { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.加载驱动 Class.forName("oracle.jdbc.OracleDriver"); //2.获取连接 Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","SCOTT","TIGER"); //3.准备sql语句(select 语句不能添加分号;) String sql="select deptno,dname from dept"; //4.获取处理块 Statement state=conn.createStatement(); //5.执行完毕的结果,接收结果集 ResultSet result=state.executeQuery(sql); //6.处理数据 while(result.next()){ //得到索引 int i=result.getInt(1); String name=result.getString("dname"); System.out.println(i+"-->"+name); } } }
3.优化步骤
优化:
1.异常
2.数据库配置信息使用配置动态读取
public class JDBCDemo02 { public static void main(String[] args){ //创建文件对象 Properties pro=new Properties(); //加载流,读取文件信息 try { pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //1.加载驱动 try { Class.forName(pro.getProperty("driver")); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //2.获取连接 Connection conn=null; Statement state=null; ResultSet result=null; try { conn = DriverManager.getConnection( pro.getProperty("url"), pro.getProperty("name"), pro.getProperty("pwd")); //3.准备sql语句(select 语句不能添加分号;) String sql="select deptno,dname from dept"; //4.获取处理块 state=conn.createStatement(); //5.执行完毕的结果,接收结果集 result=state.executeQuery(sql); //6.处理数据 while(result.next()){ //得到索引 int i=result.getInt(1); String name=result.getString("dname"); System.out.println(i+"-->"+name); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //7.关闭 try { if(result!=null){ result.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(state!=null){ state.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(conn!=null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
三、用户登录 、转账(事务 默认提交)
1.案例
public class JDBCDemo02 { public static void main(String[] args){ //创建文件对象 Properties pro=new Properties(); //加载流,读取文件信息 try { pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //1.加载驱动 try { Class.forName(pro.getProperty("driver")); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //2.获取连接 Connection conn=null; Statement state=null; ResultSet result=null; try { conn = DriverManager.getConnection( pro.getProperty("url"), pro.getProperty("name"), pro.getProperty("pwd")); //3.准备sql语句(select 语句不能添加分号;) String sql="select deptno,dname from dept"; //4.获取处理块 state=conn.createStatement(); //5.执行完毕的结果,接收结果集 result=state.executeQuery(sql); //6.处理数据 while(result.next()){ //得到索引 int i=result.getInt(1); String name=result.getString("dname"); System.out.println(i+"-->"+name); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //7.关闭 try { if(result!=null){ result.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(state!=null){ state.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(conn!=null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } }
2.数据库通用访问对象
1.增删改的功能 2.查询的功能 /* - 可变参数 相同的数据类型的0~多个参数 - 1.数据类型 ... 参数名,0~n个 - 2.必须定义在参数列表的最后 - 3.通过数据的操作方式去使用,会隐式的为可变参数定义一个数组 */ public class BaseDao<T> { //查询 //返回值List 参数:sql 值 public List<T> testQuery(String sql,Class<T> cls,Object...args){ List<T> ls=new ArrayList(); boolean flag=false; Connection conn=null; PreparedStatement state=null; ResultSet result=null; ResultSetMetaData meta=null; try { conn=DBUtils.getConnection(); state=conn.prepareStatement(sql); //为?赋值 if(args!=null&&args.length!=0){ for(int i=0;i<=args.length-1;i++){ state.setObject(i+1, args[i]); } } //结果集 result=state.executeQuery(); //结果集原信息对象 meta=result.getMetaData(); int columnNum=meta.getColumnCount(); while(result.next()){ //能够进入循环就有一个对象 T t=cls.newInstance(); //默认调用空构造 for(int i=1;i<=columnNum;i++){ //2.从结果集中获取这条每一个字段的值 Object value=result.getObject(i); //从1开始 //3.获取对应java类中的对应属性 String name=meta.getColumnLabel(i); //1.创建一个对应类型的成员属性 getDeclaredField(String name) Field field=cls.getDeclaredField(name); field.setAccessible(true); //设置值 //4.给这个属性赋值 field.set(t,value); field.setAccessible(false); } //5.把对象放入list容器 ls.add(t); } } catch (SQLException e) { e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ DBUtils.close(result,state, conn); } return ls; } //增删改 public boolean testUpdate(String sql,Object ... args){ boolean flag=false; Connection conn=null; PreparedStatement state=null; try { conn=DBUtils.getConnection(); state=conn.prepareStatement(sql); //防止sql注入,预编译提高效率 //为?赋值 for(int i=0;i<=args.length-1;i++){ state.setObject(i+1, args[i]); } int row=state.executeUpdate(); if(row>0){ flag=true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ DBUtils.close(state, conn); } return flag; } }
public class Test { public static void main(String[] args) { BaseDao<User> base=new BaseDao<User>(); //String sql="insert into sxt_user values(haha.nextval,?,?)"; // boolean flag=base.testUpdate(sql, "laopei",123); /*String sql="delete from sxt_user where id=?"; boolean flag=base.testUpdate(sql,103); if(flag){ System.out.println("操作成功"); }else{ System.out.println("操作失败"); }*/ String sql2="select uname \"uname\" from sxt_user"; List<User> ls=base.testQuery(sql2, User.class); System.out.println(ls); } }