首页
关于
Search
1
sql的注入原因和解决办法
138 阅读
2
SpringBoot整合腾讯云存储COS及基本使用,增删改查......
128 阅读
3
深究contains方法
100 阅读
4
多线程概述
74 阅读
5
学习的第一个注解@WebServlet - JavaWeb
73 阅读
默认分类
Java
C/C++
Mysql
JavaWeb
SpringBoot
算法
前端
Linux
Search
标签搜索
Spring
HTTP
Java
JavaWeb
IOC
mybatis
腾讯云
COS
云存储
CDN
redis
分布式
id
全局唯一id
Typecho
累计撰写
26
篇文章
累计收到
2
条评论
首页
栏目
默认分类
Java
C/C++
Mysql
JavaWeb
SpringBoot
算法
前端
Linux
页面
关于
搜索到
14
篇与
Java
的结果
2022-04-30
Servlet JDBC六步
网上有把步骤分为七步的,其实就是把准备数据库账号密码地址又分为了一个步骤六步注册驱动告诉数据库,即将来凝结哪个品牌的数据库获取连接表示jvm的进程和数据库进程之间的通道打开了。获取数据库操作对象、专门执行sql语句的对象执行sql语句DQL和DML处理查询结果集只有当第四步执行的时select语句的时候,才有第五步查询结果集。释放资源java和数据库之间属于进程间的通信,开启后一定要关闭。注意:只有查询操作才有第五步。因为查询外的操作只是返回"影响的行数",只需要用int类型变量接收就可以了。而查询操作返回的是一个ResultSet结果集,需要额外处理。查先提前获取所需对象Connection conn = null; Statement stmt = null; ResultSet rs = null;注册驱动// 1. 注册驱动 Driver driver = new Driver(); DriverManager.registerDriver(driver); //合写成一句 DriverManager.registerDriver(new Driver());获取数据库连接//先获取数据库url和账号密码 String url = "jdbc:mysql://127.0.0.1:3306/userdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true"; String user = "root"; String password = "123456"; //注册驱动 conn = DriverManager.getConnection(url,user,password);获取数据库操作对象Statement stmt = conn.createStatement();执行sql语句。该语句为查询操作,执行完后需接收结果String sql = "select * from userinfo"; ResultSet rs = stmt.executeQuery(sql);处理结果集while (rs.next()){ String value = rs.getString("userId")+", "+rs.getString("userName"); System.out.println(value); }释放数据库连接。查询操作有三个对象,需要分开关闭,并且处理异常。if (rs != null){ try { rs.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(stmt != null){ try { stmt.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } }增删改第四步:执行sql增删改语句的返回值是”影响的行数“,int类型变量接收即可。if接收到的变量是否为一就可以知道是否执行成功。int count = statement.executeUpdate(sql); System.out.println(count==1?"成功":"失败");六步完整代码public class Query { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //注册驱动 DriverManager.registerDriver(new Driver()); //获取数据库连接 String url = "jdbc:mysql://127.0.0.1:3306/userdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true"; String user = "root"; String password = "123456"; conn = DriverManager.getConnection(url, user, password); //获取数据库操作对象 stmt = conn.createStatement(); //执行sql语句 String sql = "select * from userinfo"; rs = stmt.executeQuery(sql); //处理结果集 while (rs.next()){ String value = rs.getString("userId")+", "+rs.getString("userName"); System.out.println(value); } } catch (SQLException throwables) { throwables.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally { //关闭连接 if (rs != null) { try { rs.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } }五步完整代码public class Insert { public static void main(String[] args) { Connection conn = null; Statement statement = null; try { // 1. 注册驱动 DriverManager.registerDriver(new Driver()); // 2. 获取连接 String url = "jdbc:mysql://127.0.0.1:3306/userdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true"; String user = "root"; String password = "123456"; conn = DriverManager.getConnection(url,user,password); // 3. 获取数据库操作对象 statement = conn.createStatement(); // 4. 执行sql语句 String sql = "insert into userinfo(userId, userName, gender, roleId, userPassword) values('user10', 'achong', 1,1,'123123')"; int count = statement.executeUpdate(sql); System.out.println(count); System.out.println(count==1?"成功":"失败"); } catch (SQLException throwables) { throwables.printStackTrace(); }finally { // 6. 释放资源 if (statement != null){ try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } }
2022年04月30日
44 阅读
0 评论
0 点赞
2022-04-11
学习的第一个注解@WebServlet - JavaWeb
@WebServlet@WebServlet的适当使用可以在一定程度上替代web.xml文件name属性:用来指定Servlet的名字,等同于<servlet-name>vlaue属性:用来指定Servlet的映射路径,可以指定多个字符串,等同于<url-pattern>urlPatterns属性:用来指定Servlet的映射路径,可以指定多个字符串,等同于<url-pattern>loadOnStartUp属性:用来指定在服务器启动阶段是否加载该Servlet,等同于<load-on-startup>注意:当注解的属性是一个数组,且数组中只有一个元素,大括号可以省略。@WebServlet(value="/hello")如果注解的属性名是value的话,属性名也是可以省略的。@WebServlet("/hello") 3.value和urlPatterns的作用是一样的。@WebServlet 源码// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package javax.servlet.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface WebServlet { String name() default ""; String[] value() default {}; String[] urlPatterns() default {}; int loadOnStartup() default -1; WebInitParam[] initParams() default {}; boolean asyncSupported() default false; String smallIcon() default ""; String largeIcon() default ""; String description() default ""; String displayName() default ""; }
2022年04月11日
73 阅读
0 评论
0 点赞
2022-03-13
解决Tomcat服务其在DOS命令窗口的乱码问题(控制台乱码)
解决前的DOS界面:解决后的DOS界面:解决方法:只需修改小猫的apache-tomcat-8.5.75conflogging.properties这份文件里的43行代码。将原来的编码UTF-8改成GBK即可。因为DOS界面是GBK的编码方式。
2022年03月13日
61 阅读
0 评论
0 点赞
2022-03-11
可变长度参数
可变参数可变长度参数作出现在方法形参列表中。可变长度参数要求的参数个数是:0 ~ N 个;普通参数和可变长度参数可同时出现在修饰符列表。可变长度参数在参数列表中必须在最后一个,且只能有一个。可变长度参数可以当作一个数组来看1.只有可变长度参数 全部参数都会赋给可变长度参数a。public static void main(String[] args) { sum(1,2,3,4,5,6,7,8,9,10); } public static void sum(int...a){ int sum = 0; for (int j : a){ sum+=j; } System.out.println(sum); }2.当普通参数和可变长度参数同时出现 在传进去的参数里,1会赋给普通参数b,2会赋给普通参数c,剩下的全部赋给可变长度参数a。public static void main(String[] args) { sum(1,2,3,4,5,6,7,8,9,10); } public static void sum(int b,int c, int...a){ int sum = 0; sum = sum + (b + c); for (int i : a){ sum += i; } System.out.println(sum); }
2022年03月11日
47 阅读
0 评论
0 点赞
2022-03-06
深究contains方法
contains方法解析在java中,contains方法用于判断集合中是否包含某个元素,包含则返回true,否则返回false。boolean contains(Object o); //先看一个案例:字符串str实际上没添加进集合c里,但是contains返回的结果却是true?也就是说,contains发现str包含在c集合里。public static void main(String[] args) { //创建集合对象 Collection c = new ArrayList(); //添加数据 c.add("abc"); c.add(123); //1.str实际上没添加进集合c里,但是contains返回的结果却是true? String str = "abc"; System.out.println("str是否包含在集合里:"+c.contains(str)); //true 再看第二个案例:new了两个属性相同的学生对象stu1和stu2。跟代码一逻辑一样,把stu1添加进集合里,因为两个学生的名字是相同的,所以用contains方法比较stu2是否包含在集合c里,然而这次返回结果是false,为什么,明明两个学生名字一样啊。public static void main(String[] args) { //创建集合对象 Collection c = new ArrayList(); //添加数据 c.add("abc"); c.add(123); //2.根据上面的逻辑,这次new两个属性相同的学生对象stu1和stu2,把stu1添加进集合里,然后判断stu2是否在集合里,这次结果为false Student stu1 = new Student("小明"); Student stu2 = new Student("小明"); c.add(stu1); System.out.println("学生对象stu是否在集合c里:"+c.contains(stu2)); //false } } //学生类 class Student{ String name; //带参构造方法 public Student(String name) { this.name = name; }原因: 通过查看实现类ArrayList里的contains方法可以发现,从contains()到indexOf(),再到indexOfRange(),在最后的indexOfRange()方法里,调用了equals()方法来进行比较。//contains的底层源码 public boolean contains(Object o) { return indexOf(o) >= 0; } public int indexOf(Object o) { return indexOfRange(o, 0, size); } int indexOfRange(Object o, int start, int end) { Object[] es = elementData; // if (o == null) { for (int i = start; i < end; i++) { if (es[i] == null) { return i; } } } else { for (int i = start; i < end; i++) { if (o.equals(es[i])) { return i; } } } return -1; }结论分析 关于equals方法,我们得知道,所有的子类默认继承Object类,而Object的equels方法只是返回对象内存地址。 由此分析代码一:集合里有一个字符串“abc”,创建一个String变量赋值“abc”,两者本质上都是字符串,且String类型已经重写equals方法。contains在对两个比较的时候调用的是equals方法,由于String类的已经重写了,返回的是属性而不是内存地址,故字符串可以被正确比较。 代码二分析:虽然两个学生的名字属性一样,但是,集合保存的是对象的内存地址,而Student类没有重写equals方法,所以contains方法在调用equals方法判断的时候,判断的是两个对象的地址,两个对象的内存地址肯定不一样,所以返回false。 代码二解决方案:重写Student的equals方法,使其返回对象属性,即可获取正确的判断。//学生类重写的equals方法 class Student{ String name; public Student(String name) { this.name = name; } @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Student)) return false; if(obj == this) return true; Student s = (Student) obj; if(this.name == s.name) return true; return false; } }再看以下代码:Integer x = 1000; Integer y = 1000; c.add(x); System.out.println(c.contains(y)); //true虽然new了两个不一样的对象,但是Integer包装类重写了equals方法,所以x和y是一样的。结论:放在集合里的类型,一定要重写equals方法。注意:remove删除方法也是调用的equals方法。
2022年03月06日
100 阅读
0 评论
1 点赞
1
2
3