hincky的主页 hincky的主页
  • 学习笔记

    • Vue笔记
    • Vuepress
    • nginx
  • 语言类

    • java
    • go
    • python
    • 设计模式
  • 框架类

    • Spring
    • Spring Security
    • Mybatis
  • 容器技术

    • docker
    • k8s
    • helm
    • prometheus
    • grafana
    • jenkins
  • 命令集合

    • linux命令
    • docker命令
    • git命令
    • vim命令
    • k8s命令
  • 数据库

    • sql
    • mysql
  • 协议

    • 网络模型
    • http/1.1
    • WebSocket
    • http/2
    • TLS/SSL
    • tcp
    • IP
    • tcpdump抓包命令
    • wireshark抓包工具
  • 通用

    • Git
  • 技术分享

    • git push/pull总是超时怎么办
    • idea debug技巧
    • postman使用
    • 问题总结
    • idea使用技巧
  • Oauth2

    • Oauth2原理
  • 项目列表

    • redis项目
    • 微服务项目
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)

Hincky

当有趣的人,做想做的事
  • 学习笔记

    • Vue笔记
    • Vuepress
    • nginx
  • 语言类

    • java
    • go
    • python
    • 设计模式
  • 框架类

    • Spring
    • Spring Security
    • Mybatis
  • 容器技术

    • docker
    • k8s
    • helm
    • prometheus
    • grafana
    • jenkins
  • 命令集合

    • linux命令
    • docker命令
    • git命令
    • vim命令
    • k8s命令
  • 数据库

    • sql
    • mysql
  • 协议

    • 网络模型
    • http/1.1
    • WebSocket
    • http/2
    • TLS/SSL
    • tcp
    • IP
    • tcpdump抓包命令
    • wireshark抓包工具
  • 通用

    • Git
  • 技术分享

    • git push/pull总是超时怎么办
    • idea debug技巧
    • postman使用
    • 问题总结
    • idea使用技巧
  • Oauth2

    • Oauth2原理
  • 项目列表

    • redis项目
    • 微服务项目
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)
  • java

  • python

  • Spring

  • SpringMVC

  • SpringSecurity

  • Mybatis

    • mybatis介绍
      • mybatis简单操作实践
      • idea创建maven工程
    • 快速入门
      • 框架
      • 快速入门
      • 3.9 高效编程
        • 3.9.1 配置代码模板
        • 3.9.2 Mybatis插件
      • 4. 参数获取
        • 4.1 一个参数
        • 4.1.1 基本参数
        • 4.1.2 POJO
        • 4.1.3 Map
        • 4.2 多个参数
        • 4.3 总结
      • 5. 核心类
        • 5.1 SqlSessionFactory
        • 5.2 SqlSession
      • 6.Mybatis实现增删改查
        • 6.1 新增
        • 6.2 删除
        • 6.3 修改
        • 6.4 根据id查询
        • 6.5 查询所有
      • 7. 配置文件详解
        • 7.1 properties
        • 7.2 settings
        • 7.3 typeAliases
        • 7.4 environments
        • 7.5 mappers
      • 8. 打印日志
      • 9.获取参数时 #{}和${}的区别
    • 动态sql
      • 1. 注解开发
        • 1.1 步骤
      • 2.动态SQL
        • 2.1 if
        • 2.2 trim
        • 2.2.1 prefixOverrides属性
        • 2.2.2 suffixOverrides属性
        • 2.2.3 prefix属性
        • 2.2.4 suffix属性
        • 2.2.5 动态添加前缀where 并且消除前缀and或者or
        • 2.2 where
        • 2.3 set
        • 2.4 foreach
        • 2.5 choose、when、otherwise
      • 3. SQL片段抽取
    • 案例实践
      • 0. 案例环境
        • 0.1 案例数据初始化sql
        • 0.2 实体类
        • 0.2.1 User.java
        • 0.2.2 Order.java
        • 0.2.3 Role.java
      • 1. ResultMap
        • 1.1 基本使用
        • 1.2 自动映射
        • 1.3 继承映射关系
      • 2. 多表查询
        • 2.1 多表关联查询
        • 2.1.1 一对一关系
        • 2.1.1.1 使用ResultMap对所有字段进行映射
        • 2.1.1.2 使用ResultMap中的association
        • 2.1.2 一对多关系
        • 2.1.2.1 使用ResultMap中的collection
        • 2.2 分步查询
        • 2.2.1实现步骤
        • ①定义查询方法
        • ②配置分步查询
        • 2.2.2 设置按需加载
      • 3.分页查询-PageHelper
        • 3.1 实现步骤
        • ①定义方法查询方法以及生成对应标签
        • ② 引入依赖
        • ③ 配置Mybatis核心配置文件使用分页插件
        • ④ 开始分页查询
        • 3.2 一对多多表查询分页问题
      • 4.Mybatis缓存
        • 4.1 一级缓存
        • 4.2 二级缓存
        • 4.2.1 开启二级缓存
        • 4.2.2 使用建议
      • 5.Mybatis原理-单独专题讲解
  • 设计模式

  • Go

  • 后端
  • Mybatis
