笔记-JavaWeb学习之旅5
cp30的演示
package cn.itcast.datasourcejdbc; import com.mchange.v2.c3p0.combopooleddatasource; import javax.sql.datasource; import java.sql.connection; import java.sql.sqlexception; public class c3p0demo2 { public static void main(string[] args){ //创建连接池对象,使用多态 //不指定配置文件的名称,会连接默认配置 datasource ds = new combopooleddatasource(); //使用getconnection方法获取连接 try{ //归还连接对象演示 //文件默认配置了10个连接 for(int i = 0 ; i <10 ; i++){ connection c = ds.getconnection(); //i<5个的话不会报错 //i<11的话会报异常 an attempt by a client to checkout a connection has timed out. system.out.println(i+""+c); //现在归连接 if(i==5){ c.close(); //运行正常,并且控制台打印的对象有两个地址是一样的 } } }catch(sqlexception e){ e.printstacktrace(); } } }
druid
package cn.itcast.druid; import com.alibaba.druid.pool.druiddatasourcefactory; import javax.sql.datasource; import java.io.inputstream; import java.sql.connection; import java.util.properties; public class druiddemo1 { public static void main(string[] args) throws exception{ //druid包下的类druiddatasourcefactory有个方法可以获取到连接池对象 // druiddatasourcefactory需要properties参数 //创建properties对象 properties p = new properties(); //加载读取文件配置,需要一个参数字节输入流或字符输入流 //获取字节输入流参数,可以先获取字节码文件然后通过方法getclassloader来获取classloader对象 //通过classloader对象来获取字节输入流 class aclass=new druiddemo1().getclass(); classloader aclassclassloader= aclass.getclassloader(); inputstream ainputstream = aclassclassloader.getresourceasstream("druid.properties"); //有了字节输入流对应的资源,就可以让他加载了 //以上代码都可以通过一行代码来实现 //inputstream ainputstream = druiddemo1.class.getclassloader().getresourceasstream("druid.properties"); p.load(ainputstream); //获得数据库连接池对象 datasource ds = druiddatasourcefactory.createdatasource(p); //创建连接 connection aconnection = ds.getconnection(); system.out.println(aconnection); } }
druid工具类的创建
package cn.itcast.utils; import com.alibaba.druid.pool.druiddatasourcefactory; import javax.sql.datasource; import java.io.ioexception; import java.sql.connection; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.util.properties; public class jdbcutils { //定义成员变量datasource private static datasource ds; static{ try { //加载配置文件 properties pro = new properties(); pro.load(jdbcutils.class.getclassloader().getresourceasstream("druid.properties")); //获取连接池 ds = druiddatasourcefactory.createdatasource(pro); } 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(); } } } 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 getdatasouce(){ return ds; } }
package cn.itcast.druid; import cn.itcast.utils.jdbcutils; import java.sql.connection; import java.sql.preparedstatement; import java.sql.sqlexception; public class druiddemo2 { public static void main(string[] args) { connection c =null; preparedstatement ps =null; //使用druid操作数据库 try { //获取连接 c = jdbcutils.getconnection(); //要执行sql语句,需要先创建sql语句,sql语句的参数使用?占位符 string sql = "insert into emp(id,ename,salary)values(?,?,?)"; //要执行sql语句,需要创建preparestatement对象 //preparestatement对象可以通过connection对象的方法来获取 ps = c.preparestatement(sql); //调用preparestatement的方法给占位符赋值 ps.setint(1,10015); ps.setstring(2,"李白"); ps.setdouble(3,15000.00); //执行sql语句 int count = ps.executeupdate(); system.out.println(count); } catch (sqlexception e) { e.printstacktrace(); }finally { jdbcutils.close(ps,c); } } }
package cn.itcast.jdbctemplate; import cn.itcast.utils.jdbcutils; import org.springframework.jdbc.core.jdbctemplate; public class jdbctemplatedemo { public static void main(string[] args) { //创建jdbctemplate对象 //参数给予数据源,让他连接到数据库 jdbctemplate jt = new jdbctemplate(jdbcutils.getdatasouce()); //定义sql语句 string sql = "update emp set salary = ? where id = ?"; //调用update方法,参数一个是sql语句,另一个给占位符赋值 //赋值与问好占位符一一对应 int count = jt.update(sql,20000.00,10015); system.out.println(count); } }
spring jdbc
spring框架对jdbc的简单封装,提供了一个jdbctemplate对象简化jdbc的开发
步骤:
- 导入jar包
- 创建jdbctemplate对象。依赖于数据源datasource
- 调用jdbctemplate的方法来完成crud的操作
- update():执行dml语句,增删改语句
- queryformap():查询结果将结果集封装为map集合
- queryforlist();查询结果将结果集封装为list集合
- query():查询结果,将结果封装为javabeanduixang
- queryforobject:查询结果封装为对象
package cn.itcast.test; import cn.itcast.utils.jdbcutils; import org.junit.test; import org.springframework.jdbc.core.beanpropertyrowmapper; import org.springframework.jdbc.core.jdbctemplate; import java.sql.connection; import java.sql.sqlexception; import java.util.list; import java.util.map; public class demo { private jdbctemplate jt = new jdbctemplate(jdbcutils.getdatasouce()); //单元测试,可以让方法独立执行 @test //修改1001号数据salary为15000 public void test1(){ //创建框架对象,参数传递数据源 //创建sql语句 string sql = "update emp set salary = 15000 where id = ?"; //有了框架,不用创建preparestatement对象也可以执行sql语句了 int count = jt.update(sql,1001); system.out.println(count); } //添加一条记录 @test public void test2(){ string sql = "insert into emp(id,ename,salary) values (?,?,?)"; int count= jt.update(sql,1016,"郭靖",12000); system.out.println(count); } //删除刚刚添加的记录 @test public void test(){ string sql = "delete from emp where id = ?"; int count = jt.update(sql,1016); system.out.println(count); } //查询id为1001的记录,将其封装为map集合 @test public void test4(){ string sql = "select * from emp where id = ?"; //查询的结果集长度只能是1,如果要查询两行的数据的话,会报错 map<string,object> map = jt.queryformap(sql,1001); system.out.println(map); //{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=15000.00, bonus=null, dept_id=20} } @test //查询所有记录,将其封装为list集合 public void test5(){ string sql = "select * from emp"; //queryforlist方法会把每一天记录封装为map集合,然后再将map集合封装为list集合 list<map<string,object>> list = jt.queryforlist(sql); for(map<string,object> map : list){ system.out.println(map); } } @test //查询所有记录,将其封装成emp对象的list集合 public void test6(){ string sql = "select * from emp"; //query方法有两个参数,一个是sql语句,一个是rowmapper的实现类,一般我们使用它给我们提供的实现类,beanpropertyrowmapper,这个实现类可以完成数据到javabean的自动封装 list<emp> list = jt.query(sql,new beanpropertyrowmapper<emp>(emp.class)); for(emp emp :list){ system.out.println(emp); } } @test //查询总记录数 public void test7(){ string sql = "select count(id) from emp"; //第一个参数是sql,第二个参数是class类型,是一个将来要返回的class类型 //将来要返回long类型,那么参数就是long.class long l = jt.queryforobject(sql,long.class); system.out.println(l); } }
web概念概述
javaweb:使用java语言开发基于互联网的项目
软件架构:
-
c/s:client/server 客户端/服务器端
在用户本地有一个客户端程序,在远程有一个服务器端程序
如qq,迅雷....
优点:1.用户体验号
缺点:开发,安装,部署,维护麻烦
-
b/s:browser/server 浏览器/服务器端
只需要一个浏览器,用户通过不同的网址(url),客户访问不同的服务器端程序
优点:1.开发,安装,部署,维护,简单
缺点:如果应用过大,用户体验可能会受影响
对硬件要求过高
b/s架构详解
资源分类:
1.静态资源:使用静态网页开发技术发布的资源,特点:所有用户访问,得到结果是一样的,比如,文本,图片,视频,html,css,javascript。如果用户请求的是静态资源,那么服务器会直接将静态资源放送给浏览器。浏览器中内置了静态资源的解析引擎,可以展示静态资源
2.动态资源:使用动态网页及时发布的资源,特点所有用户访问,得到的结果可能不一样,如:jsp/servlet,php,asp....。如果用户请求的是动态资源,那么服务器就会执行动态资源,转换为静态资源,在发送给浏览器
我们要学习动态资源你,就必须先学习静态资源
静态资源(三剑客):
html:用于搭建基础网页,展示网页的内容
css:用于美化页面,布局页面
javascript:控制页面的元素,让页面有一些动态的效果
html快速入门
语法:
- html文档后缀名.html 或者.htm
- 标签分为
- 围堵标签:有开始标签和结束标签如
- 自闭和标签:开始标签和结束标签在一起
- 标签可以嵌套:
- 在开始标签中可以定义属性。属性是由键值对构成,值需要用引号引起来
- html的标签不区分大小写,但是建议小写。
<html> <head> <title>title</title> </head> <body> <font color='red'>hello world</font><br/> <font color='green'>hello world</font> </body> </html>
3.标签学习
-
文件标签:构成html最基本的标签
- html:html文档的根标签
- head:头标签。用于指定html文档的一些属性。引入外部资源
- title:标题标签
- body:体标签
- (<!doctype html>): html5中定义该文档是html文档
-
文本标签:和文本有关的标签
注释:
-
.
to
:标题标签
-
.
:段落标签
换行标签
-
展示水平线
;拥有属性可以改变水平线的样式color:颜色,width:宽度,size:高度,align:对齐方式(center:居中对齐,left:左对齐,right:右对齐) -
字体加粗:
-
字体斜体
字体标签有颜色(color),大小(size),字体样式的属性(face)
属性定义:
-
color
- 英文单词:red,green,blue
- rge(值1,值2 ,值3),值得范围0~255,如 rgb(0,0,255),表示红色绿色为0,蓝色为255
width:
- 数值:width='20',数值的单位,默认是px(像素)
- 数值%:占比相对于父元素的比列
-
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>文本标签</title> </head> <body> <!-- 注释 --> <!-- br 换行--> <!--h1~h6标题标签--> 云想衣裳花想容<br> 春风扶槛露华浓<br> 若非群玉山头见<br> 会向瑶台月下逢<br> <!-- 段落标签 p--> <p> 黄河远上白云间 <p/> <p> 一片孤城万仞山 <p/> <p> 羌笛何须怨杨柳 <p/> <p> 春风不度玉门关 </p> <!--hr显示一条水平线 是自闭和标签--> <hr color = 'red'/> <!--加粗b--> 春风不度玉门关<br> <b>春风不度玉门关</b> <!--斜体i--> <i>羌笛何须怨杨柳</i> <hr> <!--字体font--> <font color="red" size ="5" face="楷体">云想衣裳花想容</font><br> </body> </html>
- 图片标签:
- src:指定图片的位置
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>图片标签</title> </head> <body> <!--alt 代表找不到图片的话就用指定的文字代替--> <img src="3.jpg" width="500" align="right" alt="图片挂了"> </body> </html>
-
列表标签:
有序列表:ol , li代表每一项
无序列表ul ,li代表每一项
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> </head> <body> <!--有序列表ol--> 早上起床干的事情 <ol> <li>睁眼</li> <li>看手机</li> <li>洗衣服</li> <li>洗漱</li> </ol> <!--有无列表ul--> <ul> <li>睁眼</li> <li>看手机</li> <li>洗衣服</li> <li>洗漱</li> </ul> </body> </html>
-
链接标签:
a:定义以超链接
属性:href:指定访问资源的url(统一资源定位符)
target :指定打开资源的方式
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>链接标签</title> </head> <body> <!--超链接a--> <a href="https://www.cnblogs.com/train99999/">点击在本页面进入我的博客</a><br> <!--点击在新的页面打开选项卡--> <a href="https://www.cnblogs.com/train99999/" target="_blank">点击在新的选项卡中打开</a><br> <!--访问本地的资源--> <a href="3.jpg">点击加载本地图片</a><br> <!--打开会打开本地邮箱--> <a href="mailto:123456@train.com">点击联系我</a> <!--点击图片加载链接--> <a href="https://www.cnblogs.com/train99999/"><img src="3.jpg"></a> </body> </html>
div和span:
div:每一个div占满一整行,块级标签
span:文本信息在一行展示,行内标签,内联标签
语义化标签:html5中为了提高程序的可读性,提供了一些标签(header,footer)这些标签对页面没有任何的样式。
上一篇: Flink本地环境安装部署
下一篇: 微信小程序封装自定义弹窗