1、初认识MyBatis【笔记】

如何获取mybatis?

maven仓库【这是使用maven的方式】

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

这是github上面的仓库地址:

github:https://github.com/mybatis/mybatis-3/releases?after=mybatis-3.4.4

maven仓库的地址

https://mvnrepository.com/artifact/org.mybatis/mybatis


什么叫持久层,就是就是把数据保存到数据库的那一层

  1. 数据持久化

  2. 持久化就是程序数据在持久状态和瞬间状态转化的过程

  3. 内存:断电即失

  4. 数据库,io文件持久化

为什么要持久化?

  • 有一些对象,不能让它丢掉
  • 内存太贵了,存在内存里面浪费

持久层?

  • 就是完成持久化工作的代码块

  • 层界限非常明显

为什么需要mybaits?

  1. 帮助程序员把数据存进数据库
  2. 方便
  3. 传统的jdbc太复杂了,简化。框架。自动化
  4. 学了mybatis也可以。更容易上手,技术没有高低之分

优点:

  1. 使用的人多
  2. 简单易学
  3. sql和代码分离
  4. 提供xml标签
  5. 还需要学习spring,sprigmvc,springboot

第一个mybatis程序

思路:搭建环境 --》导入mybatis–》编写代码–》测试

2.1 搭建环境
  • 搭建数据库
2.2 新建一个项目
  1. 新建一个maven项目
  2. 删除src目录
  3. 导入maven依赖
创建一个模块
  1. 编写mybatis的核心配置文件(连接数据库的配置文件)
<?xml version="1.0" encoding="UTF8" ?>
<!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="abcde"/>
            </dataSource>
        </environment>
    </environments>

    <!--注册 定义sql映射语句-->
    <!--    <mappers>-->
    <!--        <mapper resource="com/quan/dao/UserMapper.xml"/>-->
    <!--    </mappers>-->
     <!--这是包扫描的方式去找mapper    -->
    <mappers>
        <package name="com.quan.dao"/>
    </mappers>
    
</configuration>

2,编写mybatis工具类(建立一个工厂,然后工厂生成SqlSession 实例来直接执行已映射的 SQL 语句)

这是一个工具类,就是建立工厂,然后getsqlsession得到实例,也就是得到一个顾客,顾客可以实现sql语句。

package com.quan.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;


