视图
格式 : creat view 视图名 as 查询的sql语句
视图通常用来查 比如一些效率低的模糊查询不能使用索引,就可以创建视图
好处:提高了sql语句的复用性,解决了业务表的繁杂性,被所有人共享
坏处:视图是一张表,里面是重复的数据,“浪费空间”, 视图创建成功后,无法被优化,数据更新时,视图不便于更新
批量插入 事务由两种管理方式第二种手动管理事务,必须有两个过程: 开启事务 … 结束事务(commit / rollback)
当需要插入多条事务时,需要多次结束事务,所以使用批量插入,只需要一次事务管理
三范式
第一范式: 1NF, 是指 表里的字段值不能再被分割了
第二范式: 2NF, 是指 遵循了1NF的基础上,再遵循2NF.
是指 表里都应该设计主键字段(主属性),
其他的非主属性,应该都围绕着主属性展开描述.
第三范式: 3NF, 是指 遵循了前两范式
是指 字段之间的依赖性是直接的,而不是还要间接的产生依赖,导致查询关闭变得复杂
向数据库添加一条数据
public class Test10 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //获取连接 String url="jdbc:mysql://localhost:3306/cgb211101?characterEncoding=utf8"; Connection c = DriverManager.getConnection(url, "root", "root"); System.out.println("连接成功"); //获取传输器 Statement s = c.createStatement(); //在java中执行sql语句 s.executeUpdate("insert into dept values (null,'蜘蛛侠','皇后区')"); System.out.println("数据输入成功"); } }
模拟用户登录
public class Test11 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //连接 String url="jdbc:mysql://localhost:3306/cgb211101?characterEncoding=utf8"; Connection c = DriverManager.getConnection(url, "root", "root"); System.out.println("连接成功"); //获取传输器 Statement s = c.createStatement(); System.out.println("请输入您的账号"); String a = new Scanner(System.in).nextLine(); System.out.println("请输入您的密码"); String b = new Scanner(System.in).nextLine(); String sql="select*from dept where dname='"+a+"' and loc='"+b+"' "; //结果集 ResultSet r = s.executeQuery(sql); //处理结果集 if (r.next()){ System.out.println("恭喜您登录成功"); }else{ System.out.println("登录失败"); } c.close(); r.close(); s.close(); } }
解决SQL攻击的问题 ,使用新的传输器
public class Test12 { public static void main(String[] args) throws Exception { //旧的传输器 creatStatement 不够安全,用户通过 '#就可以不用输入密码 //更换新的传输器 prepareStatement //创建驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //获取连接 String url="jdbc:mysql://localhost:3306/cgb211101?characterEncoding=utf8"; Connection c = DriverManager.getConnection(url,"root","root"); //获取新的传输器 Statement s = c.createStatement(); System.out.println("请输入您的账号"); String a = new Scanner(System.in).nextLine(); System.out.println("请输入您的密码"); String b = new Scanner(System.in).nextLine(); String sql="select*from user where name=? and pwd=?"; PreparedStatement p = c.prepareStatement(sql); p.setString(1,a); p.setString(2,b); //定义结果集 ResultSet r = p.executeQuery(); if (r.next()){ //判断是否有下一个数据 System.out.println("账户登录成功"); }else{ System.out.println("账户登录失败"); } c.close(); p.close(); s.close(); } }
创造一个工具类
public class JDBCUtils1 { static public Connection run() throws Exception { //注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/cgb211101?characterEncoding=utf8"; Connection c = DriverManager.getConnection(url, "root", "root"); System.out.println("连接成功"); return c; } static public void play(Connection c ,PreparedStatement p, ResultSet r){ if (p!=null) { try { p.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (c!=null) { try { c.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (r!=null) { try { r.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
利用新的传输器结合着工具类,新增一个用户信息
public class Test13 { public static void main(String[] args) throws Exception { //方法是静态方法,通过类名直接调用 Connection c = JDBCUtils1.run(); //获取新的传输器 String sql="insert into user values(null,?,?)"; PreparedStatement p = c.prepareStatement(sql); p.setString(1,"super"); p.setString(2,"777"); //输出sql p.executeUpdate(); System.out.println("写入成功"); //关闭资源 c.close();//关闭连接器 p.close();//关闭传输器 } }
利用新的传输器结合着工具类,新增一个用户信息
public class Test14 { public static void main(String[] args) { Connection c =null; PreparedStatement p =null; try { //调用工具类方法获取连接 c=JDBCUtils1.run(); //获取新的连接器 需要传入参数 String sql="insert into user values(null,?,?)"; p= c.prepareStatement(sql); //设置参数内容 p.setString(1,"sman"); p.setString(2,"258"); //执行sql语句 p.executeUpdate();//执行增删改的SQL,返回一个影响行数(通常不处理) System.out.println("数据入库成功"); } catch (Exception e) { e.printStackTrace(); System.out.println("数据异常"); }finally { JDBCUtils1.play(c,p,null); } } }
利用新的传输器结合着工具类,查询用户信息
public class Test15 { public static void main(String[] args) { Connection c =null; PreparedStatement p =null; ResultSet r =null; try { //获取工具类中的run方法 c = JDBCUtils1.run(); //获取新的传输器 高效,安全 需要传参数 String sql ="select*from user where name=? "; p = c.prepareStatement(sql); //设置要查询的字段值 p.setString(1,"jack"); //执行sql语句 并返回结果,交给 ResultSet类型的变量 r保存 r = p.executeQuery(); //处理返回的结果集 while (r.next()){ Object id = r.getObject("id"); Object name = r.getObject("name"); Object pwd = r.getObject("pwd"); System.out.println(id+":"+name+pwd); } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils1.play(c,p,r); } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)