首页
统计
关于
Search
1
Sealos3.0离线部署K8s集群
1,434 阅读
2
Spring Cloud OAuth2.0
982 阅读
3
类的加载
970 阅读
4
SpringBoot自动装配原理
848 阅读
5
集合不安全问题
702 阅读
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
Netty
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Canvas
React
Linux
容器
Docker
Containerd
Podman
Kubernetes
Python
FastApi
OpenCV
数据分析
牛牛生活
登录
Search
标签搜索
Java
CSS
mysql
RabbitMQ
JavaScript
React
Redis
OpenCV
JVM
Mybatis-Plus
Netty
Camunda
多线程
CSS3
Python
Canvas
Spring Cloud
注解和反射
Activiti
工作流
蘇阿細
累计撰写
484
篇文章
累计收到
4
条评论
首页
栏目
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
Netty
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Canvas
React
Linux
容器
Docker
Containerd
Podman
Kubernetes
Python
FastApi
OpenCV
数据分析
牛牛生活
页面
统计
关于
搜索到
484
篇与
的结果
2020-12-13
一对多
一对多处理一个老师拥有多个学生(对老师而言,就是一对多的关系)1、新建实体类Teacherpackage com.sw.pojo; import lombok.Data; import java.io.Serializable; import java.util.List; /** * @Author suaxi * @Date 2020/12/13 10:55 */ @Data public class Teacher implements Serializable { private int id; private String name; //一个老师对应多个学生 private List<Student> students; } Studentpackage com.sw.pojo; import lombok.Data; import java.io.Serializable; /** * @Author suaxi * @Date 2020/12/13 10:55 */ @Data public class Student implements Serializable { private int id; private String name; private int tid; } 2、TeacherMapper.xml配置(两种方式)<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.sw.dao.TeacherMapper"> <!--按结果集嵌套处理--> <select id="findTeacherById" resultMap="TeacherStudent"> select s.id sid,s.name sname,t.id tid ,t.name tname from student s,teacher t where s.tid = t.id and t.id = #{tid}; </select> <resultMap id="TeacherStudent" type="teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> <!-- 集合使用 collection javaType="" 指定属性的类型 集合中的泛型信息,使用 ofType 获取 --> <collection property="students" ofType="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="tid"/> </collection> </resultMap> <!--按照查询嵌套处理--> <select id="findTeacherById2" resultMap="TeacherStudent2"> select * from teacher where id = #{tid}; </select> <resultMap id="TeacherStudent2" type="Teacher"> <collection property="students" javaType="ArrayList" ofType="Student" select="findStudentByTeacherId" column="id"/> </resultMap> <select id="findStudentByTeacherId" resultType="Student"> select * from student where tid = #{tid}; </select> </mapper>注:1、关联 - association 【多对一】2、集合 - collection 【一对多】3、javaType & ofTypejavaType用来指定实体类中属性的类型ofType用来指定映射到List或者集合中的pojo类型,泛型中的约束类型
2020年12月13日
195 阅读
0 评论
0 点赞
2020-12-13
多对一
多对一处理多对一:多个学生对应一个老师对学生而言:关联,关联一个老师【多对一】对老师而言,集合,一个老师有很多学生【一对多】Demo实例:CREATE TABLE `teacher`( `id` int(11) NOT NULL, `name` VARCHAR(50) DEFAULT NULL, PRIMARY KEY (id) )ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO teacher(`id`,`name`) VALUES(1,'孙笑川'); CREATE TABLE `student`( `id` int(11) NOT NULL, `name` VARCHAR(50) DEFAULT NULL, `tid` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fktid` (`tid`), CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO student(`id`,`name`,`tid`) VALUES(1,'小明',1); INSERT INTO student(`id`,`name`,`tid`) VALUES(2,'小红',1); INSERT INTO student(`id`,`name`,`tid`) VALUES(3,'小蓝',1); INSERT INTO student(`id`,`name`,`tid`) VALUES(4,'小绿',1); INSERT INTO student(`id`,`name`,`tid`) VALUES(5,'小华',1);测试环境搭建:1、导入Lombok2、新建实体类Teacher,Student3、建立Mapper接口4、建立Mapper.xml5、在mybatis-config.xml核心配置文件中注册绑定接口6、测试查询是否成功按照嵌套查询处理:<mapper namespace="com.sw.dao.StudentMapper"> <select id="findStudent" resultMap="StudentTeacher"> select * from student; </select> <resultMap id="StudentTeacher" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <!--复杂属性需要单独处理 对象:association 集合:collection --> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="Teacher"> select * from teacher where id = #{id}; </select> </mapper>按照结果嵌套处理:<!--按结果集嵌套处理--> <select id="findStudent2" resultMap="StudentTeacher2"> select s.id sid,s.name sname,t.name tname from student s,teacher t where s.tid = t.id; </select> <resultMap id="StudentTeacher2" type="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" javaType="Teacher"> <result property="name" column="tname"/> </association> </resultMap>
2020年12月13日
173 阅读
0 评论
0 点赞
2020-12-13
Lombok
Lombok使用步骤:1、在IDEA中安装Lombok插件2、在pom.xml导入lombok依赖<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency>3、在实体类上加注解说明:@Getter and @Setter @FieldNameConstants @ToString @EqualsAndHashCode @AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor @Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog @Data @Builder @SuperBuilder @Singular @Delegate @Value @Accessors @Wither @With @SneakyThrows @val @var experimental @var @UtilityClass Lombok config system Code inspections Refactoring actions (lombok and delombok)@Data:无参构造,get、set、toString、hashcode、equals @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @toString @Getter
2020年12月13日
279 阅读
0 评论
0 点赞
2020-12-13
CRUD(Mybatis注解开发)
CRUD(Mybatis注解)1、在创建工具类时可以设置自动提交事务public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(true); } 2、接口package com.sw.dao; import com.sw.pojo.User; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Map; /** * @Author suaxi * @Date 2020/12/11 17:00 */ public interface UserMapper { //删除用户 @Delete("delete from user where id = #{uid}") int deleteUserById(@Param("uid")int id); //根据id查询 //注意:有多个参数时必须加上@Param("")注解 //例:根据id和用户名查询 //User finUser(@Param("id")int id,@Param("username")String name) @Select("select * from user where id = #{id}") User findUserById(@Param("id")int id); //查询所有用户 @Select("select * from user") List<User> findUser(); } 3、测试类package com.sw; import com.sw.dao.UserMapper; import com.sw.pojo.User; import com.sw.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; /** * @Author suaxi * @Date 2020/12/12 21:49 */ public class UserMapperTest { @Test public void findUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); // List<User> userList = mapper.findUser(); // for (User user : userList) { // System.out.println(user); // } // User user = mapper.findUserById(1); // System.out.println(user); mapper.deleteUserById(4); sqlSession.close(); } } 4、注:在mybatis-config.xml中必须注册绑定接口<mappers> <mapper class="com.sw.dao.UserMapper"/> </mappers>5、关于@Parm()注解基本类型的参数或String类型需要加上引用类型不需要加如果只有一个基本类型的话可以忽略(本身就只有它一个值)在SQL中引用的就是@Param()中设定的属性名6、#{}与${}的区别#{}采用预编译的方式,相当于JDBC的占位符PreparedStatement一个#{}就是一个占位符Mybatis在为#{}设置值时会加引号${}采用直接拼接的方式,不对数值做预编译Mybatis在为${}设置值时不加引号存在sql注入的问题
2020年12月13日
124 阅读
0 评论
0 点赞
2020-12-13
分页
分页使用的Limit分页:--语法:SELECT * FROM USER LIMIT startIndex,pageSize SELECT * FROM USER LIMIT 0,2; --每页显示2条数据,从0开始查使用Mybatis分页:1、接口//分页 List<User> getUserByLimit(Map<String,Integer> map);2、UserMapper.xml<!--分页--> <select id="getUserByLimit" parameterType="map" resultMap="UserMap"> select * from user limit #{startIndex},#{pageSize}; </select>3、测试package com.sw.test; import com.sw.dao.UserMapper; import com.sw.pojo.User; import com.sw.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @Author suaxi * @Date 2020/12/11 17:08 */ public class UserDaoTest { @Test public void getUserByLimit(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String, Integer> map = new HashMap<>(); map.put("startIndex",0); map.put("pageSize",2); List<User> userlist = mapper.getUserByLimit(map); for (User user : userlist) { System.out.println(user); } sqlSession.close(); } }RowBounds分页:不再使用sql实现分页1、接口//分页2 List<User> getUserByRowBounds();2、UserMapper.xml<!--分页2--> <select id="getUserByRowBounds" resultMap="UserMap"> select * from user; </select>3、测试package com.sw.test; import com.sw.dao.UserMapper; import com.sw.pojo.User; import com.sw.utils.MybatisUtils; import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @Author suaxi * @Date 2020/12/11 17:08 */ public class UserDaoTest { @Test public void getUserByRowBounds(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); //RowBounds RowBounds rowBounds = new RowBounds(0, 2); List<User> userList = sqlSession.selectList("com.sw.dao.UserMapper.getUserByRowBounds", null, rowBounds); for (User user : userList) { System.out.println(user); } sqlSession.close(); } } PageHelper链接:https://pagehelper.github.io/
2020年12月13日
110 阅读
0 评论
0 点赞
2020-12-13
日志(Mybatis)
日志1、日志工厂掌握LOG4J、STDOUT_LOGGINGSTDOUT_LOGGING标准日志输出在mybatis核心配置文件中配置:<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>2、log4j什么是log4j?是Apache的一个开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件可以控制每一条日志的输出格式定义每一条日志信息的级别可以灵活配置配置文件1、导入log4j依赖<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>2、log4j.properties#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 log4j.rootLogger=DEBUG,console,file #控制台输出的相关设置 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%c]-%m%n #文件输出的相关设置 log4j.appender.file = org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/mybatis.log log4j.appender.file.MaxFileSize=10mb log4j.appender.file.Threshold=DEBUG log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n #日志输出级别 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG简单使用:1.在要使用log4j的类中,导入import org.apache.log4j.Logger;2.日志对象,参数为当前类的classstatic Logger logger = Logger.getLogger(UserDaoTest.class);3.日志级别logger.info("info:进入testLog4j方法"); logger.debug("debug:进入testLog4j方法"); logger.error("error:进入testLog4j方法");
2020年12月13日
102 阅读
0 评论
0 点赞
2020-12-10
jQuery
引入<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--引入jQuery--> <!--<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>--> <script src="lib/jquery-3.5.1.js"></script> </head> <body> <!-- 公式:$(selector).action() --> <a href="" id="test">点我</a> <script> $('#test').click(function () { alert("Hello World"); }) </script> </body> </html>选择器//css中的选择器在jQuery中全都能用 $('p').click(); //标签选择器 $('#id').click(); //id选择器 $('.class').click(); //class(类)选择器文档工具站:https://jquery.cuishifeng.cn/事件获取鼠标当前坐标Demo:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="lib/jquery-3.5.1.js"></script> <style> #divMove{ width: 800px; height: 800px; border: 1px solid black; } </style> </head> <body> <!--获取鼠标的当前坐标--> mouse:<span id="mouseMove"></span> <div id="divMove"> 移动鼠标试试 </div> <script> //当网页元素加载完毕之后,响应事件 $(function () { $('#divMove').mousemove(function (e) { $('#mouseMove').text('x:'+ e.pageX + 'y:'+e.pageY); }) }); </script> </body> </html>操作DOM节点文本操作$('ul li[id=test02]').text(); //获取值(解析为文本) $('ul li[id=test02]').text('abc'); //设置值 $('ul li[id=test01]').html(); //同理(解析为html) $('ul li[id=test01]').html('<strong>abc</strong>');CSS操作$('ul li[id=test02]').css({"color","red"});元素的显示和隐藏:本质:更改display属性$('ul li[id=test02]').show(); //显示 $('ul li[id=test02]').hide(); //隐藏
2020年12月10日
172 阅读
0 评论
0 点赞
2020-12-10
操作表单(验证)
表单的目的:提交信息获得要提交的信息<form action="post"> <p> <span>用户名:</span><input type="text" id="username"> </p> <!--多选框的值就是定义好的value--> <p> <span>性别:</span> <input type="radio" name="sex" value="man" id="boy">男 <input type="radio" name="sex" value="woman" id="girl">女 </p> </form> <script> var input_text = document.getElementById('username'), boy_radio = document.getElementById('boy'), girl_radio = document.getElementById('girl'); //得到输入框的值 input_text.value; //修改输入框的值 input_text.value = 'test'; //对于单选框、多选框等,只能取到固定的值,例如:value boy_radio.value ---> man boy_radio.checked; //查看返回的结果,如果为true,则被选中,否则反之 girl_radio.checked = true; //赋值(当前选中的性别修改为女) </script>提交表单<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--md5工具类--> <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script> </head> <body> <!-- 表单绑定提交事件 onsubmit 绑定一个提交检测的函数,true false 将这个结果返回给表单,使用onsubmit接收 --> <form action="" method="post" onsubmit="return test()"> <p> <span>用户名:</span><input type="text" name="username" id="username"> </p> <p> <span>密码:</span><input type="password" id="input-password"> </p> <input type="hidden" name="password" id="md5-pwd"> <button type="submit">提交</button> </form> <script> function test() { var uname = document.getElementById('username'), pwd = document.getElementById('input-password'), md5pwd = document.getElementById('md5-pwd'); //md5加密,同时通过hidden表单优化password框 md5pwd.value = md5(pwd.value); //校验表单内容,true通过,false阻止提交 return true; } </script> </body> </html>md5加密及表单优化:补充说明:1、通过md5加密提交的数据2、设置隐藏的input提交密码,优化用户体验,即:md5pwd.value = md5(pwd.value);将提交的password值赋值给隐藏的(hidden)input框,具体表现为:用户点击提交时,密码框中的字符串在页面跳转时不会突然变长
2020年12月10日
197 阅读
0 评论
0 点赞
2020-12-09
操作DOM对象
核心浏览器网页就是一个Dom树形结构更新:更新Dom节点遍历:得到Dom节点删除:删除一个Dom节点添加:添加一个新的节点注:要操作一个Dom节点,必须先获得这个Dom节点获得DOM节点var h1 = document.getElementsByTagName('h1'); var p1 = document.getElementById('test01'); var p2 = document.getElementsByClassName('test02'); var father = document.getElementById('father'); var childrens = father.children[index]; //获取父节点下的子节点 //father.firstChild;更新节点<div id="test"> </div> <script> var test = document.getElementById('test'); </script>操作文本test.innerText='abc' //修改文本的值 test.innerHTML='<strong>abc</strong>' 解析HTML文本标签操作JStest.style.color = 'red'; //属性使用字符串包裹 test.style.fontSize = '18px'; // font-size 转 fontSize驼峰命名 test.style.padding = '2em';删除节点步骤:先获取父节点,再通过父节点删除自己<div id="father"> <h1>标题</h1> <p id="test01">xxx</p> <p class="test02">xxxxx</p> </div> <script> var self = document.getElementById('test01'); var father = test01.parentElement; father.removeChild(self); </script>注:删除多个节点的时候,children是动态变化的插入节点在获得DOM节点时,如果这个节点已经存在元素,就不能再使用innerHTML操作,会产生覆盖。追加:<p id="test01">数学</p> <div id="list"> <p id="test02">语文</p> <p id="test03">英语</p> <p id="test04">美术</p> </div> <script> var test01 = document.getElementById('test01'), list = document.getElementById('list'); list.appendChild(test01); </script>追加前:追加后:创建一个新的标签实现插入var test01 = document.getElementById('test01'), list = document.getElementById('list'), //通过js创建一个新的节点 test05 = document.createElement('p'); //创建一个p标签 test05.id = 'test05'; test05.innerText = '体育'; list.appendChild(test05) //list.appendChild(test01); //创建一个标签节点 var script = document.createElement('script'); script.setAttribute('type','text/javascript'); list.appendChild(script); //创建一个style标签 var style = document.createElement('style'); //创建一个style标签 style.setAttribute('type','text/css'); style.innerHTML = 'body{background-color: yellow}'; //设置标签内容 document.getElementsByTagName('head')[0].appendChild(style);insertBeforevar test01 = document.getElementById('test01'); var test02 = document.getElementById('test02'); var list = document.getElementById('list'); //要包含的节点.insertBefore(newNode,targetNode) list.insertBefore(test01,test02);
2020年12月09日
123 阅读
0 评论
0 点赞
2020-12-09
操作BOM对象
Browser Object Model:浏览器对象模型windowwindow代表浏览器窗口window.alert("Hello World") undefined window.innerHeight 906 window.innerWidth 559 ……Navigator(不建议使用)Navigator封装了浏览器的信息navigator.appVersion "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" navigator.userAgent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" navigator.platform "Win32" ……注:一般情况下不使用navigator,存在被人为修改的隐患screen代表屏幕规格screen.width 1920 screen.height 1080locationlocation代表当前页面的URL信息host:"www.bing.com" href:"https://www.bing.com" protocol:"https:" reload:ƒ reload() //重新加载,刷新网页 //设置新的地址 location.assign('https://xxx.com')documentdocument代表当前的页面,HTML DOM文档树获取具体的文档树节点<dl id="test"> <dt>JavaScript</dt> <dd>demo01</dd> <dd>demo02</dd> </dl> <script> var dl = document.getElementById('test'); </script>获取cookiedocument.cookie劫持cookie原理:通过js恶意代码在服务器端可以设置cookie:httpOnlyhistory(不建议使用)history代表浏览器的历史记录history.back() //后退 history.forward() //前进
2020年12月09日
178 阅读
0 评论
0 点赞
1
...
38
39
40
...
49