Java代码一执行,sql语句显示到控制台
操作数据库的标准规范 Java database connectivity
Java语言来操作数据库 J DB C
JDBC 数据库驱动
接口(规范)------实现类 (*驱动*)------各类数据库
************程序员不需要关心驱动,只需要会JDBC这个接口
(数据库很多,oracle,mysql)
Client.java(客户端)============数据库DB===========控制台
Select语句从客户端出发,到达DB,再到控制台
用statement(车),通过connection(桥)---------------statement返回,装ResultSet
ResultSet是客户端的在内存里的一个对象,装DB里返回的数据
如何添加Jar包
Lib 下面有mysql-connector-5.0.8-java-bin.jar
Build path
ADD to build path classpath路径
接口 JDK中 java.sql.* javax.sql.*
驱动,是实现类-------------jar包
JDBC规范(掌握四个核心对象):
DriverManager:用于注册驱动 类
Connection: 表示与数据库创建的连接 接口 接口的实现在数据库驱动中
Statement: 操作数据库sql语句的对象 接口
ResultSet: 结果集或一张虚拟表 接口 (封装结果集)
*****需要加入所需要的厂商的jar包 ****构建path
3、实现JDBC操作
//1、注册驱动 加载类
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//2、创建连接 drivemanger创建connection
Connection conn=DriverManger.getConnection
//能用接口就别用实现类(conection有sun公司的接口和mysql的实现类)
(“jdbc mysql//localhost:3306/day06’’, ’’root”,”root”)
(jdbc:mysql: //local: 3306 / DAY06) (数据库名)(密码)
协议: 连接mysql: ip地址127.0.0.1端口号 数据库
//3、得到执行sql语句的Statement对象 statement 将sql发送到DB
Statement smt=conn.createStatement();
//4、执行sql语句,并返回结果 由statement,将table换成resultset
ResultSet = Smt.executeQuery(“select*from users”);
//Query查询//能用接口就别用实现类
//5、处理结果
While(rs.next()){ //列:字段 //行:对象
rs.getObject(1);
rs.getObject(2);
rs.getObject(3);
};
//6关闭资源
Rs.close();stmt,close();conn.close() //关闭三个接口
修改
DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用
原因有2个:
> 导致驱动被注册2次。 里面有静态代码块
> 强烈依赖数据库的驱动jar mysql
解决办法:
解决方法:Class.forName("com.mysql.jdbc.Driver");
static Connection getConnection(String url, String user, String password)
试图建立到给定数据库 URL 的连接。
getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");
URL:SUN公司与数据库厂商之间的一种协议。
jdbc:mysql://localhost:3306/day06
协议 子协议 IP :端口号 数据库
jdbc:mysql:///day14(默认本机连接)
oracle: jdbc:oracle:thin:@localhost:1521:sid
修改2
解决方法
原来用Connection conn=DriverManger.getConnection
(“jdbc :mysql//localhost:3306/day06’’, ’’root”,”root”);
方法1 ******不常用
getConnection(String url, Properties info)
1 Properties info = new Properties();//要参考数据库文档 //map集合,hashtable
//用来操作属性字段文件//
2 info.setProperty("user", "root"); //两个都是字符串
//参考 mysql 5.1文档------26.连接器---JDBC的引用
3 info.setProperty("password","root");
4 Connection conn=DriverManger.getConnection
(“jdbc :mysql//localhost:3306/day06’’, info);
或者
1
方法二******不常用
getConnection(String url)
1 DriverManager.getConnection("jdbc:mysql://localhost:3306/day14?user=root&password=root");
模拟url传值的方式
}
修改3
不用
While(rs.next()){
rs.getObject(1);rs.getObject(2);rs.getObject(3);rs.getObject(3);rs.getObject(5);
}
//可以用getObject(’’passworld’’); 这样的话顺序就不会颠倒了
//可以用getObject(’’id’’);
*首先
Public class User {
Private 各列的类型 各列名
生成set/get方法等一系列 //右键选择GGaS select All 会把所有的方法打出来
}
*创建一个list
**修改内容 while(rs.next()){
User u =new User(); //必须放在for循环里面,放在for循环上面会被覆盖,三行一模一样的数据
//会出现list装了n个对象,但是地址值一样
u.setId(rs.getId(‘id’));
``````````````````````````
List.add(u);
}
***最后用for循环输出
修改4
使用的是int executeUpdate(String sql)
更换后
Int i=Stms.executeUpdate(“InsertXXXXXXX ”);
If(i>0){
System.out.println(“success”);
}
删除ResultSet 语句
删除re.close
Connection是DriverManager创建的
Statement 是Connection创建的
Connection是一个接口,接口的实现类在数据库的驱动中-----------mysql的jar包
作用:和数据库交互,基于Connection
Statement 接口,同样实现类在数据库的驱动中---------------
作用:操作sql语句,载着ResultSet返回相应结果
关于修改顺序会导致出现的问题 JVM
//细讲
Int x 变量名
User u 对象名
u 中间变量 对象名 地址值1
地址值2
List 地址值3
u
u
u
List
User u=new users();
While(){ 循环三次的话
list.add(u)}
得到的是:u=地址值0011
每次u.set??? 都会覆盖前值,地址值不变
(u的地址值里的值不断变化,u的地址值不变)
List列表里有3个u,地址都是0011。
(答应出来的u都相同)
List
While(){
User u=new users();
list.add(u)}
有3个u,有三个地址,0011,0111,1111
Object x=new User();
Object y=new User();
System.out.println(x);
System.out.println(y); //重写了toString方法
System.out.println(x.equals(y)); //false
因此new一次 地址值只有一个(只在堆内创建一个)
List里面是 地址值1 地址值1 地址值1
New多次 地址值有几个(在堆内创建多个)u被赋予的地址值不断被变化
List 里面是 地址值1 地址值2 地址值3
Junit 3个方法写到一个类里面是不可以的
(写一个类,可以执行好多个方法)
********@test---需要导包 add Junit4 *****(下载)library to build path
主题内容如下 //测试方法要求不能有 返回值,不能给 参数
Import org.junit.Assert;
Import org.junit.test;
Public class Testcalc{
@TEST //其实也是一个类
Public void test1(){ //选中test 右键 run as
新建另一个class中的对象 c
C.add(3,5);
Assert.assertEquals(8,c.add) //期望值是8,测试是否相符合
}
JDBC最终成型样式
//加载驱动
Class.forname(“com.heima.jdbc.Driver”);
***//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//获取连接connection
Connection conn=Driver.getconnection(“jdbc:mysql:localhost:3306/day06”,”root”,”root”);
//得到操作数据库sql的statement
Statement stmt=Conn.createStatement();
//执行sql语句
***//String sql=”select id,name,password,email,birthday from users”;
***//Result rs=stmt.executeQuery(sql);
Result rs=stmt.executeQuery(”select id,name,password,email,birthday from users”)
List
//结果返回处理数据
***//While(rs.next()){
***//System.out.println(rs.getObject(“id”));
***//System.out.println(rs.getObject(2));
***//System.out.println(rs.getObject(3));
***//System.out.println(rs.getObject(4));
***//System.out.println(rs.getObject(5));
User u=new User();
U.setId(rs.getInt(“id”));
U.setName(rs.getString(“name”));
U.setPassword(rs.getString(“password”));
List add(u);
}
总结:
//加载驱动, class.forName(com.mysql.jdbc.driver());
//反射机制//靠类的全路径来加载//放到配置文件里
//数据库改变换配置文件
获取连接,
Connection conn=Drivermanager.getConnection(“jdbc:mysql//localhost:3306/day06”,”user”,”abc”)
得到执行sql的对象Statement,
preparedStatement ps =Conn.prepareStatement(“select *from WHERE name=?”);
ps.setInt(1,1);
执行sql语句并返回结果 //不用放入参数了,因为参数已经预编译好了
ResultSet =Ps.executeQuery();
处理结果
取值,if(rs.next()){}
关闭资源
总结
一Java语言操作数据库的一种规范
4个核心对象
DriverManger java.sql.DriverManger
Connection接口 java.sql.Connection
Statement接口 java.sql.PreparedStatement
ResultSet接口 java.sql.ResulrSet
DriverManger java.sql.DriverManger
RegisterDriver(new com.mysql.jdbc Driver())本质是new Driver()
//需要注册2次//依赖性强
Class.forname() new com.mysql.jdbc Driver()
getConnection(url,user,password)
Connection接口 java.sql.Connection
createStatement()
Ps=prepareStatement(“select* from users WHERE id=?”); //没有d
Ps.SetInt(1,3)
Statement接口 java.sql.PreparedStatement(会先编译,过滤关键词,效率高)
ResultSet executeQuery(sql) select语句
Int executeUpdate() insert/update/delete
Boolean execute 执行select,并且有结果集
ResultSet接口 java.sql.ResulrSet
处理结果
Boolean next() 游标向下移动一行
get int(int columnIndex)根据索引, 索引从1开始
get int(String columnIndex)列名查找
GetDouble()
GetFloat( )
GetDouble()
登录功能 ----看图
注入问题preparedStatement
**会把sql语句预先编译
*性能高
*过滤用户输入的关键字
CRUD create read update delete
太多重复的,抽取成工具类
DBbutils
Sql注入
比如用户名 密码
asdf asdf’ or ‘1’=’1
相关内容:
Select语句-----------------------------------------
‘固定值’ 我想用一个量可以随时改变
‘ ’’+password+’’ ’
preparedStatement:预编译对象, 是Statement对象的子类。
特点:
性能要高
会把sql语句先编译
sql语句中的参数会发生变化,过滤掉用户输入的关键字
**数据库里面所有的数据是从1开始的