返回顶部

Mybatis学习笔记

MyBatis概述

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

新建项目

1.新建一个普通的maven项目
2.删除src目录
3.导入maven依赖

创建一个模块

1.编写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>
    <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/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8/"/>
                <property name="username" value="root"/>
                <property name="password" value="fa6298500"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

2.编写mybatis工具类

//mybatis工具类
//sqlSessionFactory --> sqlSession
public class MybatisUtils
{
    private static SqlSessionFactory sqlSessionFactory;
    static
    {
        try
        {
            //使用mybatis获得sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    //既然有了sqlSessionFactory,就可以从中获得sqlSession实例了
    //sqlSession完全包含了面向数据库执行SQL命令所需的所有方法

    public static SqlSession getSqlSession()
    {
        return sqlSessionFactory.openSession();
    }
}

3.编写实体类

package com.pojo;

//数据库实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User
{
    private int id;
    private String name;
    private String pwd;
}

4.Dao接口

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

5.接口实现类

<?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">
<!-- namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.dao.UserDao">
    <!-- select查询语句 -->
    <select id="getUserList" resultType="com.pojo.User">
        select * from mybatislearn.user;
    </select>
</mapper>

测试

org.apache.ibatis.binding.BindingException: Type interface com.dao.UserMapper is not known to the MapperRegistry.

错误原因:每一个mapper文件都需要在Mybatis核心配置文件中注册

java.lang.ExceptionInInitializerError

错误原因:maven的约定大于配置
解决方法:
在build中配置resources,来防止资源导出失败的问题

<build>       
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
</build>

这段代码放入两个pom.xml中

CRUD

1.namespace

namespace中的包名要与Dao/mapper接口的包名一致

2.select

选择,查询语句;

  • id:对应namespace中的方法名
  • resultType:sql语句执行的返回值
  • parameterType:参数类型

1.编写接口

 //查询全部用户
    List<User> getUserList();

2.编写对应的mapper中的sql语句

    <select id="getUserList" resultType="com.pojo.User">
        select * from mybatislearn.user;
    </select>

3.测试

    @Test
    public void test()
    {
        try (SqlSession sqlSession = MybatisUtils.getSqlSession())
        {
            //第一步,获取SqlSession对象
            //第二步,执行sql
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = userMapper.getUserList();
            for (User user : userList) {
                System.out.println(user);
            }
        }
    }

3.insert

    <!--对象中的属性,可以直接取出来 -->
    <insert id = "addUser" parameterType = "com.pojo.User">
        insert into mybatislearn.user(id, name, pwd) values(#{id},#{name},#{pwd});
    </insert>

4.update

    <update id = "updateUser" parameterType = "com.pojo.User">
        update mybatislearn.user set name = #{name},pwd = #{pwd} where id = #{id};
    </update>

5.delete

    <delete id = "deleteUser" parameterType = "com.pojo.User">
        delete from mybatislearn.user where id = #{id};
    </delete>

注意点

  • 增删改需要提交事务
sqlSession.commit();

万能的map

假设我们的实体类或者数据库中的表,字段或者参数过多,我们应当考虑使用map

int addUser2(Map<String, Object> map);
    <insert id = "addUser2" parameterType = "map">
        insert into mybatislearn.user(id,pwd) values (#{userID},#{passWord});
    </insert>
    @Test
    public void getUserById2()
    {
        try(SqlSession sqlSession = MybatisUtils.getSqlSession())
        {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            Map<String, Object> map = new HashMap<>();
            map.put("mima","123456");
            userMapper.getUserById2(map);
            sqlSession.commit();

        }

    }

Map传递参数,直接在sql中取出key即可(parameterType = "map")
对象传递参数,直接在sql中取对象的属性即可(parameterType = "Object")
只有一个参数的情况下,可以直接在sql中取到!
多个参数用map或者注解

模糊查询怎么实现

1.Java代码执行的时候,传递通配符% %

List<User> userList= userMapper.getUserLike("%李%");

2.在sql拼接中使用通配符!

select * from mybatislearn.user where name like "%"#{value}"%";

2.环境配置(environments)

MyBatis可以配置成适应多种环境
不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境
默认事务管理器:JDBC 连接池:POOLED

3.属性(properties)

我们可以通过properties来实现引用配置文件
这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,
也可通过properties元素的子元素来传递【db.properties】
编写一个配置文件
db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456

在核心配置文件中映入

    <!-- 引入外部配置文件 -->
    <properties resource="db.properties">
    <property name="username" value="root"/>
    <property name="password" value="fa6298500"/>
    </properties>
  • 可以直接引入外部文件
  • 可以在其中增加一些属性配置
  • 如果两个文件有同一个字段,优先使用外部配置文件的!

类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写

    <!-- 可以给实体类起别名 -->
    <typeAliases>
        <typeAlias type = "com.pojo.User" alias="User"/>
    </typeAliases>

也可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean,比如:扫描实体类的包,它的默认别名就为这个类的类名,首字母小写。

    <!-- 可以给实体类起别名 -->
    <typeAliases>
        <package name = "com.pojo"/>
    </typeAliases>

在实体类比较少的时候,使用第一种方式
如果实体类十分多,建议使用第二种
第一种可以DIY别名,第二种不行,如果非要改,需要在实体上添加注解

分页

  • 减少数据的处理量

1.使用limit分页

语法:select * from user limit startIndex,pageSize;

使用mybatis实现分页,核心sql
1.接口

List<User> getUserByLimit(Map<String, Object> map);

2.Mapper.xml

    <select id="getUserByLimit" parameterType="map" resultType="User">
        select * from mybatislearn.user limit #{startIndex},#{pageSize};
    </select>

3.测试

    public void getUserByLimit()
    {
        try(SqlSession sqlSession = MybatisUtils.getSqlSession())
        {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            Map<String, Object> map = new HashMap<>();
            map.put("startIndex",0 );
            map.put("pageSize",2);
            List<User> userList = userMapper.getUserByLimit(map);
            for (User user : userList)
            {
                System.out.println(user);
            }
        }
    }

使用注解开发

1.注解在接口上实现

    @Select("select * from mybatislearn.user")
    List<User> getUsers();
}

2.需要在核心配置文件中绑定接口

    <!--绑定接口 -->
    <mappers>
        <mapper class="com.dao.UserMapper"/>
    </mappers>

3.测试

SpringBoot整合MyBatis

整合包
mybatis-spring-boot-starter
1.导入包
2.配置文件
3.mybatis配置
4.编写sql
5.service层调用dao层
6.controller调用service层

总结

整体来说Mybatis的学习难度不大,and用XML写sql真的香啊!不用频繁修改代码里的sql语句很方便!具体可以去参考狂神说Java的Mybatis学习视频。

posted @ 2021-03-29 01:54  SuZ1  阅读(42)  评论(1编辑  收藏  举报