国庆节10月1日
--


Mybatis是一款优秀的持久层框架,用于简化JDBC开发,支持注解和XML两种方式编写SQL。
MyBatis 是一款优秀的持久层框架,用于简化JDBC的开发。原本是Apache的开源项目iBatis,2010年迁移至Google Code并改名为MyBatis,2013年11月迁移到Github。
持久层:即数据访问层(DAO),负责与数据库交互。
框架:一套可重用、通用、半成品的软件基础代码模型,在框架基础上开发更高效、规范。
1<dependency>2 <groupId>org.mybatis.spring.boot</groupId>3 <artifactId>mybatis-spring-boot-starter</artifactId>4</dependency>5<dependency>6 <groupId>mysql</groupId>7 <artifactId>mysql-connector-java</artifactId>8</dependency>9<dependency>10 <groupId>org.projectlombok</groupId>11 <artifactId>lombok</artifactId>12</dependency>实体类 User(位于 com.itheima.pojo 包):
1@Data2@NoArgsConstructor3@AllArgsConstructor4public class User {5 private Integer id;6 private String username;7 private String password;8 private String name;9 private Integer age;10}application.properties:
1spring.datasource.url=jdbc:mysql://localhost:3306/web2spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver3spring.datasource.username=root4spring.datasource.password=root@12341@Mapper2public interface UserMapper {3 @Select("select * from user")4 public List<User> findAll();5}@Mapper:表示Mybatis中的Mapper接口,运行时框架自动生成代理对象并交由Spring IOC容器管理。@Select:编写select查询语句。1@SpringBootTest2class ApplicationTests {3 @Autowired4 private UserMapper userMapper;5
6 @Test7 public void testFindAll() {8 List<User> userList = userMapper.findAll();9 userList.forEach(System.out::println);10 }11}| JDBC缺点 | Mybatis解决方案 |
|---|---|
| url/username/password硬编码在代码中 | 配置在 application.properties 中 |
| 查询结果解析封装繁琐 | 自动完成映射封装 |
| 频繁获取/释放连接造成资源浪费 | 内置数据库连接池技术 |
数据库连接池是一个容器,负责分配、管理数据库连接。
工作原理:
好处:资源重用、提升响应速度、避免连接遗漏。
| 连接池 | 说明 |
|---|---|
| Hikari | SpringBoot默认,性能优越 |
| Druid | 阿里巴巴开源,功能强大 |
| C3P0 / DBCP | 老牌连接池,较少使用 |
1<dependency>2 <groupId>com.alibaba</groupId>3 <artifactId>druid-spring-boot-starter</artifactId>4 <version>1.2.19</version>5</dependency>1spring.datasource.type=com.alibaba.druid.pool.DruidDataSource2spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver3spring.datasource.druid.url=jdbc:mysql://localhost:3306/web4spring.datasource.druid.username=root5spring.datasource.druid.password=1234| 操作 | 注解 | 示例 |
|---|---|---|
| 查询 | @Select | @Select("select * from user where id = #{id}") |
| 新增 | @Insert | @Insert("insert into user(...) values(#{...})") |
| 修改 | @Update | @Update("update user set ... where id = #{id}") |
| 删除 | @Delete | @Delete("delete from user where id = #{id}") |
Mybatis提供两种占位符:
| 占位符 | 特点 | 推荐 |
|---|---|---|
#{...} | 预编译SQL(生成 ?),防SQL注入 | 强烈推荐 |
${...} | 直接字符串拼接,存在SQL注入风险 | 不推荐 |
1@Delete("delete from user where id = #{id}")2public Integer deleteById(Integer id);Integer 返回值表示DML语句影响的记录数。
1@Insert("insert into user(username,password,name,age) values(#{username},#{password},#{name},#{age})")2public void insert(User user);多个参数封装到对象中,通过 #{对象属性名} 引用。
1@Update("update user set username=#{username},password=#{password},name=#{name},age=#{age} where id=#{id}")2public void update(User user);1@Select("select * from user where username = #{username} and password = #{password}")2public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);@Param 注解为方法形参起名;基于官方骨架创建的SpringBoot项目中接口编译时会保留方法形参名,@Param 可省略(直接 #{形参名})。
注意:一个接口方法对应的SQL语句,要么使用注解,要么使用XML,不可同时配置。
namespace 为Mapper接口全限定名。id 与Mapper接口方法名一致,返回类型一致。1<?xml version="1.0" encoding="UTF-8" ?>2<!DOCTYPE mapper3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"4 "https://mybatis.org/dtd/mybatis-3-mapper.dtd">5<mapper namespace="com.itheima.mapper.UserMapper">6
7 <select id="findAll" resultType="com.itheima.pojo.User">8 select * from user9 </select>10
11</mapper>在IDEA中配置与MySQL数据库的连接,可在 @Select 注解中获得SQL语法提示和表名/列名校验。
1mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl开启后可在控制台查看执行的SQL语句及参数。
#{} 占位符,防止SQL注入。Integer 返回值接收影响行数。如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"所有的相遇都是久别重逢。"—— 未知


