IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Mybatis入门笔记 -> 正文阅读

[Java知识库]Mybatis入门笔记

Mybatis

什么是Mybaits

Mybatis是一款持久层框架
Mybatis避免了几乎所有的JDBC代码和手动设置参数及获取结果集的过程
Mybatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的实体类映射成数据库中的记录

持久化

将程序数据在持久状态和瞬时状态间转换的机制
把数据保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件、xml数据文件中。

持久层

完成持久化工作的代码块(dao层 数据访问对象),用来操作数据库

Mybatis第一个程序:

思路流程:搭建环境>导入Mybatis>编写代码>测试

1.搭建数据库

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `pwd` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

insert  into `user`(`id`,`name`,`pwd`) values (1,'QQQ','123456'),(2,'WWW','abcdef'),(3,'EEE','987654');

2.导入Mybatis依赖

<groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.2</version>
</dependency>
<!--数据库驱动-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.24</version>
</dependency>

3.编写mybatis核心配置文件

<?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>
    <typeAliases>
        <package name="com.wwz.pojo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
<!--映射器-->
    <mappers>
        <mapper resource="com/wwz/dao/UserMapper.xml"/>
    </mappers>
</configuration>

4.User实体类、定义接口(CRUD),编写配置文件

public class User {
    private Integer id;
    private String name;
    private String pwd;
}
//定义接口
public interface UserMapper {
   List<User> selectUser();

  User selectUserById(int id);

  User selectUserNP(@Param("username") String username,@Param("pwd") String pwd);

  int addUser(User user);

  int deleteUserById(int id);

  int upDateUser(User user);
}

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">
<!--命名空间 绑定dao接口-->
<mapper namespace="com.wwz.dao.UserMapper">

    <select id="selectUser" resultType="User">
    select * from mybatis.user
    </select>

    <select id="selectUserById" resultType="User">
    select * from mybatis.user where id =#{id}
    </select>

    <select id="selectUserNP" resultType="User">
    select * from mybatis.user where name=#{username} and pwd=#{pwd}
    </select>

    <insert id="addUser" parameterType="User">
        insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>

    <delete id="deleteUserById" parameterType="int">
        delete from user where id=#{id}
    </delete>

    <update id="upDateUser" parameterType="User">
        update user set name=#{name},pwd=#{pwd} where id=#{id}
    </update>
</mapper>

5.编写Mybatis的工具类

public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
                 //获取配置文件
            InputStream inputStream = Resources.getResourceAsStream(resource);
        //使用SqlSessionFactoryBuilder创建sqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //获取SqlSession连接
    public static SqlSession getSession(){
     //自动提交事务 默认是false
        return sqlSessionFactory.openSession(true);
    }
}

6.测试

public class MyTest {
    @Test
    public void test01(){
        SqlSession session = MybatisUtils.getSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> users = mapper.selectUser();
        for (User user : users) {
            System.out.println(user);
        }
        session.close();
    }

    @Test
    public void test02(){
        SqlSession session = MybatisUtils.getSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        User user = mapper.selectUserById(1);
        System.out.println(user);
        session.close();
    }

    @Test
    public void testSelectUserNP(){
        SqlSession session = MybatisUtils.getSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        User user = mapper.selectUserNP("WANG","987");
        System.out.println(user);
        session.close();
    }

    @Test
    public void test03(){
        SqlSession session = MybatisUtils.getSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        int i = mapper.addUser(new User(4, "zzz", "123123"));
        if (i>0){
            System.out.println("success");
        }else {
            System.out.println("no");
        }
        session.close();
    }

    @Test
    public void test04(){
        SqlSession session = MybatisUtils.getSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        int i = mapper.deleteUserById(4);
        if (i>0){
            System.out.println("success");
        }else {
            System.out.println("no");
        }
        session.close();
    }

    @Test
    public void test05(){
        SqlSession session = MybatisUtils.getSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        int i = mapper.upDateUser(new User(1, "WANG", "987"));
        if (i>0){
            System.out.println("success");
        }else {
            System.out.println("no");
        }
        session.close();
    }
}

ResutlMap、ResutlType区别

resultType
resultType可以把查询结果封装到pojo类型中,但必须pojo类的属性名和查询到的数据库表的字段名一致。

如果sql查询到的字段与pojo的属性名不一致,则需要使用resultMap将字段名和属性名对应起来,进行手动配置封装,将结果映射到pojo中

resultMap
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

Demo

//pojo实体类
public class Admin {
    private Integer id;
    private String username;
    private String password;
}

