
视图
格式 : 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条)