hincky
2022-11-08
目录

快速入门

# 框架

​框架相当于是一个脚手架,内部已经写好了很多代码,我们只要其基础上进行开发就可以提高我们的开发效率。 ​ 框架阶段学习:

①先去学习如何使用框架

②然后再使用熟练的情况下去猜测内部的原理

③通过源码去验证自己的猜测。

# 快速入门

①数据准备

CREATE DATABASE IF NOT EXISTS `mybatis_db` DEFAULT CHARACTER SET utf8;
USE `mybatis_db`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert  into `user`(`id`,`username`,`age`,`address`) values (1,'UZI',19,'上海'),(2,'PDD',25,'上海');
1
2
3
4
5
6
7
8
9
10
11

②导入依赖

<!--mybatis依赖-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.4</version>
</dependency>
<!--mysql驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12

③编写核心配置

在资源目录下创建:mybatis-config.xml 内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/sangeng/dao/UserDao.xml"/>
    </mappers>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

④定义接口及对应的xml映射文件

com.sangeng.dao.UserDao:

public interface UserDao {
    List<User> findAll();
}

1
2
3
4

资源目录下:com/sangeng/dao/UserDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sangeng.dao.UserDao">

    <select id="findAll" resultType="com.sangeng.pojo.User">
      select * from user
    </select>
</mapper>
1
2
3
4
5
6
7
8
9
10

⑤编写测试类

获取SqlSession,通过SqlSession获取UserDao调用对应的方法

