今日内容
1. DbUtils
DbUtils--多是针对增删查改进行操作
Apache组织提供的开源工具类库,针对原生JDBC的一种简易封装
步骤
1)导包
2)创建核心执行器
QueryRunner
public QueryRunner(DataSource ds)
DataSource --指定的数据源--连接池中的核心参数
3)准备sql语句
4)执行sql语句
核心接口ResultSetHandler
用于查找操作--有返回值或者集合的操作
public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
String sql
-sql语句
Object...params
-传入sql的参数--数量位置一一对应
ResultSetHandler<T> rsh--参数为
-BeanListHandler
--将查询结果集的结果封装到List<实体类型>集合中返回
-BeanHandler
--将查询结果集的单条结果封装到实体类中返回
-ScalarHandler
--将查询结果集的内容,返回单行单列的数据--统计总记录数!
用于增删改--不需要返回值的操作
updatepublic int update(String sql, Object... params)
--自动提交模式
public int update(Connection conn, String sql, Object... params)
--手动提交模式
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import pojo.Student;
import utils.DruidUtils;
import java.sql.SQLException;
import java.util.List;
//测试使用DbUtils
public class DbUtilsTest {
public static void main(String[] args) throws SQLException {
//导包
//创建核心执行器--参数是获取的DataSource
QueryRunner queryRunner = new QueryRunner(DruidUtils.getDataSource());
//准备sql语句
//查询--全部
String sql = "select * from student" ;
//利用query方法
List<Student> list = queryRunner.query( //得到了封装数据的集合
sql, //sql语句
new BeanListHandler<>(Student.class) //直接用匿名类创建ResultSetHandler接口的实现类
); //--此时没有需要传入的参数,则不填参数
//遍历输出
for (Student student : list) {
System.out.println(student);
}
/*
十二月 07, 2022 7:42:20 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
Student{id=1, name='钟离', age=30, gender='男', address='往生堂'}
Student{id=2, name='夜阑', age=29, gender='女', address='璃月'}
Student{id=3, name='申鹤', age=25, gender='女', address='璃月'}
Student{id=4, name='优菈', age=19, gender='女', address='蒙德'}
Student{id=5, name='胡桃', age=18, gender='女', address='往生堂'}
*/
//查询--按条件查询
//准备sql语句
String sql1 = "select * from student where id = ?" ;
//执行
Student student = queryRunner.query(sql1, //sql语句
new BeanHandler<>(Student.class), //匿名类实现ResultSetHandler,返回实体类对象
1 //参数id
);
//看结果
System.out.println(student);
//Student{id=1, name='钟离', age=30, gender='男', address='往生堂'}
//查询--返回查询数--举例返回一共有多少条数据
//准备sql语句
String sql2 = "select count(*) from student" ; //查询id有多少行
//执行 --底层返回long长整型,所以返回结果要么直接定义成long,要么强转,要么通过字符串转换成int
//直接拿Lang接收
long l = queryRunner.query(sql2,new ScalarHandler<>());
System.out.println(l);//5
//强转
int count = (int) l ;
System.out.println(count);//5--数据不大可以
//利用字符串转换
String countStr = String.valueOf(l); //将long转换为String
int countInt = Integer.parseInt(countStr); //将String转换为int
System.out.println(countInt);//5
//增删改--增加
//准备sql语句
String sql3 = "insert into student values (?,?,?,?,?)" ;
//执行
int update = queryRunner.update(sql3,
8, "宵宫",20,"女","烟花店"); //可以不返回,查看影响条数
System.out.println(update);// 1 --被影响一条
}
}
2. BeanUtils
BeanUtils--封装工具类
当一个实体类中属性很多,通过前端传过来数据,这个使用原生写法封装数据,会很麻烦!
--相当于把读取到的数据直接通过这个方法封装在指定的地方
Commons-BeanUtils就会提供针对实体类的封装!
1)导入Commons-BeanUtils.核心jar包
2)BeanUtils工具类提供一个方法
public static void populate(Object bean, Map properties)
--方法里面完成setXXX()封装数据
3. 不会前端的后端不是好全栈!
前端了解
HTML
超文本标记语言(Hyper Text Markup Language)
常用的标签
文本标签(换行/水平线/标题/段落/无序或者有序列表/上下标标签...)
超链接标签 a
图形标签 img
表格标签 table
表单标签 ---必须熟练书写 (重要)
框架标签
h5标签 ---渲染视频/音频等等
CSS
CSS常用选择以及样式
DiV+CSS盒子模型 -进行层级布局
JavaScript---livescript
运算符/变量(var定义变量)/流程控制语句
函数定义调用
js里面事件编程
js的dom编程
3.1 HTML标签
水平线
<hr/>
滚动标签 marquee
behavior="滚动方式"
scroll:穿入滚动
alternate:来回滚动
slide 滚动一边停掉
scrollamount ="正整数" 滚动速度
direction ="滚动方向"
left:右--左
right:左--右
down:上--下
up:下--上
背景色 bgcolor
段落标签 p
特点:前后两端都携带空行
换行标签 br
列表标签
无序列表 ul li
type:标记列表前面的内容
disc:实心圆点
circle:空心圆点
square:实心正方形
有序列表 ol li
长引用 blockquote
针对文本进行缩进处理 类似于tab键的作用
div和span
div 块标签
后面结合CSS 控制元素,完成网页布局!(层级布局)
span 行内标签的作用 (后期用在js表单校验)
在表单项的后面动态提示,校验用户信息是否可用 使用行内标签
图像标签
img标签 ,空标题
<img/>
属性:
src
图像源属性 连接到url地址
访问本项目下的图片文件(相对路径)
title
在鼠标悬浮在图片上的文字提示
width/height
图片宽和高 (指定px,指定整个宽度或者高度所在的权重百分比)
alt
替代文本
当前图片连接url地址失效时(alt才起作用),后面的文字提示
body通过属性background="设置背景图片"
这个图像必须和当前分辨率尺寸同等大,不然会进行x轴和y轴重复
超链接a标签
a 第一种用法:普通连接
href="url"
链接到的资源地址(后端接口/服务器地址)
target
打开到链接到的资源方式
_blank -新建窗口打开
_self -当前窗口直接打开
a 第二种用法:锚链接
1)创建一个跳转标记
<a name="锚点名称(标记名称)"></a>
2)创建一个跳转链接
不同页面的跳转
<a href="链接的url地址#锚点名称">xx文本</a>
超链接的实际作用
前后端交互
a标签里面href属性="url?携带参数"
url?key1=value1&key2=value2....
表格标签
table实际应用,就是后台管理模板里面使用数据表格完成数据CRUD
table表格标签
属性:
border="边框大小 指定像素大小"
width和height-宽和高(像素/权重百分比)
bgcolr-背景色
cellspacing-控制表格边框边框和单元边框之间空隙
align-表格对齐方式
子标签
caption-表格的标题
tr-行标签
th-表头内容,自动居中加粗的效果
td-单元格---理解为列
td单元格的合并
列合并:colspan="所占的单元格的数量"
行合并:rowspan="所占的单元格的数量"
table标签是早期可以布局的,现在很少用table布局
在一些很小的局部位置可能table,大部分布局div+css去布局!
表单标签 form
重要的几个属性
action="url地址 表单提交的后端地址"
method="表单提交方式get/post"
get提交和post提交的区别:
get提交
1)get提交是将信息数据提交地址栏上
url?key1=value1&key2=value2
2)相对post来说,不适合隐私数据(密码/输入动态密令---加密)
3)get提交到地址栏上,数据大小有限制的!
post提交
1)post提交不会提交到地址栏上,直接在浏览器中F12 ---network网络可以查看到
2)相对get来说,安全一些, (密码/输入动态密令---加密)
MD5加密
权限框架shiro---使用md5加密 (给原始密码上面进行 加盐)
123 +"qianfeng"
3)post提交不会将信息提交地址栏上,所以提交数据大小无限制!
注意
表单项里面所有的必须带name属性,给后端地址标记用户书写的内容!
表单常用标签
文本输入框
<input type="text" />
密码输入框,非明文显示
<input type="password" />
单项按钮radio
性别:
<input type="radio" value="1" name="sex" />男
<input type="radio" value="2" name="sex" />女
复选框checkbox
爱好:
<input type="checkbox" value="1" name="hobby" />足球
<input type="checkbox" value="2" name="hobby" />篮球
<input type="checkbox" value="3" name="hobby" />跑步
<input type="checkbox" value="4" name="hobby" />打游戏
文件上传组件file
上传图片:
<input type="file" />
日期组件date
出生日期:
<input type="date" />
下列菜单select
籍贯:
<select name="province">
<option value="0">请选择</option>
<option value="1">陕西省</option>
<option value="2">山西省</option>
<option value="3">广西省</option>
</select>
文本域textarea
rows:文本域的行数
cols:文本域中一行指定的字符数
自我介绍:
<textarea rows="2" cols="20">
我很好,helloworld
</textarea>
普通按钮
<input type="button" value="添加" />
表单提交按钮
<input type="reset" value="清空" />
<input type="submit" value="注册" />
button
<button>注册</button>
button标签和 input type="submit"都是提交数据