ToB企服应用市场:ToB评测及商务社交产业平台

标题: JavaWeb后端底子(3) [打印本页]

作者: 一给    时间: 11 小时前
标题: JavaWeb后端底子(3)
原打算把Mysql操作数据库的一些知识写进去,但是感觉没须要,要是如今会的都是简单的增删改查,所以,这一篇,我直接从java操作数据库开始写,所以这一篇大致就是记一下JDBC、MyBatis、以及SpringBoot的配置文件
JDBC

JDBC是java最底层最底子的操作数据库的技术,这一部分因为之后用的少,我直接从代码开始看了。
  1. @Test
  2.     public void testUpdata() throws ClassNotFoundException, SQLException {
  3.         //注册驱动
  4.         Class.forName("com.mysql.cj.jdbc.Driver");
  5.         //获取数据库链接
  6.         String url = "jdbc:mysql://localhost:3306/web01";
  7.         String username = "root";
  8.         String password = "123456";
  9.         Connection connection = DriverManager.getConnection(url, username, password);
  10.         //获取SQL语句执行对象
  11.         Statement statement = connection.createStatement();
  12.         //执行SQL
  13.         int flag = statement.executeUpdate("update user set age = 25 where id = 1");//DML语句
  14.         System.out.println("sql语句执行完毕 影响记录数" + flag);
  15.         //释放资源
  16.         statement.close();
  17.         connection.close();
  18.     }
复制代码
这是基本操作的几个步调, 注册驱动 数据库连接 获取SQL语句执行对象 然后执行SQL 关流
在SQL语句,为了防止SQL注入,我们一般使用参数动态传递,也就是预编译SQL,不但可以防止SQL注入,而且性能更高,缓存会存储已编译的SQL语句。举个栗子
  1.     @Test
  2.     public void testSelect() {
  3.         String url = "jdbc:mysql://localhost:3306/web01";
  4.         String username = "root";
  5.         String password = "123456";
  6.         String sql = "SELECT id, username, password, name, age FROM user WHERE username = ? AND password = ?";
  7.         // 用于存储查询结果的 User 列表
  8.         List<User> userList = new ArrayList<>();
  9.         // JDBC 连接和查询
  10.         try (Connection connection = DriverManager.getConnection(url, username, password);
  11.              PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
  12.             // 设置 SQL 参数
  13.             preparedStatement.setString(1, "daqiao");
  14.             preparedStatement.setString(2, "123456");
  15.             // 执行查询
  16.             try (ResultSet resultSet = preparedStatement.executeQuery()) {
  17.                 // 遍历结果集
  18.                 while (resultSet.next()) {
  19.                     // 将每一行数据封装到 User 对象中
  20.                     User user = new User();
  21.                     user.setId(resultSet.getInt("id"));
  22.                     user.setUsername(resultSet.getString("username"));
  23.                     user.setPassword(resultSet.getString("password"));
  24.                     user.setName(resultSet.getString("name"));
  25.                     user.setAge(resultSet.getInt("age"));
  26.                     // 将 User 对象添加到列表
  27.                     userList.add(user);
  28.                 }
  29.             }
  30.         } catch (SQLException e) {
  31.             e.printStackTrace();
  32.         }
  33.         // 输出查询结果
  34.         for (User user : userList) {
  35.             System.out.println(user);
  36.         }
  37.     }
复制代码

MyBatis 

MyBatis是一款良好的长期层框架,用于简化JDBC的开发,也就是之前提到的DAO层。通过Mybatis就可以大大简化原生的JDBC程序的代码编写。在pom文件中导入Mybatis依赖即可使用。
在java中对于数据库的数据,一般都使用对象举行封装。
配置

然后在java文件夹的resouse中有一个数据库的配置文件application.properties,用于配置数据库的连接信息
  1. #数据库访问的url地址
  2. spring.datasource.url=jdbc:mysql://localhost:3306/web
  3. #数据库驱动类类名
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. #访问数据库-用户名
  6. spring.datasource.username=root
  7. #访问数据库-密码
  8. spring.datasource.password=root@1234
  9. #mybatis的配置
  10. mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