//第三步就是配置工具类,获取能解析sql语句的sqlSession对象,然后这个对象是存放在sqlSessionFactory工厂里面的
//sqlSessionFactory--->>sqlSession
public class mybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    //静态代码块,也就是不能修改的,存进房子里面的
    static {
        try {
            //第一步
            //    获取sqlSessionFactory对象 使用mybatis第一步
            //获取连接数据库的配置文件
            String resource = "mybatis-config.xml";
            //把数据库配置信息放进输入流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //然后工厂建造者Builder根据输入流的数据库信息建立一个数据库工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    //    从 SqlSessionFactory 中获取 SqlSession   也就是工人
    //    既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
    //    SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:

    public static SqlSession getSqlSession() {
        //有了数据库工厂,就要找工人,sqlSession就是工人
        return sqlSessionFactory.openSession();

    }

}

3、编写代码

  • 实体类

  • dao接口 / mapper接口 (我们要实现的接口方法,会存放在这个mapper里面)

package com.quan.dao;

import com.quan.pojo.User;

import java.util.List;
import java.util.Map;

public interface UserMapper {
    //查询所有用户
    List<User> getUserList();

    //根据id查询用户
    User getUserById(int id);

    //添加一个用户
    int addUser(User user);

    //修改用户
    int updateUser(User user);

    //根据id刪除用戶
    int deleteUser(int id);

    //使用万能的map插入一个用户
    int addUser2(Map<String, Object> map);

    //模糊查询
    List<User> getUserLike(String s);
}

接口实现类

由原来的UserDaoImpl转变为一个Mapper配置文件。

这个配置文件就是实现接口的方法,由类变成了xml文件

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 命名空间 绑定对应的Dao/Mapper接口 -->
<mapper namespace="com.quan.dao.UserMapper">

    <!--    插入-->
    <insert id="addUser" parameterType="com.quan.pojo.User">
        insert into mybatis.user(id, name, pwd)
        values (#{id}, #{name}, #{pwd});

    </insert>

    <!--    使用万能的map方法进行插入数据-->
    <insert id="addUser2" parameterType="map">
        insert into mybatis.user(id, name, pwd)
        values (#{id}, #{name}, #{pwd});

    </insert>
    <!-- 更新-->
    <update id="updateUser" parameterType="com.quan.pojo.User">
        update mybatis.user
        set name=#{name},
            pwd=#{pwd}
        where id = #{id};

    </update>

    <!--删除-->
    <delete id="deleteUser" parameterType="int">
        delete
        from mybatis.user
        where id = #{id}

    </delete>

    <!-- 查询所有-->
    <select id="getUserList" resultType="com.quan.pojo.User">
        select *
        from mybatis.user
    </select>

    <!--根据id查询-->
    <select id="getUserById" resultType="com.quan.pojo.User">
        select *
        from mybatis.user
        where id = #{id}
    </select>

    <!--    模糊查詢-->
    <select id="getUserLike" resultType="com.quan.pojo.User">
        select *
        from mybatis.user
        where name like #{value}
    </select>

</mapper>	

4、测试

(测试先得到getsqlsession,也就是在工厂里面得到一个实例,通过这个实例去得到我们的mapper,去实现已经映射的sql语句,用完这个实例后,要进行关闭)

package com.quan.dao;

import com.quan.pojo.User;
import com.quan.utils.mybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;

public class UserDaoTest {
    @Test
    public void test() {
        //1获得sqlSession对象 得到一个工人
        SqlSession sqlsession = mybatisUtils.getSqlSession();

//        方式1:执行sql
        UserMapper mapper = sqlsession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();

        for (User user : userList) {
            System.out.println(user);

        }
//        关闭sqlSession
        sqlsession.close();
    }

    //根据id获取信息
    @Test
    public void test1() {
        //1获得sqlSession对象
        SqlSession sqlsession = mybatisUtils.getSqlSession();
//        方式1:执行sql
        UserMapper mapper = sqlsession.getMapper(UserMapper.class);
        User userById = mapper.getUserById(1);
        System.out.println(userById);
//        关闭sqlSession
        sqlsession.close();
    }

    @Test
    //插入数据
    public void testAdd() {
        SqlSession sqlSession = mybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int addUser = mapper.addUser(new User(10, "tom", "124"));
        System.out.println("改变" + addUser);

        //提交事务  (这很重要,不能遗漏)
        sqlSession.commit();

        sqlSession.close();
    }

    @Test
    //更新数据
    public void updateUser() {
        SqlSession sqlSession = mybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int updateUser = mapper.updateUser(new User(3, "靓仔", "14541561156"));

        System.out.println("修改" + updateUser + "条数据");
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    //刪除用戶
    public void deleteUser() {
        SqlSession sqlSession = mybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int deleteUser = mapper.deleteUser(1);
        System.out.println("deleteUser" + deleteUser + "个");
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    //使用万能map方法进行插入数据
    public void addUser2() {
        SqlSession sqlSession = mybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        HashMap<String, Object> map = new HashMap<>();
        map.put("id", 6);
        map.put("name", "hello");
        map.put("pwd", "24321");
        mapper.addUser2(map);

        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    //模糊查詢
    public void getUserLike() {

        SqlSession sqlSession = mybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);	
        List<User> userLike = mapper.getUserLike("%l%");
        for (User user : userLike) {
            System.out.println(user);

        }

        sqlSession.commit();
        sqlSession.close();
    }
}

可能会遇到的问题:

  1. 配置文件没有注册
  2. 绑定接口错误
  3. 方法名不对
  4. 返回类型不对
  5. maven导出资源问题【就要静态资源】

报错大部分是这两个错误:

1、xml文件放在src路径下,无法识别。pom.xml添加:

<!--静态资源导出问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

或者映射路径,在核心配置文件xml中添加指向xml所在位置,注意斜杠不要写成点. 搞半天才发现的!!

//注册 在mybatis里面注册
<mappers>
        <mapper resource="com/meng/dao/UserMapper.xml"/>
    </mappers>

我就是报这个错误,这个是数据库不支持安全链接,mysql8.0要设置为ture,我是mysql5.17设置为false

img

环境搭建顺序:

img

写完这个程序后,其他文件基本不用改了,只需要修改usermapper类,usermapper.xml文件和测试类。

例如:增删改操作,需要修改的只有mapper文件和mapper.xml文件

分析错误
标签不要匹配错
<mapper resource="com/quan/dao/UserMapper.xml"/>绑定mapper需要使用路径   后期可以使用包扫描的方式注册
配置文件必须符合规范
空指针异常
输出的xml文件中存在乱码问题
资源导出问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值