ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

第6章 后端Web基础 (MyBatis)

第6章 后端Web基础 (MyBatis) 一、JDBCJDBC(Java DataBase Connectivity)就是使用Java语言操作关系型数据库的一套API。本质sun公司官方定义的一套操作所有关系型数据库的规范即接口。各个数据库厂商去实现这套接口提供数据库驱动jar包。我们可以使用这套接口JDBC编程真正执行的代码是驱动jar包中的实现类。1、执行DML语句步骤准备工作创建一个maven项目引入依赖并准备数据库表user。配置文件中声明的jar包依赖dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version8.0.33/version /dependency代码实现JDBC程序操作数据库//1. 注册驱动 Class.forName(com.mysql.cj.jdbc.Driver); ​ //2. 获取连接 String url jdbc:mysql://localhost:3306/web01; String username root; String password 1234; Connection connection DriverManager.getConnection(url, username, password); ​ //3. 获取SQL语句执行对象 Statement statement connection.createStatement(); ​ //4. 执行SQL DML语句 int i statement.executeUpdate(update user set age 25 where id 1); System.out.println(SQL执行完毕影响的记录数为: i); ​ //5. 释放资源 statement.close(); connection.close();2、执行DQL语句ResultSet结果集对象ResultSet rs statement.executeQuery()next()将光标从当前位置向前移动一行并判断当前行是否为有效行返回值为boolean。true有效行当前行有数据false无效行当前行没有数据getXxx(..)获取数据可以根据列的编号获取也可以根据列名获取推荐。public static void main(String[] args) throws Exception { //1. 加载驱动 - com.mysql.cj.jdbc.Driver Class.forName(com.mysql.cj.jdbc.Driver); ​ //2. 建立连接 String url jdbc:mysql://localhost:3306/web01; String dbUsername root; String dbPassword root; Connection conn DriverManager.getConnection(url, dbUsername, dbPassword); ​ //3. 执行SQL语句 - SQL执行对象 PreparedStatement //3.1 定义SQL - 预编译SQL String sql SELECT id, username, password, name, age FROM user WHERE username ? AND password ?; PreparedStatement stmt conn.prepareStatement(sql);//将三个占位符“”填充 stmt.setString(1, daqiao); stmt.setString(2, 123456); ​ //3.2 执行查询 ResultSet rs stmt.executeQuery(); ​ //4. 处理结果 ListUser users new ArrayList(); while (rs.next()) { User user new User( rs.getInt(id), rs.getString(username), rs.getString(password), rs.getString(name), rs.getInt(age) ); users.add(user); } ​ //5. 释放资源 rs.close(); stmt.close(); conn.close(); ​ for (User user : users) { System.out.println(user); } }1.JDBC程序执行DML语句?DQL语句?DML语句:int rowsAffected statement.executeUpdate();返回影响的行数DQL语句:ResultSet rs statement.executeQuery();返回结果集2.DQL语句执行完毕结果集ResultSet解析?resultSet.next()光标往下移动一行resultSet.getXxx()获取字段数据3、预编译SQL1两种方式对比静态SQLStatement参数硬编码Statement statement connection.createStatement(); int i statement.executeUpdate(update user set age 25 where id 1); System.out.println(SQL执行完毕,影响的记录数为: i);预编译 SQLPreparedStatement动态传参:安全、性能更高PreparedStatement pstmt conn.prepareStatement(SELECT * FROM user WHERE username ? AND password ?); pstmt.setString(1, daqiao); pstmt.setString(2, 123456); ResultSet resultSet pstmt.executeQuery();2预编译SQL的优点优势一可以防止SQL注入更安全SQL注入通过控制输入来修改事先定义好的SQL语句以达到执行代码对服务器进行攻击的方法。优势二性能更高对比静态SQL预编译SQL只需要执行一次将SQL语句加载到缓存中而静态SQL需要加载三次二、MyBatisMyBatis是一款优秀的持久层框架用于简化JDBC的开发。MyBatis本是Apache的一个开源项目iBatis201o年这个项目由apache迁移到了googlecode并且改名为MyBatis。2013年11月迁移到Github。官网:MyBatis 3 | 简介 – mybatis1、入门程序准备工作1创建SpringBoot工程、引入Mybatis相关依赖新建项目SpringBoot、Maven引入依赖包括Developer Tools/Lombok、SQL/MyBatis Framwork、SQL/MySQL Driver2准备数据库表user、实体类User包下创建pojo包User类package com.itheima.pojo; ​ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; ​ Data NoArgsConstructor AllArgsConstructor public class User { private Integer id; private String username; private String password; private String name; private Integer age; }3配置Mybatis在application.properties中数据库连接信息)配置信息spring.application.namespringboot-mybatis-quickstart ​ #配置数据库的连接信息 spring.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.datasource.urljdbc:mysql://localhost:3306/web01 spring.datasource.usernameroot spring.datasource.passwordroot spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver ​ #配置Mybatis的日志输出 输出控制台中 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl4编写Mybatis程序编写Mybatis的持久层接口定义SQL(注解/XML)提示Mybatis的持久层接口命名规范为XxxMapper也称为Mapper接口。包下创建mapper包UserMapper类Mapper // 表示该接口是一个mybatis的mapper接口, Mybatis会自动扫描该接口, 为接口生成实现类对象(代理), 并将对象交给Spring管理 -- bean public interface UserMapper { ​ /** * 查询所有用户 */ Select(select id, username, password, name, age from user) public ListUser findAll(); }5编写测试代码注意测试类所在包需要与引导类包名相同或放在引导类所在包的子包下)SpringBootTest //运行该测试类时自动加载springboot的环境。 class SpringbootMybatisQuickstartApplicationTests { Autowired private UserMapper userMapper; Test public void testFindAll(){ ListUser userList userMapper.findAll(); userList.forEach(System.out::println); }6若出现乱码若项目中字符集出现乱码。在这里修改字符集编码方式2、入门程序辅助配置1配置SQL提示在Mapper接口文件中双引号里面的文本识别为SQL语句文本右键直接输入MySQL2IDEA中识别数据库3配置Mybatis的日志输出为了看到SQL的执行日志在配置文件application.properties中#配置Mybatis的日志输出 输出控制台中 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl2、JDBC VS MybatisMybatis自动解析SQL语句并自动封装到集合中3、数据库连接池1介绍数据库连接池是个容器负责分配、管理数据库连接(Connection)。它允许应用程序重复使用一个现有的数据库连接而不是再重新建立一个。释放空闲时间超过最大空闲时间的连接来避免因为没有释放连接而引起的数据库连接遗漏。优势1.资源重用2.提升系统响应速度3.避免数据库连接遗漏标准接口DataSource官方(sun)提供的数据库连接池接口由第三方组织实现此接口。功能获取连接Connection getConnection () throws SQLException;常见产品 CзP0、DBCP、Druid、HikariSpringBoot默认Druid德鲁伊Druid连接池是阿里巴巴开源的数据库连接池项目功能强大性能优秀是Java语言最好的数据库连接池之一2切换数据库连接池SpringBoot默认使用Hikari连接池pom.xml文件中dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.19/version /dependencyapplication.properties文件中:spring.datasource.typecom.alibaba.druid.pool.DruidDataSource4、增删改查操作1Delete操作需求根据ID删除用户信息 SQL:delete from user where id5; Mapper接口//只能删除ID为5的记录 Delete(delete from user where id 5) public void deleteByld();//可以使用参数动态传递的方式删除指定记录 Delete(delete from user where id #{id}) public void deleteByld(Integer id);//有返回值的删除操作返回值为影响的行数 Delete(delete from user where id #{id}) public Integer deleteByld(Integer id);测试类中/** * 测试根据ID删除用户 */ Test public void testDeleteById(){ //Integer i userMapper.deleteById(4); //System.out.println(i); userMapper.deleteById(4); }Mybatis中的#号与$号两种的使用场景Delete (delete from dept where id #{id}) Select (select id,name,score from $(tableName} order by $(sortField})${...}在实际开发的过程中使用场景很少2Insert操作需求添加一个用户SQLinsert into user(username,password,name,age)values(zhouyu,123456,周瑜,20);Mapper接口动态传递Insert(insert into user(username,password,name,age) values(#{username},#{password},#{name},#{age})) public void insert(User user);测试类中/** * 测试添加用户 */ Test public void testInsert(){ User user new User(null, admin66, 123456, 管理员, 18); userMapper.insert(user); }3Update操作需求根据ID更新用户信息SQL:update user set username zhouyu, password 123456,name 周瑜,age20 where id 1Mapper接口Update(update user set username#{username}, password#{password},name#{name}, age#{age} where id#{id}) public void update(User user);测试类中/** * 测试修改用户 */ Test public void testUpdate(){ User user new User(6, songjiang, 12345678, 及时雨, 48); userMapper.update(user); }4Select操作需求根据用户名和密码查询用户信息SQL:select * from user where username zhouyu and password 123456;Mapper接口param注解的作用是为接口的方法形参起名字的。若查询操作需要不止一个参数就要使用param参数Select (select * from user where username#(username} and password#(password}) public User findByUsernameAndPassword (Param(username) String uname, Param(password) String pwd);测试类中/** * 测试根据用户名和密码查询用户 */ Test public void testGetByUsernameAndPassword(){ ListUser userList userMapper.getByUsernameAndPassword(songjiang, 12345678); userList.stream().forEach(user - System.out.println(user)); } /** * 测试根据ID查询用户 */ Test public void testGetById(){ User user userMapper.getById(6); System.out.println(user); }param详解说明基于官方骨架创建的springboot项目中接口编译时会保留方法形参名Param注解可以省略#{形参名}。Select (select * from user where username#(uname}and password#(pwd}) public User findByUsernameAndPassword (String uname, String pwd);官方骨架创建的SpringBoot项目都有一个共同点都继承了父项目的配置parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.8/version relativePath/ !-- lookup parent from repository -- /parent因为父工程在创建的时候用了一个maven的插件这个插件的配置项为true可以在编译的过程中的字节码文件中保留接口方法中的形参名称plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId configuration parameterstrue/parameters /configuration /plugin在编译后的Mapper的字节码文件中Select ({select * from user where username #{username} and password #{password}}) ListUser getByUsernameAndPassword(String username, String password);若是非官方骨架创建的SpringBoot项目他的Mapper的字节码文件找不到该替换哪个占位符Select ({select * from user where username #{username} and password #{password}}) ListUser getByUsernameAndPassword(String var1, String var2);非官方骨架创建的项目加上Param注解之后通过这个注解就知道用第一个参数替换第一个占位符第二个参数替换第二个占位符Select ({select * from user where username #{username} and password #{password}}) ListUser getByUsernameAndPassword(Param(username) String var1, Param(password)String var2);5、XML映射配置创建目录时不要使用“.”来创建子目录而是用“/”来创建在Mybatis中既可以通过注解配置SQL语句也可以通过XML配置文件配置SQL语句。规则 1.XML映射文件的名称与Mapper接口名称一致并且将XML映射文件和Mapper接口放置在相同包下同包同名。2.XML映射文件的namespace属性为Mapper接口全限定名一致。3.XML映射文件中sql语句的id与Mapper接口中的方法名一致并保持返回类型一致。基于xml映射文件定义SQL语句!--生成XML映射文件的约束和基本结构-- !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.itheima.mapper.UserMapper !-- resultType: 查询返回的单条记录封装的类型, 只有在查询操作中才需要声明 -- select idfindAll resultTypecom.itheima.pojo.User select id, username, password, name, age from user where id #{id} /select /mapperMapper接口文件Mapper public interface UserMapper{ public ListUser findAll(); }那在Mybatis的开发中到底使用注解开发还是使用xML开发呢使用Mybatis的注解主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能建议使用XML来配置映射语句。官方说明入门_MyBatis中文网辅助配置若未按照上述包名创建文件路径则需要手动指出文件所在的位置在application.properties文件中#指定XML映射配置文件的位置 mybatis.mapper-locationsclasspath:mapper/*.xmlMybatisX插件一只小鸟的标志可以快速定位到配置文件和与之对应的Mapper接口6、SpringBoot项目配置文件properties文件与yaml/yml文件的对比格式数值前边必须有空格作为分隔符使用缩进表示层级关系缩进时不允许使用Tab键只能用空格idea中会自动将Tab转换为空格缩进的空格数目不重要只要相同层级的元素左侧对齐即可#表示注释从这个字符一直到行尾都会被解析器忽略定义对象/Map集合user: name: 张三 age: 18 password: 123456定义数组/List/Set集合:hobby: - java - game -sport将properties转化为yml注意 在yml格式的配置文件中如果配置项的值是以0开头的值需要使用引起来因为以0开头在yml中表示8进制的数据。
返回列表