mybatis学习第一天【跟着狂神说学习】

mybatis 9.28

一、环境配置
1、JDK 1.8

2、Mysql 5.7

3、maven 3.6.3

4、IDEA

二、回顾知识点:

1、JDBC

2、mysql

3、java基础

4、maven

5、junit

三、框架

配置文件,最好的方式,看官网文档

1、什么是mybatis

  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

2、如何获得mybatis

2.1、maven仓库

2.2、github:https://github.com/mybatis/mybatis-3/releases

2.3、中文文档地址:https://mybatis.org/mybatis-3/zh/index.html

 3、持久化

3.1数据持久化

  1. 持久化就是将程序r数据在持久状态和瞬时状态转化的过程
  2. 内存:断电即失
  3. 数据库(jdbc),IO文件持久化
  4. 生活中:冷藏食物

3.2  为什么要持久化?

  1. 有一些对象,不能让他丢掉
  2. 内存太贵了

3.3 持久层

  1. Dao 层、Service层、Controller层
  2. 完成对持久化工作的代码块
  3. 层界限十分明显

3.4 为什么需要mybatis

  1. 帮助程序员将数据存入到数据库中
  2. 方便
  3. 传统的JDBC代码太复杂了,简化代码,自动化
  4. 不用mybatis也可以的,更容易上手,技术没有高低之分
  5. 优点:简单易学\灵活、解除sql与程序代码的耦合、提供映射标签、提供xml标签,支持编写动态sql,最重要是使用的人多

3.5 第一个mybatis程序

1、创建一个数据库,并创建一个表,和写入几笔测试数据

CREATE DATABASE `mybatis`;
use `mybatis`;

create table `user`(
    `id` int(20) not null AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) DEFAULT null ,
    `pwd` varchar(255) DEFAULT null 
)ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

insert into `user`(name,pwd) VALUES
('张三','123456'),
('李四','123456'),
('王五','123456'),
('马六','123456');

2、创建一个普通的maven项目

3、删除src目录

4、导入maven依赖

 <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
    </dependencies>

5、创建一个模块

编写mybatis的核心配置文件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.cj.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="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/fengfang/dao/IUserDao.xml"></mapper>   #这部分一会再说明
    </mappers>
</configuration>

编写mybatis的工具类MybatisUtils.class

package com.fengfang.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.InputStream;

/**
 * TODO
 *
 * @author liuxh
 * @date 2020/7/29 16:45
 **/
//SqlSessionFactoy
public class MybatisUtils {
    private static  SqlSessionFactory factory;
    static {
        try{
            //使用mybatis第一步获取SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream stream = Resources.getResourceAsStream(resource);
            factory = new SqlSessionFactoryBuilder().build(stream);

        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 获取 一个SqlSession对象
     * @return
     */
    public static  SqlSession getSqlSession(){
        return factory.openSession();
    }
}

编写实体类

package com.fengfang.domain;

import java.io.Serializable;

/**
 * TODO
 *
 * @author liuxh
 * @date 2020/7/29 16:55
 **/
public class User implements Serializable {
    private Integer id;
    private String name;
    private String pwd;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

编写dao层操作类

package com.fengfang.dao;

import com.fengfang.domain.User;

import java.util.List;

/**
 * TODO
 *
 * @author liuxh
 * @date 2020/7/29 16:57
 **/
public interface IUserDao {
    /**
     * 查询所有用户数据
     * @return
     */
    List<User> findAll();
}

编写与dao层相对应的配置文件,IUserDao.xml,这个文件是放在src/resources/com/fengfang/dao/IUserDao.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.fengfang.dao.IUserDao">
    <select id="findAll" resultType="com.fengfang.domain.User">
    select * from user
  </select>
</mapper>

将这个配置文件加入到mybatis-config.xml配置文件中,即下面这一段

 <mappers>
        <mapper resource="com/fengfang/dao/IUserDao.xml"></mapper>
    </mappers>

编写测试代码来测试

package com.fengfang.test;

import com.fengfang.dao.IUserDao;
import com.fengfang.domain.User;
import com.fengfang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * TODO
 *
 * @author liuxh
 * @date 2020/7/29 17:07
 **/
public class MybatisTest1 {
    @Test
    public void testFindAll(){
        SqlSession session =  MybatisUtils.getSqlSession();
        IUserDao dao = (IUserDao) session.getMapper(IUserDao.class);
        List<User> userList = dao.findAll();
        for(User user :userList){
            System.out.println(user);
        }
        session.close();
    }
}

运行测试类是可以成功的,如下图

 

 可能的问题:

1、若这个文件,不是放在resources文件夹下,那需在pom.xml中添加以下代码

 <!--    在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

2、绑定接口错误

3、方法名错误

4、返回类型错误,即resultType 没有设置

5、配置文件没有注册,即没有在mybatis-config.xml中配置mapper

3.6、CRUD

1、namespace 

namespace 中的包名要和Dao/IUserDao接口的包名一致

2、select 

选择:查询语句

id:就是对应namespace中的方法名

resultType:Sql语句的返回值类型,class

parameteType:参数类型 

编写接口

在mapper.xml编写SQL ,注意Id要和方法名相同,命名空间要和dao中类命名空间相同

测试接口,对于insert\update\delete需提交事务

在mybatis的mapper.xml文档中,遇到一个坑:在里面有中文注释会出错,这个后续要多注意,即以下这样,程序会报错,原因是这个配置文件不是utf-8格式的,需将这个配置文件更改为urf-8格式,然后在idea的setting->editor->file encoding中全部设置为utf-8,如下图2

 

 

3、insert 

在实体类中,若表字段过多,而很多字段又可以为空,我们可以考虑使用Map,参照项目IUserDao类中的addUserMap方法

void addUserMap(Map<String,Object> map);

在mapper.xml的方法定义为这样:

<!--对象中的属性,可以直接取出来
    传递Map的key
    假设实体类
-->
    <insert id="addUserMap" parameterType="map">
        insert into user(name,pwd)values(#{userName},#{userPwd})
    </insert>

 

4、update

5、delete

6、模糊查询

 List<User> getUserLike(String value);
<!--    对于通配符,需在SQL文件中写在里面不建议当参数传入进来-->
    <select id="getUserLike" resultType="com.fengfang.domain.User" >
        select * from user where  name like "%"#{value}"%"
    </select>
 @Test
    public void testGetUserLike(){
        SqlSession session = MybatisUtils.getSqlSession();
        IUserDao userDao = session.getMapper(IUserDao.class);

        List<User> users = userDao.getUserLike("测试");
        for (User user : users) {
            System.out.println(user);
        }
        session.close();
    }

 

posted @ 2020-08-07 16:51  aaron616  阅读(156)  评论(0)    收藏  举报