二、Java Web——JDBC连接池 JDBCTemplate(详解)

今日内容

  1. 数据库连接池

  2. Spring JDBC : JDBC Template

数据库连接池

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);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 2305. 公平分发饼干(DFS)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 cookies &#xff0c;其中 cookies[i] 表示在第 i 个零食包中的饼干数量。 另给你一个整数 k 表示等待分发零食包的孩子数量&#xff0c;所有 零食包都需要分发。 在同一个零食包中的所有饼干都必须分发给同一个孩子&#xff…

python3.5文档

https://docs.python.org/3.5/tutorial/modules.html#packages 转载于:https://www.cnblogs.com/pyfreshman/p/5304205.html

三、Web服务器——HTTP协议 Response对象 ServletContext对象 学习笔记

今日内容 1. HTTP协议&#xff1a;响应消息 2. Response对象 3. ServletContext对象HTTP协议&#xff1a; 1. 请求消息&#xff1a;客户端发送给服务器端的数据* 数据格式&#xff1a;1. 请求行2. 请求头3. 请求空行4. 请求体 2. 响应消息&#xff1a;服务器端发送给客户端的…

LeetCode 2309. 兼具大小写的最好英文字母

文章目录1. 题目2. 解题1. 题目 给你一个由英文字母组成的字符串 s &#xff0c;请你找出并返回 s 中的 最好 英文字母。 返回的字母必须为大写形式。如果不存在满足条件的字母&#xff0c;则返回一个空字符串。 最好 英文字母的大写和小写形式必须 都 在 s 中出现。 英文字…

Java——标签组件:JLabel

使用一个标签 import java.awt.Color; import java.awt.Dimension; import java.awt.Point;import javax.swing.JFrame; import javax.swing.JLabel;// // File Name : JFrame_demo //------------------------------------------------------------------------------ /…

四、Web服务器——Session Cookie JSP入门 学习笔记

今日内容 1. 会话技术1. Cookie2. Session 2. JSP&#xff1a;入门学习会话技术 1. 会话&#xff1a;一次会话中包含多次请求和响应。* 一次会话&#xff1a;浏览器第一次给服务器资源发送请求&#xff0c;会话建立&#xff0c;直到有一方断开为止 2. 功能&#xff1a;在一次…

LeetCode 2310. 个位数字为 K 的整数之和(枚举)

文章目录1. 题目2. 解题1. 题目 给你两个整数 num 和 k &#xff0c;考虑具有以下属性的正整数多重集&#xff1a; 每个整数个位数字都是 k 。所有整数之和是 num 。 返回该多重集的最小大小&#xff0c;如果不存在这样的多重集&#xff0c;返回 -1 。 注意&#xff1a; 多…

五、Web服务器——MVC开发模式 EL表达式 JSTL 学习笔记

今日内容 1. JSP:1. 指令2. 注释3. 内置对象2. MVC开发模式 3. EL表达式 4. JSTL标签 5. 三层架构JSP: 1. 指令* 作用&#xff1a;用于配置JSP页面&#xff0c;导入资源文件* 格式&#xff1a;<% 指令名称 属性名1属性值1 属性名2属性值2 ... %>* 分类&#xff1a;1. p…

requests.exceptions.SSLError: HTTPSConnectionPool Max retries exceeded with url 报错解决方法

import requests import jsonheaders {"Content-Type": "application/json"} url https://xxx d {"var": [1, 2, 3]} r requests.post(url, headersheaders, jsond) # 发get请求 print(r.status_code, r.json())发现报错&#xff1a; ssl.…

六、Web服务器——FilterListener 学习笔记

今日内容 1. Filter&#xff1a;过滤器 2. Listener&#xff1a;监听器Filter&#xff1a;过滤器 1. 概念&#xff1a;* 生活中的过滤器&#xff1a;净水器,空气净化器&#xff0c;土匪、* web中的过滤器&#xff1a;当访问服务器的资源时&#xff0c;过滤器可以将请求拦截下来…

asp.net cookie操作-添加cookie,添加键值,移除cookie,移除键值

1 public class Cookies2 {3 /// <summary>4 /// 添加cookie5 /// </summary>6 /// <param name"cookieName"></param>7 /// <param name"value"></param>8 public static void Add(string c…

export/set 环境变量读取对应配置

我们有时候不希望将配置参数写在代码里&#xff0c;而作为单独的文件传入 一种办法是设置环境变量参数&#xff0c;根据这个参数来决定读取哪个配置文件 # _*_ coding: utf-8 _*_ # Time : 2022/7/6 18:03 # Author : Michael # File : os_environ.py # desc : import osdef …

七、Web服务器——Junit单元测试 反射 注解学习笔记

今日内容 1. Junit单元测试 2. 反射 3. 注解Junit单元测试&#xff1a; * 测试分类&#xff1a;1. 黑盒测试&#xff1a;不需要写代码&#xff0c;给输入值&#xff0c;看程序是否能够输出期望的值。2. 白盒测试&#xff1a;需要写代码的。关注程序具体的执行流程。* Junit使…

ViewPager+Fragment,Fragment会预加载的问题

http://www.bubuko.com/infodetail-535920.html 在Fragmetn里&#xff0c;onCreateView去加载布局&#xff0c;真正的加载数据通过这个方法setUserVisibleHint&#xff08;boolean isVisibleToUser&#xff09;&#xff0c;isVisibleToUser表示当前Fragment是否处于可见状态&am…

第一个React Web应用程序

learn from 《React全家桶&#xff1a;前端开发与实例详解》 https://zh-hans.reactjs.org/tutorial/tutorial.html https://zh-hans.reactjs.org/docs/create-a-new-react-app.html#create-react-app 安装 Node.js安装 npm install -g live-server&#xff0c;配置环境变量 p…

一、第一个注解的 SpringMVC 程序

ch01-hello-springmvc:第一个注解的springmvc项目 所谓 SpringMVC 的注解式开发是指&#xff0c;在代码中通过对类与方法的注解&#xff0c;便可完成处理器 在 springmvc 容器的注册。注解式开发是重点。 需求&#xff1a;用户再页面发起一个请求&#xff0c;请求交给spring…

第三次作业:PSP耗时

PSP个人项目耗时对比记录表&#xff1a;四则运算 Personal Software Process StagesTime(%)Planning7 Estimate9开发76 •需求分析 6 •生成设计文档 7 •设计复审&#xff08;和同事审核设计文档&#xff09; 6 •代码规范&#xff08;为目前的开发制定合适的规范&…

二、SpringMVC 注解式开发学习笔记

1、RequestMapping 定义请求规则 通过RequestMapping 注解可以定义处理器对于请求的映射规则。该注解可以注解在方法上&#xff0c;也可以注解在类上&#xff0c;但意义是不同的。value 属性值常以“/”开始。 RequestMapping 的 value 属性用于定义所匹配请求的 URI。但对于注…

LeetCode 2315. 统计星号(字符串)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s &#xff0c;每 两个 连续竖线 | 为 一对 。 换言之&#xff0c;第一个和第二个 | 为一对&#xff0c;第三个和第四个 | 为一对&#xff0c;以此类推。 请你返回 不在 竖线对之间&#xff0c;s 中 * 的数目。 注意&#xff…

MinerConfig.java 爬取配置类

MinerConfig.java 爬取配置类 package com.iteye.injavawetrust.miner;import java.util.List;/*** 爬取配置类* author InJavaWeTrust**/ public class MinerConfig {/*** URL包含关键字*/public List<String> keys;/*** 存储方式 */public StoreType storeType;/*** 爬…