public static void main(String[] args) throws IOException {
    //定义mybatis配置文件的路径
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //获取Sqlsession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //获取UserDao实现类对象
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    //调用方法测试
    List<User> userList = userDao.findAll();
    System.out.println(userList);
    //释放资源
    sqlSession.close();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 3.9 高效编程

# 3.9.1 配置代码模板

image-20210218211942452

# 3.9.2 Mybatis插件

下载安装Free Mybatis plugin,安装完后重启IDEA

# 4. 参数获取

# 4.1 一个参数

# 4.1.1 基本参数

​ 我们可以使用#{}直接来取值,写任意名字都可以获取到参数。但是一般用方法的参数名来取。

例如:

接口中方法定义如下

User findById(Integer id);
1

xml中内容如下:

<select id="findById" resultType="com.sangeng.pojo.User">  select * from user where id = #{id}</select>
1

# 4.1.2 POJO

​ 我们可以使用POJO中的属性名来获取对应的值。

例如:

接口中方法定义如下

User findByUser(User user);
1

xml中内容如下:

<select id="findByUser" resultType="com.sangeng.pojo.User">
    select * from user where id = #{id} and username = #{username} and age = #{age} and address = #{address}
</select>
1
2
3

# 4.1.3 Map

​ 我们可以使用map中的key来获取对应的值。

例如:

接口中方法定义如下

User findByMap(Map map);
1

xml中内容如下:

<select id="findByMap" resultType="com.sangeng.pojo.User">
    select * from user where id = #{id} and username = #{username} and age = #{age} and address = #{address}
</select>
1
2
3

方法调用:

Map map = new HashMap();
map.put("id",2);
map.put("username","PDD");
map.put("age",25);
map.put("address","上海");
userDao.findByMap(map);
1
2
3
4
5
6

# 4.2 多个参数

​Mybatis会把多个参数放入一个Map集合中,默认的key是argx和paramx这种格式。

例如:

接口中方法定义如下

User findByCondition(Integer id,String username);
1

最终map中的键值对如下:

{arg1=PDD, arg0=2, param1=2, param2=PDD}
1

​ 我们虽然可以使用对应的默认key来获取值,但是这种方式可读性不好。我们一般在方法参数前使用@Param来设置参数名。

例如:

接口中方法定义

User findByCondition(@Param("id") Integer id,@Param("username") String username);
1

最终map中的键值对如下:

{id=2, param1=2, username=PDD, param2=PDD}
1

所以我们就可以使用如下方式来获取参数

<select id="findByCondition" resultType="com.sangeng.pojo.User">
        select * from user where id = #{id} and username = #{username}
</select>
1
2
3

# 4.3 总结

​ 建议如果只有一个参数的时候不用做什么特殊处理。如果是有多个参数的情况下一定要加上@Param来设置参数名。

# 5. 核心类

# 5.1 SqlSessionFactory

​ SqlSessionFactory是一个SqlSession的工厂类。主要用来获取SqlSession对象。、

成员方法如下:

SqlSession openSession();
//获取SqlSession对象,传入的参数代表创建的SqlSession是否自动提交
SqlSession openSession(boolean autoCommit);
1
2
3

# 5.2 SqlSession

​ SqlSession 提供了在数据库执行 SQL 命令所需的所有方法 。它还提供了事务的相关操作。

成员方法如下:

T getMapper(Class<T> type);//获取mapper对象
void commit();//提交事务
void rollback();//回滚事务
void close();//释放资源
1
2
3
4

# 6.Mybatis实现增删改查

# 6.1 新增

①接口中增加相关方法

void insertUser(User user);
1

②映射文件UserDao.xml增加响应的标签

<insert id="insertUser">
    insert into user values(null,#{username},#{age},#{address})
</insert>
1
2
3

注意:要记得提交事务。

# 6.2 删除

①接口中增加相关方法

void deleteById(Integer id);
1

②映射文件UserDao.xml增加响应的标签

<delete id="deleteById">
    delete from user where id = #{id}
</delete>
1
2
3

注意:要记得提交事务。

# 6.3 修改

①接口中增加相关方法

void updateUser(User user);
1

②映射文件UserDao.xml增加响应的标签

    <!--更新用户-->
    <update id="updateUser">
        UPDATE USER SET age = #{age} , username = #{username},address = #{address} WHERE id = #{id}
    </update>
1
2
3
4

注意:要记得提交事务。

# 6.4 根据id查询

①接口中增加相关方法

User findById(Integer id);
1

②映射文件UserDao.xml增加响应的标签

   <select id="findById" resultType="com.sangeng.pojo.User">
      select * from user where id = #{id}
    </select>
1
2
3

# 6.5 查询所有

①接口中增加相关方法

List<User> findAll();
1

②映射文件UserDao.xml增加响应的标签

<select id="findAll" resultType="com.sangeng.pojo.User">
    select * from user
</select>
1
2
3

# 7. 配置文件详解

# 7.1 properties

​ 可以使用properties读取properties配置文件。使用其中的resource属性来设置配置文件的路径。

​ 然后使用${key}来获取配置文件中的值

例如:

在resources目录下有jdbc.properties文件,内容如下:

jdbc.url=jdbc:mysql://localhost:3306/mybatis_db
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root
1
2
3
4

在mybatis-config.xml中:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--设置配置文件所在的路径-->
    <properties resource="jdbc.properties"></properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--获取配置文件中配置的对应的值来设置连接相关参数-->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 7.2 settings

​ 可以使用该标签来设置进行一些设置

例如:

<settings>
    <!--开启自动驼峰命名映射-->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
1
2
3
4

具体的设置参考:https://mybatis.org/mybatis-3/zh/configuration.html#settings

# 7.3 typeAliases

​ 可以用来设置给全类名设置别名,简化书写。一般设置一个包下的类全部具有默认别名。默认别名是类目首字母小写。例如:com.sangeng.pojo.User别名为user

<typeAliases>
    <package name="com.sangeng.dao"></package>
</typeAliases>
1
2
3

# 7.4 environments

​ 配置数据库相关的环境,例如事物管理器,连接池相关参数等。

<!--设置默认环境-->
<environments default="development">
    
    <!--设置该环境的唯一标识-->
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <!--获取配置文件中配置的对应的值来设置连接相关参数-->
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 7.5 mappers

​ 该标签的作用是加载映射的,加载方式有如下几种(主要使用第四种):

​ ①使用相对于类路径的资源引用,例如:

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
1
2
3
4
5
6

​ ②使用完全限定资源定位符(URL),例如:

<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
1
2
3
4
5
6

​ ③使用映射器接口实现类的完全限定类名,例如:

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
1
2
3
4
5
6

​ ④将包内的映射器接口实现全部注册为映射器,例如:

<!-- 定义dao接口所在的包。要求xml文件存放的路径和dao接口的包名要对应 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>
1
2
3
4

​

# 8. 打印日志

①log4j配置 在resources目录下创建log4j.properties文件,内容如下:

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

②引入依赖

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
1
2
3
4
5

# 9.获取参数时 #{}和${}的区别

​ 如果使用#{}.他是预编译的sql可以防止SQL注入攻击 ​ 如果使用${}他是直接把参数值拿来进行拼接,这样会有SQL注入的危险

如果使用的是#{}来获取参数值日志如下: Preparing: select * from user where id = ? and username = ? and age = ? and address = ? Parameters: 2(Integer), 快乐风男(String), 29(Integer), 北京(String)

如果使用${}来获取参数值日志如下: Preparing: select * from user where id = 2 and username = 快乐风男 and age = 29 and address = 北京

编辑 (opens new window)
#Mybatis
mybatis介绍
动态sql

← mybatis介绍 动态sql→

最近更新
01
人生前期重要的能力
05-17
02
防火墙命令
04-11
03
docker-compose部署mysql主从集群
03-22
更多文章>
Theme by Vdoing | Copyright © 2022-2023 Hincky | MIT License | 粤ICP备2022120427号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式