2019独角兽企业重金招聘Python工程师标准>>>

JDBC:

1. 概念:Java DataBase Connectivity  Java 数据库连接, Java语言操作数据库* JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。2. 快速入门:* 步骤:1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下2.右键-->Add As Library2. 注册驱动3. 获取数据库连接对象 Connection4. 定义sql5. 获取执行sql语句的对象 Statement6. 执行sql,接受返回结果7. 处理结果8. 释放资源* 代码实现://1. 导入驱动jar包//2.注册驱动Class.forName("com.mysql.jdbc.Driver");//3.获取数据库连接对象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");//4.定义sql语句String sql = "update account set balance = 500 where id = 1";//5.获取执行sql的对象 StatementStatement stmt = conn.createStatement();//6.执行sqlint count = stmt.executeUpdate(sql);//7.处理结果System.out.println(count);//8.释放资源stmt.close();conn.close();3. 详解各个对象:1. DriverManager:驱动管理对象* 功能:1. 注册驱动:告诉程序该使用哪一个数据库驱动jarstatic void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。 写代码使用:  Class.forName("com.mysql.jdbc.Driver");通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}}注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。2. 获取数据库连接:* 方法:static Connection getConnection(String url, String user, String password) * 参数:* url:指定连接的路径* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称* 例子:jdbc:mysql://localhost:3306/db3* 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称* user:用户名* password:密码 2. Connection:数据库连接对象1. 功能:1. 获取执行sql 的对象* Statement createStatement()* PreparedStatement prepareStatement(String sql)  2. 管理事务:* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务* 提交事务:commit() * 回滚事务:rollback() 3. Statement:执行sql的对象1. 执行sql1. boolean execute(String sql) :可以执行任意的sql 了解 2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句* 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。3. ResultSet executeQuery(String sql)  :执行DQL(select)语句2. 练习:1. account表 添加一条记录2. account表 修改记录3. account表 删除一条记录代码:Statement stmt = null;Connection conn = null;try {//1. 注册驱动Class.forName("com.mysql.jdbc.Driver");//2. 定义sqlString sql = "insert into account values(null,'王五',3000)";//3.获取Connection对象conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");//4.获取执行sql的对象 Statementstmt = conn.createStatement();//5.执行sqlint count = stmt.executeUpdate(sql);//影响的行数//6.处理结果System.out.println(count);if(count > 0){System.out.println("添加成功!");}else{System.out.println("添加失败!");}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally {//stmt.close();//7. 释放资源//避免空指针异常if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}4. ResultSet:结果集对象,封装查询结果* boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true* getXxx(参数):获取数据* Xxx:代表数据类型   如: int getInt() ,   String getString()* 参数:1. int:代表列的编号,从1开始   如: getString(1)2. String:代表列名称。 如: getDouble("balance")* 注意:* 使用步骤:1. 游标向下移动一行2. 判断是否有数据3. 获取数据//循环判断游标是否是最后一行末尾。while(rs.next()){//获取数据//6.2 获取数据int id = rs.getInt(1);String name = rs.getString("name");double balance = rs.getDouble(3);System.out.println(id + "---" + name + "---" + balance);}* 练习:* 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。1. 定义Emp类2. 定义方法 public List<Emp> findAll(){}3. 实现方法 select * from emp;5. PreparedStatement:执行sql的对象1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题1. 输入用户随便,输入密码:a' or 'a' = 'a2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a' 2. 解决sql注入问题:使用PreparedStatement对象来解决3. 预编译的SQL:参数使用?作为占位符4. 步骤:1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar2. 注册驱动3. 获取数据库连接对象 Connection4. 定义sql* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql) 6. 给?赋值:* 方法: setXxx(参数1,参数2)* 参数1:?的位置编号 从1 开始* 参数2:?的值7. 执行sql,接受返回结果,不需要传递sql语句8. 处理结果9. 释放资源5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作1. 可以防止SQL注入2. 效率更高

抽取JDBC工具类 : JDBCUtils

