java 数据库连接,sun公司退出的 java 访问数据库的标准规范接口java
是一种用于执行SQL语句的 java APImysql
能够做为多种关系数据库提供统一接口git
是一组 java 工具类和接口的组成。github
JDBC是接口,驱动接口的实现,没有驱动没法完成数据库连接,而不能操做数据库。sql
每一个数据库厂商都须要提供本身的驱动,用来连接本身公司的数据库数据库
也就是说,驱动通常由数据库厂商提供。工具
固然还有第三方公司专门为某一数据库提供驱动,这样的驱动每每不会是开源免费的!单元测试
例如:mysql 驱动包 是 mysql-connector-java-5.1.28-bin.jar测试
点击 window -> workspace -> 修改UTF-8 点击应用 ok。编码
首先new一个文件夹
建立一个 lib 文件夹存放 jar 包
将 mysql-connector-java-5.1.28-bin.jar 放入 lib 文件夹
而后:
完成以后
先建立一个包,而后创建一个类
编辑代码
package cn.study.test; import org.junit.Test; public class TestJunit { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } @Test public void testJunit(){ System.out.println("hello junit"); } }
右击 @Test 点击运行
修改代码
package cn.study.test; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestJunit { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } @Test public void testJunit(){ System.out.println("hello junit"); } @Before public void testBefore() { System.out.println("before!"); } @After public void testAfter() { System.out.println("after!"); } }
1. 注册驱动
2. 得到连接
3. 得到语句执行者
4. 执行 sql 语句
5. 处理结果
6. 释放资源
代码:
class.forName(“com.mysql.jdbc.Driver”)
分析步骤1 :
JDBC规范定义驱动接口:java.sql.Driver
mysql 驱动包提供了实现类:com.mysql.jdbc.Driver
分析步骤2:
DriverManager工具类提供注册驱动的方法
方法的参数是 java.sql.Driver 因此咱们能够经过以下语句进行注册
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
以上代码不推荐使用,存在两方面不足
1. 硬编码,后期不易于拓展和维护
2. 驱动被注册两次
分析步骤3:
一般开发咱们使用 Class.forName() 加载一个使用字符串描述的驱动类。
若是使用Class.forName() 将类加载到内存,该类的静态代码将自动执行。
经过查询 com.mysql.jdbc.Driver 源码,咱们发现Driver类主动将本身进行注册。
代码:
Connection con=DriverManager.getConnection{"jdbc:mysql://localhost:3306/mydb1","root","123456"};
获取连接须要使用方法 DriverManager.getConnection(url , username , password)
URL 表示连接数据库的位置(网址)
user 表示用户名
password :表示数据库密码
jdbc:mysql://localhost:3306/mydb1
URL由三部分组成,每部分用逗号隔开
第一部分 jdbc 为固定的
第二部分是数据库名称
第三部分为数据库厂商制定:数据库服务地址ip、端口、数据库名称。
拓展参数:
jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8
String sql = "insert into category(cid,cname) value ( 'c107' , '分类' )"
Statemet 语句执行代码:
Statement stmt = con.createStatement();
执行sql语句:
执行 insert update delete 语句
int executeUpdate(string sql);
执行select语句
ResultSet executeQuery( string sql );
执行 select 语句返回 true ,执行其余语句返回 false
boolean execute(string sql);
若是返回true 须要使用 getResultSet() 获取查询结果。
若是返回 false 须要使用 getUpdateCount() 获取影响行数。
执行批处理:
addBatch(string sql);
clearBath();
executeBatch();
若是有参数须要在sqql语句中进行拼凑,存在sql注入问题。
ResultSet 实际上就是一张二维表格,内部有一个行光标,光标默认位置在第一行上方,咱们能够调用 rs 对象的 next() 方法把 行光标向下移动一行,当第一次调用 next() 的时候,行光标就到了第一行记录的位置,这时候就能够使用 resultSet 提供的 getXXX(int col)方法来获取指定的列数据了。
光标移动到第一行
rs.next();
获取第一行第一列数据
rs.getInt(1);
经常使用的方法有:
获取任意对象
object getObject(int col)
获取字符串
string getString(inr col)
获取整形
int getInt(int col) ;
获取双精度浮点数
double getDouble(int col);
与IO流同样,使用后的东西都须要关闭!关闭的顺序是先获得的后关闭,后获得的先关闭!
rs.close();
stmt.close();
con.close();
案例代码:
package cn.study.test; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Connection; import java.sql.Statement; import org.junit.Test; /** * 测试sql注入问题 * @author Administrator * */ public class TestLogin { @Test public void testLogin() { try { login("wjw", "20"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 用户登陆方法 * @param username * @param password * @throws ClassNotFoundException * @throws SQLException */ public void login(String username,String password) throws ClassNotFoundException, SQLException { // 1. 注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2. 获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbtest","root","123456"); // 3. 建立执行sql语句的对象 Statement stmt = conn.createStatement(); // 4. 书写sql语句 String sql = "select * from student where "+"name='"+username+"' and age='"+password+"'"; // 5. 执行sql语句 ResultSet rs = stmt.executeQuery(sql); // 6.对结果集进行处理 if (rs.next()) { System.out.println("恭喜你 "+username +" 登陆成功!"); System.out.println(sql); }else{ System.out.println("帐号或密码错误!"); } // 7. 释放资源 if (rs!=null) rs.close(); if (stmt!=null) stmt.close(); if (conn!=null) conn.close(); } }
过滤用户输入的数据是否包含非法字符。—— 很难作到
分布校验,先使用用户名来查询用户,若是查找到了在比较密码。
使用 PrepareStatement。
PrepareStatement 叫预编译声明。
PrepareStatement是Statement的子接口,能够使用 PrepareStatement 来替代 Statement。
防止sql攻击
提升代码可读性和可维护性
提升效率
使用 Connection 的 prepareStatement(string sql):即建立它时就让他与一条sql锁定。
调用PrepareStatement 的 setXXX() 系列方法为问号设置值。
调用 executeUpdate() 或 executeQuery() 方法,但要注意,调用没有参数的方法。
package cn.study.test; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Connection; import java.sql.Statement; import org.junit.Test; /** * 测试sql注入问题 * * @author Administrator * */ public class TestLogin { @Test public void testLogin() { try { login("wjw", "20"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 用户登陆方法 * * @param username * @param password * @throws ClassNotFoundException * @throws SQLException */ public void login1(String username, String password) throws ClassNotFoundException, SQLException { // 1. 注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2. 获取连接 Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbtest", "root", "123456"); // 3. 编写sql语句 String sql = "select * from student where name=? and age=?"; // 4. 建立预处理对象 PreparedStatement pstmt = conn.prepareStatement(sql); // 5. 设置参数 pstmt.setString(1, "fasda"); pstmt.setString(2, "365351"); // 6. 执行查询编辑 ResultSet rs = pstmt.executeQuery(); // 7.对结果集进行处理 if (rs.next()) { System.out.println("恭喜你 " + username + " 登陆成功!"); System.out.println(sql); } else { System.out.println("帐号或密码错误!"); } // 8. 释放资源 if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } }
(limit , 2 , 2)第一个起始位置,要查询(第几页-1)*第二个参数, 第二个是数量。
项目代码:https://github.com/wjw1014/JavaMysqlStudy/tree/master/my_JDBC (小白操做,仅供参考!)