编写mybatis核心配置文件

<?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>
    <typeAliases>
        <package name="com.wwz.pojo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
<!--映射器-->
    <mappers>
        <mapper resource="com/wwz/dao/AdminMapper.xml"/>
    </mappers>
</configuration>

dao接口

public interface AdminMapper {
    Admin selectAdminById(int id);
}

AdminMapper.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.wwz.dao.AdminMapper">
    <!--resultMap 结果集映射, column对应数据库字段,property对应实体类-->
    <resultMap id="AdminMap" type="Admin">
        <id column="id" property="id"/>
        <id column="name" property="username"/>
        <id column="pwd" property="password"/>
    </resultMap>

    <select id="selectAdminById" parameterType="int" resultMap="AdminMap">
        select * from mybatis.admin where id=#{id}
    </select>
</mapper>

测试

@Test
public void test(){
    SqlSession session = MybatisUtils.getSession();
    AdminMapper mapper = session.getMapper(AdminMapper.class);
    Admin admin = mapper.selectAdminById(1);
    System.out.println(admin);
    session.close();
}

动态SQL

动态SQL
根据不同的查询条件,生成不同 SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签组成灵活的SQL语句

sql 、if语句:如果title不为空,根据title查询,若为空,则根据author查询

<!--提取sql片段-->
<sql id="if-title-author">
    <if test="title != null">
        title = #{title}
    </if>
    <if test="author != null">
        and author = #{author}
    </if>
</sql>
<select id="queryBlogIF" parameterType="map" resultType="blog">
    select * from blog
    <where>
        <!-- 引用 sql 片段,如果refid 指定的不在本文件中,那么需要在前面加上 namespace -->
       <include refid="if-title-author"/>
    </where>
</select>

set语句

<update id="updateBlog" parameterType="map">
    update blog
    <set>
        <if test="title != null">
            title = #{title}, /*这里需要用,隔开*/
        </if>
        <if test="author != null">
            author = #{author},
        </if>
    </set>
    where id=#{id}
</update>

choose语句

<select id="queryBlogChoose" parameterType="map" resultType="blog">
    select * from blog
    <where>
        <!-- choose 和 when , otherwise 是配套标签
            类似于java中的switch,只会选中满足条件的一个-->
        <choose>
            <when test="title != null">
                title = #{title}
            </when>
            <when test="author != null">
                and author = #{author}
            </when>
            <otherwise>
                and views = #{views}
            </otherwise>
        </choose>
    </where>
</select>

foreach语句

  • collection:指定输入对象中的集合属性

    item:每次遍历生成的对象

    open:开始遍历时的拼接字符串

    close:结束时拼接的字符串

    separator:遍历对象之间需要拼接的字符串

<select id="queryBlogForeach" parameterType="map" resultType="blog">
    select * from blog
    <where>
        <foreach collection="ids" item="id" open="(" separator="or" close=")">
            id=#{id}
        </foreach>
    </where>
        <!--
     类似 select * from blog where 1=1 and (id=1 or id=2 or id=3)
         -->
</select>

mybatis缓存

一级缓存

默认开启,同一个SqlSesion级别共享的缓存,在一个SqlSession的生命周期内,执行2次相同的SQL查询,则第二次SQL查询会直接取缓存的数据,而不走数据库,当然,若第一次和第二次相同的SQL查询之间,执行了DML(INSERT/UPDATE/DELETE),则一级缓存会被清空,第二次查询相同SQL仍然会走数据库

一级缓存在下面情况会被清除:

1.在同一个SqlSession下执行增删改操作时(不必提交),会清除一级缓存

2.SqlSession提交或关闭时(关闭时会自动提交),会清除一级缓存

3.对mapper.xml中的某个CRUD标签,设置属性flushCache=true,这样会导致该MappedStatement的一级缓存,二级缓存都失效(一个CRUD标签在mybatis中会被封装成一个MappedStatement)

4.在全局配置文件中设置 ,这样会使一级缓存失效,二级缓存不受影响

二级缓存

默认关闭,可通过全局配置文件中的<settings name="cacheEnabled" value="true"/>开启二级缓存总开关,然后在某个具体的mapper.xml中增加<cache />,即开启了该mapper.xml的二级缓存。二级缓存是mapper级别的缓存,粒度比一级缓存大,多个SqlSession可以共享同一个mapper的二级缓存。注意开启二级缓存后,SqlSession需要提交,查询的数据才会被刷新到二级缓存当中
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:24:25  更:2021-10-25 12:26:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:19:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码