* 目的:简化书写
* 分析:1. 注册驱动也抽取2. 抽取一个方法获取连接对象* 需求:不想传递参数(麻烦),还得保证工具类的通用性。* 解决:配置文件jdbc.propertiesurl=user=password=3. 抽取一个方法释放资源* 代码实现:public class JDBCUtils {private static String url;private static String user;private static String password;private static String driver;/*** 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块*/static{//读取资源文件,获取值。try {//1. 创建Properties集合类。Properties pro = new Properties();//获取src路径下的文件的方式--->ClassLoader 类加载器ClassLoader classLoader = JDBCUtils.class.getClassLoader();URL res  = classLoader.getResource("jdbc.properties");String path = res.getPath();System.out.println(path);///D:/IdeaProjects/itcast/out/production/day04_jdbc/jdbc.properties//2. 加载文件// pro.load(new FileReader("D:\\IdeaProjects\\itcast\\day04_jdbc\\src\\jdbc.properties"));pro.load(new FileReader(path));//3. 获取数据,赋值url = pro.getProperty("url");user = pro.getProperty("user");password = pro.getProperty("password");driver = pro.getProperty("driver");//4. 注册驱动Class.forName(driver);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 获取连接* [@return](https://my.oschina.net/u/556800) 连接对象*/public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, user, password);}/*** 释放资源* [@param](https://my.oschina.net/u/2303379) stmt* [@param](https://my.oschina.net/u/2303379) conn*/public static void close(Statement stmt,Connection conn){if( stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if( conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 释放资源* [@param](https://my.oschina.net/u/2303379) stmt* [@param](https://my.oschina.net/u/2303379) conn*/public static void close(ResultSet rs,Statement stmt, Connection conn){if( rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if( stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if( conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}* 练习:* 需求:1. 通过键盘录入用户名和密码2. 判断用户是否登录成功* select * from user where username = "" and password = "";* 如果这个sql有查询结果,则成功,反之,则失败* 步骤:1. 创建数据库表 userCREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(32),PASSWORD VARCHAR(32));INSERT INTO USER VALUES(NULL,'zhangsan','123');INSERT INTO USER VALUES(NULL,'lisi','234');2. 代码实现:public class JDBCDemo9 {public static void main(String[] args) {//1.键盘录入,接受用户名和密码Scanner sc = new Scanner(System.in);System.out.println("请输入用户名:");String username = sc.nextLine();System.out.println("请输入密码:");String password = sc.nextLine();//2.调用方法boolean flag = new JDBCDemo9().login(username, password);//3.判断结果,输出不同语句if(flag){//登录成功System.out.println("登录成功!");}else{System.out.println("用户名或密码错误!");}}/*** 登录方法*/public boolean login(String username ,String password){if(username == null || password == null){return false;}//连接数据库判断是否登录成功Connection conn = null;Statement stmt =  null;ResultSet rs = null;//1.获取连接try {conn =  JDBCUtils.getConnection();//2.定义sqlString sql = "select * from user where username = '"+username+"' and password = '"+password+"' ";//3.获取执行sql的对象stmt = conn.createStatement();//4.执行查询rs = stmt.executeQuery(sql);//5.判断/* if(rs.next()){//如果有下一行,则返回truereturn true;}else{return false;}*/return rs.next();//如果有下一行,则返回true} catch (SQLException e) {e.printStackTrace();}finally {JDBCUtils.close(rs,stmt,conn);}return false;}}

JDBC控制事务:

1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2. 操作:1. 开启事务2. 提交事务3. 回滚事务
3. 使用Connection对象来管理事务* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务* 在执行sql之前开启事务* 提交事务:commit() * 当所有sql都执行完提交事务* 回滚事务:rollback() * 在catch中回滚事务4. 代码:public class JDBCDemo10 {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt1 = null;PreparedStatement pstmt2 = null;try {//1.获取连接conn = JDBCUtils.getConnection();//开启事务conn.setAutoCommit(false);//2.定义sql//2.1 张三 - 500String sql1 = "update account set balance = balance - ? where id = ?";//2.2 李四 + 500String sql2 = "update account set balance = balance + ? where id = ?";//3.获取执行sql对象pstmt1 = conn.prepareStatement(sql1);pstmt2 = conn.prepareStatement(sql2);//4. 设置参数pstmt1.setDouble(1,500);pstmt1.setInt(2,1);pstmt2.setDouble(1,500);pstmt2.setInt(2,2);//5.执行sqlpstmt1.executeUpdate();// 手动制造异常int i = 3/0;pstmt2.executeUpdate();//提交事务conn.commit();} catch (Exception e) {//事务回滚try {if(conn != null) {conn.rollback();}} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally {JDBCUtils.close(pstmt1,conn);JDBCUtils.close(pstmt2,null);}}}

数据库连接池

1. 概念:其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。2. 好处:1. 节约资源2. 用户访问高效3. 实现:1. 标准接口:DataSource   javax.sql包下的1. 方法:* 获取连接:getConnection()* 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接2. 一般我们不去实现它,有数据库厂商来实现1. C3P0:数据库连接池技术2. Druid:数据库连接池实现技术,由阿里巴巴提供的4. C3P0:数据库连接池技术* 步骤:1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,* 不要忘记导入数据库驱动jar包2. 定义配置文件:* 名称: c3p0.properties 或者 c3p0-config.xml* 路径:直接将文件放在src目录下即可。3. 创建核心对象 数据库连接池对象 ComboPooledDataSource4. 获取连接: getConnection* 代码://1.创建数据库连接池对象DataSource ds  = new ComboPooledDataSource();//2. 获取连接对象Connection conn = ds.getConnection();
5. Druid:数据库连接池实现技术,由阿里巴巴提供的1. 步骤:1. 导入jar包 druid-1.0.9.jar2. 定义配置文件:* 是properties形式的* 可以叫任意名称,可以放在任意目录下3. 加载配置文件。Properties4. 获取数据库连接池对象:通过工厂来来获取  DruidDataSourceFactory5. 获取连接:getConnection* 代码://3.加载配置文件Properties pro = new Properties();InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//4.获取连接池对象DataSource ds = DruidDataSourceFactory.createDataSource(pro);//5.获取连接Connection conn = ds.getConnection();2. 定义工具类1. 定义一个类 JDBCUtils2. 提供静态代码块加载配置文件,初始化连接池对象3. 提供方法1. 获取连接方法:通过数据库连接池获取连接2. 释放资源3. 获取连接池的方法* 代码:public class JDBCUtils {//1.定义成员变量 DataSourceprivate static DataSource ds ;static{try {//1.加载配置文件Properties pro = new Properties();pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));//2.获取DataSourceds = DruidDataSourceFactory.createDataSource(pro);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取连接*/public static Connection getConnection() throws SQLException {return ds.getConnection();}/*** 释放资源*/public static void close(Statement stmt,Connection conn){/* if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();//归还连接} catch (SQLException e) {e.printStackTrace();}}*/close(null,stmt,conn);}public static void close(ResultSet rs , Statement stmt, Connection conn){if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();//归还连接} catch (SQLException e) {e.printStackTrace();}}}/*** 获取连接池方法*/public static DataSource getDataSource(){return  ds;}}

Spring JDBC

* Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
* 步骤:1. 导入jar包2. 创建JdbcTemplate对象。依赖于数据源DataSource* JdbcTemplate template = new JdbcTemplate(ds);3. 调用JdbcTemplate的方法来完成CRUD的操作* update():执行DML语句。增、删、改语句* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合* 注意:这个方法查询的结果集长度只能是1* queryForList():查询结果将结果集封装为list集合* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中* query():查询结果,将结果封装为JavaBean对象* query的参数:RowMapper* 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装* new BeanPropertyRowMapper<类型>(类型.class)* queryForObject:查询结果,将结果封装为对象* 一般用于聚合函数的查询4. 练习:* 需求:1. 修改1号数据的 salary 为 100002. 添加一条记录3. 删除刚才添加的记录4. 查询id为1的记录,将其封装为Map集合5. 查询所有记录,将其封装为List6. 查询所有记录,将其封装为Emp对象的List集合7. 查询总记录数* 代码:import cn.itcast.domain.Emp;import cn.itcast.utils.JDBCUtils;import org.junit.Test;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import java.sql.Date;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import java.util.Map;public class JdbcTemplateDemo2 {//Junit单元测试,可以让方法独立执行//1. 获取JDBCTemplate对象private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());/*** 1. 修改1号数据的 salary 为 10000*/@Testpublic void test1(){//2. 定义sqlString sql = "update emp set salary = 10000 where id = 1001";//3. 执行sqlint count = template.update(sql);System.out.println(count);}/*** 2. 添加一条记录*/@Testpublic void test2(){String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";int count = template.update(sql, 1015, "郭靖", 10);System.out.println(count);}/*** 3.删除刚才添加的记录*/@Testpublic void test3(){String sql = "delete from emp where id = ?";int count = template.update(sql, 1015);System.out.println(count);}/*** 4.查询id为1001的记录,将其封装为Map集合* 注意:这个方法查询的结果集长度只能是1*/@Testpublic void test4(){String sql = "select * from emp where id = ? or id = ?";Map<String, Object> map = template.queryForMap(sql, 1001,1002);System.out.println(map);//{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}}/*** 5. 查询所有记录,将其封装为List*/@Testpublic void test5(){String sql = "select * from emp";List<Map<String, Object>> list = template.queryForList(sql);for (Map<String, Object> stringObjectMap : list) {System.out.println(stringObjectMap);}}/*** 6. 查询所有记录,将其封装为Emp对象的List集合*/@Testpublic void test6(){String sql = "select * from emp";List<Emp> list = template.query(sql, new RowMapper<Emp>() {@Overridepublic Emp mapRow(ResultSet rs, int i) throws SQLException {Emp emp = new Emp();int id = rs.getInt("id");String ename = rs.getString("ename");int job_id = rs.getInt("job_id");int mgr = rs.getInt("mgr");Date joindate = rs.getDate("joindate");double salary = rs.getDouble("salary");double bonus = rs.getDouble("bonus");int dept_id = rs.getInt("dept_id");emp.setId(id);emp.setEname(ename);emp.setJob_id(job_id);emp.setMgr(mgr);emp.setJoindate(joindate);emp.setSalary(salary);emp.setBonus(bonus);emp.setDept_id(dept_id);return emp;}});for (Emp emp : list) {System.out.println(emp);}}/*** 6. 查询所有记录,将其封装为Emp对象的List集合*/@Testpublic void test6_2(){String sql = "select * from emp";List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));for (Emp emp : list) {System.out.println(emp);}}/*** 7. 查询总记录数*/@Testpublic void test7(){String sql = "select count(id) from emp";Long total = template.queryForObject(sql, Long.class);System.out.println(total);}}

转载于:https://my.oschina.net/u/3668429/blog/3044206

JDBC、JDBC连接池、JDBCTemplate相关推荐

  1. JDBC通过连接池链接数据库总是失败的解决办法

    应用服务器:glassfish JDBC通过连接池链接数据库总是失败,通过查看日志,发现是APACHE报DHCP 错误, 只需要通过访问4848端口的管理程序,重新PING下JDBC当前连接池即可.

  2. java连接池域名切换_java - 使用JDBC的连接池选项:DBCP与C3P0

    java - 使用JDBC的连接池选项:DBCP与C3P0 什么是可用于Java / JDBC的最佳连接池库? 我正在考虑2个主要候选人(免费/开源): Apache DBCP - [http://c ...

  3. JDBC连接池JDBCTemplate课堂笔记

    今日内容 1. 数据库连接池2. Spring JDBC : JDBC Template 数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器.当系统初始化好后,容器被创建,容器中 ...

  4. 操作数据库方法总结1——JDBC、连接池与JDBCTemplate

    本篇文章更好的阅读体验请见笔者的个人博客 引言 最近一直在操作数据库,然后就发现自己竟然只是会用Mybatis,知道JDBCTemplate,对于为什么要用它们以及它们的出现都是为了解决什么情景只能磕 ...

  5. JDBC数据源连接池(1)---DBCP

    何为数据源呢?也就是数据的来源.我在前面的一篇文章<JDBC原生数据库连接>中,采用了mysql数据库,数据来源于mysql,那么mysql就是一种数据源.在实际工作中,除了mysql,往 ...

  6. mysql,jdbc、连接池

    show processlist; select * from information_schema.processlist; Command:The type of command the thre ...

  7. 构建JDBC的连接池Pool

    首先创建一个配置文件driver.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mydemo user ...

  8. 2011级-csdn-java-张侃— JDBC开发—连接池(二)

    l 配置Tomcat数据源 示例代码: context.xml <Context> <Resource name="jdbc/testDB" auth=" ...

  9. 大数据笔记16—java基础篇12(JDBC 、连接池、事务)

    目录 JDBC jdbc概述 jdbc入门案例 API详解 jdbc工具类 预编译执行平台 1.SQL注入问题(安全问题) 2API详解:预处理对象(PreparedStatement) 使用连接池重 ...

  10. mysql jdbc存放位置_mysql,jdbc、连接池

    在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节. 1byte=8bit 1byte就是1B 1KB=1024B free -m Mem"后的total ...

最新文章

  1. SQL2000 N' '的意思
  2. mysql dml ddldcl权限_MySQL中的DML、DDL、DCL到底是什么呢?
  3. 更改vsftp端口号
  4. XP`开机速度慢的解决方法
  5. flutter项目打包.exe文件发布windows版
  6. UVA 10054 the necklace 欧拉回路
  7. DataGridView插入图片
  8. 2018-2019-2 《网络对抗技术》Kali安装 Week1 20165212
  9. 技术文档(12)-- Linux权限总结
  10. 再读《SAP德国造》
  11. 2018-09-25 参考博客Hadoop
  12. ***HTML +CSS 总结与归纳
  13. window系统怎么解压tar.bz2文件
  14. JAVA类计算机专业毕业设计题目
  15. lcd改led背光有光斑_LCD改LED背光,详细干活教程!
  16. 找1到n中缺失的数字(长度为n-1的整形数组,数字的范围在1到n,找其中一个缺失的数字)
  17. PHP在线客服系统平台源码(完全开源的网页在线客服系统)
  18. java调色板代码_简易网页调色板功能调用代码_html
  19. 为什么不太建议你通过 Python 去找工作?
  20. Java 一元三次方程求解

热门文章

  1. FPGA与CPLD的区别
  2. 设计模式——命令模式
  3. php操作elasticsearch
  4. 前端之JavaScript进阶
  5. MYSQL—— 启动MYSQL 57 报错“The service MYSQL57 failed the most recent........等”的问题解决方式!...
  6. jQuery学习之DOM操作
  7. Java getResourceAsStream返回为空的问题
  8. 【威佐夫博奕】 betty定理 poj 1067
  9. isnan 函数 -javascript1.1
  10. yolov3从头实现(六)损失计算