复制代码
但是碰到特别复杂的工程配置,一般使用application.yml举行配置 方便 直观 清晰
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl这条配置是查看SQL语句执行的日志信息
  1. spring:
  2.   application:
  3.     name: springboot-mybatis-quickstart
  4.   #配置数据库连接信息
  5.   datasource:
  6.     type: com.alibaba.druid.pool.DruidDataSource
  7.     url: jdbc:mysql://localhost:3306/web01
  8.     driver-class-name: com.mysql.cj.jdbc.Driver
  9.     username: root
  10.     password: 123456
  11. mybatis:
  12.   configuration:
  13.     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  14.   mapper-locations: classpath:com.ght666.mapper/*.xml
复制代码
编写

一般编写Mybatis程序 是在mapper包中编写Mybatis的长期层接口,定义SQL语句(注解)
  1. package com.ght666.mapper;
  2. import com.ght666.pojo.User;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import org.apache.ibatis.annotations.Select;
  5. import java.util.List;
  6. @Mapper//应用程序在运行时会自动的为该接口创建一个实现类对象,并且会自动将该实现类对象存入IOC容器 -bean对象
  7. public interface UserMapper {
  8.     @Select("select * from user")
  9.     public List<User> findAll();
  10. }
复制代码

      程序运行时,框架会自动生成接口的实现类对象(署理对象),并给交Spring的IOC容器管理

在创建出来的SpringBoot工程中,在src下的test目次下,已经自动帮我们创建好了测试类 ,而且在测试类上已经添加了注解 @SpringBootTest,代表该测试类已经与SpringBoot整合。
该测试类在运行时,会自动通过引导类加载Spring的环境(IOC容器)。我们要测试谁人bean对象,就可以直接通过@Autowired注解直接将其注入举行,然后就可以测试了。
  1. @SpringBootTest //springboot单元测试注解 当前测试类的测试方法运行时 会自动启动Springboot 产生IOC容器
  2. class SpringbootMybatisQuickstartApplicationTests {
  3.     @Autowired
  4.     private UserMapper userMapper;
  5.     @Test
  6.     public void testFindAll() {
  7.         List<User> userList = userMapper.findAll();
  8.         userList.forEach(System.out::println);//方法引用
  9.     }
  10. }
复制代码
 数据库连接池

数据库连接池是个容器,负责分配、管理数据库连接(Connection),程序在启动时,会在数据库连接池(容器)中,创建肯定数量的Connection对象

答应应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
客户端在执行SQL时,先从连接池中获取一个Connection对象,然后在执行SQL语句,SQL语句执行完之后,释放Connection时就会把Connection对象归还给连接池(Connection对象可以复用)
释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏,客户端获取到Connection对象了,但是Connection对象并没有去访问数据库(处于空闲),数据库连接池发现Connection对象的空闲时间 > 连接池中预设的最大空闲时间,此时数据库连接池就会自动释放掉这个连接对象
Spring默认连接池是Hikari(追光者),还有一个常用的是阿里巴巴开源的数据库连接池项目Druid
如果使用Druid连接池,先添加依赖,再在application配置文件中引入数据库连接配置
  1. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
复制代码
Mybatis占位符 

在Mybatis中,占位符是#{...} 生成的是预编译的SQL语句。例如:
  1. /**
  2. * 根据id删除
  3. */
  4. @Delete("delete from user where id = #{id}")
  5. public void deleteById(Integer id);
复制代码

符号说明场景
#{…}占位符。执行时,会将#{…}替换为?,生成预编译SQL参数值传递
${…}拼接符。直接将参数拼接在SQL语句中,存在SQL注入问题表名、字段名动态设置时使用
增补一个点:有一个注解,@param,这个注解的作用是为接口的方法形参起名字的。(由于用户名唯一的,所以查询返回的结果最多只有一个,可以直接封装到一个对象中)举个栗子
  1. /**
  2. * 根据用户名和密码查询用户信息
  3. */
  4. @Select("select * from user where username = #{username} and password = #{password}")
  5. public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
复制代码
XML映射配置

Mybatis的开发有两种方式:注解  XML。使用Mybatis的注解方式,重要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,发起使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。
XML映射文件的名称与Mapper接口名称同等,而且将XML映射文件和Mapper接口放置在雷同包下(同包同名) 如果不同包同名,可以在配置文件中添加配置
  1. mybatis:
  2.   mapper-locations: classpath:com.ght666.mapper/*.xml
复制代码

XML映射文件的namespace属性为Mapper接口全限定名,XML映射文件中sql语句的id与Mapper接口中的方法名同等,并保持返回范例同等
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.ght666.mapper.UserMapper">
  6.     <!--查询操作-->
  7.     <select id="findAll" resultType="com.ght666.pojo.User">
  8.         select * from user
  9.     </select>
  10. </mapper>
复制代码
SpringBoot配置文件

重要就是yml配置文件的语法:

yml文件中常见的数据格式。在这里我们重要先容最为常见的两类:
  1. user:
  2.   name: zhangsan
  3.   age: 18
  4.   password: 123456
  5. hobby:
  6.   - java
  7.   - game
  8.   - sport
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4