方便的小技巧:产生目标和目标a
******source-----generate getters and settersa
package cn.tedu.jdbc; public class Emp { private int id; private String name; private int deptId; public Emp() { super(); // TODO Auto-generated constructor stub } public Emp(int id, String name, int deptId) { super(); this.id = id; this.name = name; this.deptId = deptId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getDeptId() { return deptId; } public void setDeptId(int deptId) { this.deptId = deptId; } @Override public String toString() { return "Emp [id=" + id + ", name=" + name + ", deptId=" + deptId + "]"; } }
//背
**where子句和having子句都可以进行过滤, 但是使用场景有所不同:
* where子句对分组之前的数据进行过滤,不能使用聚合函数和别名
* having子句对分组之后的数据进行过滤,可以使用聚合函数和别名
* 使用where子句的地方一般都可以用having替代,但是使用having的地方一般不能用where替代
导出sql文件:mysqldump -uroot -p mydb1 >d:/1.sql
输入sql文件:mysql -uroot -p mydb2 <d:/mysql1.sql
-- (一个空格):注释
逗号连接
外连接
内连接
String url="jdbc:mysql://localhost:3306/mydb1";
String user="root";
String passwoed="root";
String sql="selet * from orders";
1.注册JDBC驱动程序;
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
e.prinStackTrace();
}
2.建立到DB连接;
Connection conn=DriverManager.getConnection(url,user,password);
3.创建SQL执行器;
Statement st=conn.createStatement();
4.执行SQL语句;
ResultSet rs=st.executeQuery(sql);
5.对结果集进行操作(如有);
while(rs.next()){
//当调用了rs.next()方法之后,rs中保存的是一行
int id =rs.getInt("id");
String name =rs.getString("name");
double chinese=rs.getDouble("chinese");
double math=rs.getDouble("math");
System.out.println();
}
6.关闭连接,释放资源;
一.JDBC
===============================================================
1.1.JDBC的概念: (掌握)
1.1.1.数据库驱动: 数据库厂商提供的用来操作数据库的jar包
1.1.2.JDBC: 由于不同的数据库厂商提供的数据库驱动各不相同,
导致开发人员的学习成本十分的高, 于是sun公司提供了一套用来统一访问数据库的标准,
其实就是一大堆的接口, SUN公司要求各个数据库厂商设计的jar包都要实现这套接口,
因此开发人员只需要学会这套接口, 所有的数据库驱动就都会使用了.
1.1.3.JDBC目前已经被加入到了javase的技术范畴,
这意味着一个基本的java工程就具有JDBC相关的jar包(java.sql/javax.sql).
1.1.4.注意: jdbc只是一套接口,具体操作数据库的代码都在接口的实现类中,
也就是数据库驱动中,开发时还是要导入具体的数据库驱动.
1.2.六个步骤实现JDBC程序 (!!掌握)
//1.注册数据库驱动
//2.获取数据库连接
//3.获取传输器对象
//4.利用传输器传输SQL到数据库执行,获取结果集对象
//5.遍历结果集,获取结果数据
//6.关闭资源
1.3.JDBC的增删改查(略) (!!掌握)
1.4.PreparedStatement (!!掌握)
Sql注入攻击: 由于后台的sql语句是拼接而来的, 其中的参数是用户提交的,
如果用户在参数中添加了一些sql关键字或者是特殊字符, 就可能改变sql语句的原意,
从而执行意外的操作
PreparedStatement优点:
(1)可以防止sql注入攻击, 采用预编译机制, 先将sql语句的主干发送数据库,
数据库编译后就确定了sql语句的语意, 如果后面参数中再包含sql关键字或者是特殊字符,
也只会当作普通的字符来处理!!!
(2)通过方法来设置参数, 省去了拼接sql语句的麻烦.
(3)能够尽最大可能来提高效率. PreparedStatement发送的sql语句编译后就被数据库缓存下来了,
再次执行时, 如果和缓存中的匹配就会使用缓存中的语句, 不再编译, 直接执行.
statement发送的sql语句是先拼接好再发送给数据库,
由于参数不同整条sql语句也就不同, 所以每次都需要编译.
===============================================================
二.批处理 (掌握)
2.1.批处理
如果有大量的sql语句要到数据库执行, 如果一条一条发送, 有多少条就要发送多少次, 效率低下.
可以将这些sql语句打成一个批, 一次性发送给数据库, 数据库收到后打开批, 依次执行,
减少了发送sql语句次数, 从而提高程序执行的效率.
2.2.Statement方式来实现批处理
优点:
可以包含结构不同的sql语句
缺点:
不能防止sql注入攻击
没有预编译机制, 效率低下
如果发送的sql语句主干部分相同, 主干部分每次都需要写.
2.3.PreparedStatement方式实现批处理
优点:
可以防止sql注入攻击
采用预编译机制, 效率高
如果发送的sql语句主干部分相同, 主干部分只需要写一次, 每次发送的只是参数部分.
缺点:
包含的sql语句的主干部分必须相同
===============================================================
三.连接池
3.1.自定义连接池 (!!重要)
对一个方法进行改造:
3.1.1.继承 -- 不能对已有的对象上的方法进行改造
定义一个类继承被改造者所属的类, 在子类中覆盖父类中的方法来实现方法的改造
3.1.2.装饰设计模式
如果需要对已有对象上的方法进行改造, 可以定义类将被装饰者传入, 基于已有的功能, 添加更强的功能
那么这个自定义的类就是装饰类. 装饰类通常会提供构造函数将被装饰者传入,
并保存在类的内部, 基于已有对象上的功能, 添加更强的功能
实现步骤:
a) 定义装饰类, 装饰类要求和被装饰者所属的类实现相同的接口或者是继承相同的类
b) 在装饰类中, 通过构造方法将被装饰者传入, 保存在类的内部
c) 对于不想改造的方法, 直接调用已有对象上的方法, 对于想要改造的方法进行改造
3.2.开源数据库连接池 (!!掌握)
3.2.1.C3P0连接池应用
(1).导入开发包
(2).创建数据库连接池
ComboPooledDataSource cpds = new ComboPooledDataSource();
(3).配置基本的连接信息
a) 通过setters方法来设置参数
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql:///mydb5");
cpds.setUser("root");
cpds.setPassword("root");
b) 通过c3p0-config.xml文件来配置基本连接信息
提供c3p0-config.xml文件, 放置在程序source目录下, 在文件中添加如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///mydb1</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>
c) 通过c3p0.properties文件来配置基本连接信息
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:///mydb1
c3p0.user=root
c3p0.password=root
package cn.tedu.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo2 { public static void main(String[] args) { String url="jdbc:mysql:///mydb1"; // 写成 3个/ 是可以省略 /localhost:3306 String user="root"; String password="root"; String sql="select * from exam where name='张飞'"; // 1. 注册驱动 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 2. 建立连接 Connection conn=null; Statement st=null; ResultSet rs=null; try { conn=DriverManager.getConnection(url, user, password); // 3. 建立SQL执行器 st=conn.createStatement(); rs=st.executeQuery(sql); rs.next(); // int id=rs.getInt(1);//初始列下标从1开始 int id=rs.getInt("id"); String name=rs.getString("name"); double chinese=rs.getDouble("chinese"); double math=rs.getDouble("math"); double english=rs.getDouble("english"); System.out.println(id+","+name+","+chinese+","+math+","+english); } catch (SQLException e) { e.printStackTrace(); }finally{ JDBCUtils.releaseResource(rs, st, conn); } // url 统一资源定位符 // jdbc:mysql://localhost:3306/mydb1 // 协议 http:// // ftp // 主机域名(ip地址) // 端口号 // 资源路径 // c:/image/image1.jpg // 4. 执行SQL语句 // 5. 对结果集进行处理 // 6. 关闭连接,释放资源 } }
1 package cn.tedu.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 public class JDBCDemo1 { 10 11 /** 12 * @param args 13 * @throws SQLException 14 */ 15 public static void main(String[] args) throws SQLException { 16 String url="jdbc:mysql://localhost:3306/mydb1"; 17 String user="root"; 18 String password="root"; 19 String sql="select * from exam"; 20 21 22 //1. 注册驱动 23 try { 24 Class.forName("com.mysql.jdbc.Driver"); 25 } catch (ClassNotFoundException e) { 26 e.printStackTrace(); 27 } 28 //2. 建立连接 29 Connection conn=DriverManager.getConnection(url, user, password);//连接conn=驱动程序管理器。获取连接(URL、用户、密码); 30 //3. 建立SQL执行器 31 Statement st=conn.createStatement();//报表st=conn.创建报表 32 //4. 执行SQL语句 33 ResultSet rs=st.executeQuery(sql);//结果设置RS=st.执行查询 34 //5. 对结果集进行操作(如有) 35 while(rs.next()){ 36 //当调用了rs.next()方法之后,rs中保存的是一行数据 37 int id=rs.getInt("id"); 38 String name=rs.getString("name"); 39 double chinese=rs.getDouble("chinese"); 40 double math=rs.getDouble("math"); 41 System.out.println("id="+id+",name="+name+",chin="+chinese+",math="+math); 42 } 43 //6. 关闭连接,释放资源 44 rs.close(); 45 st.close(); 46 conn.close(); 47 } 48 49 }
package cn.tedu.jdbc; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo3 { public static void main(String[] args) { String sql="insert into exam values(null,'刘能',100,99,60)"; Connection conn=JDBCUtils.getConnection(); Statement st=null; try { st=conn.createStatement(); int i=st.executeUpdate(sql); System.out.println((i==1?"成功":"失败")); } catch (SQLException e) { e.printStackTrace(); }finally{ JDBCUtils.releaseResource(null, st, conn); } } }
package cn.tedu.jdbc; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo4 { /** * @param args */ public static void main(String[] args) { String sql="update exam set name='赵四' where name='刘能'"; Connection conn=JDBCUtils.getConnection(); Statement st=null; try { st=conn.createStatement(); int i=st.executeUpdate(sql); System.out.println((i==1?"更新成功":"更新失败")); } catch (SQLException e) { e.printStackTrace(); }finally{ JDBCUtils.releaseResource(null, st, conn); } } }
package cn.tedu.jdbc; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo5 { /** * @param args */ public static void main(String[] args) { String sql="delete from emp where name='刘能'"; Connection conn=JDBCUtils.getConnection(); Statement st=null; try { st=conn.createStatement(); int i=st.executeUpdate(sql); System.out.println((i==1?"删除成功":"删除失败")); } catch (SQLException e) { e.printStackTrace(); }finally{ JDBCUtils.releaseResource(null, st, conn); } } }
package cn.tedu.jdbc; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo6 { /** * @param args */ public static void main(String[] args) { Emp emp1=new Emp(-1, "张飞", 2); int i=insertEmp(emp1); System.out.println((i==1?"插入成功":"插入失败")); } public static int insertEmp(Emp emp){ Connection conn=JDBCUtils.getConnection(); Statement st=null; int i=-1; try { st=conn.createStatement(); StringBuilder sb=new StringBuilder(); sb.append("insert into emp values(null,"); sb.append(emp.getName()).append(","); sb.append(emp.getDeptId()).append(")"); System.out.println(sb.toString()); i=st.executeUpdate(sb.toString()); } catch (SQLException e) { e.printStackTrace(); }finally{ JDBCUtils.releaseResource(null, st, conn); } return i; } }
package cn.tedu.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCUtils { private static String url="jdbc:mysql:///mydb1"; // 写成 3个/ 是可以省略 /localhost:3306 private static String user="root"; private static String password="root"; static{ try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection(){ Connection conn=null; try { conn=DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static void releaseResource(ResultSet rs,Statement st,Connection conn){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(st!=null){ try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
package cn.tedu.jdbc; public class Emp { private int id; private String name; private int deptId; public Emp() { super(); // TODO Auto-generated constructor stub } public Emp(int id, String name, int deptId) { super(); this.id = id; this.name = name; this.deptId = deptId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getDeptId() { return deptId; } public void setDeptId(int deptId) { this.deptId = deptId; } @Override public String toString() { return "Emp [id=" + id + ", name=" + name + ", deptId=" + deptId + "]"; } }