嗷嗷

环境统一

  • JDK1.8
  • Mysql5.7
  • maven3.6.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->数据持久层对象)

  • MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。是Apache
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

如何获取Mybatis


什么是持久化

持久化就是将数据从持久状态到瞬时状态转化的过程

持久层

完成持久化的代码

为什么需要Mybatis

因为传统的JDBC代码很麻烦,我们就有了框架把它简化一下

  • 简单易学
  • 解除sql与程序代码的耦合
  • 提供xml标签
  • 提供映射标签
  • 使用的人多

第一个Mybatis程序

搭建环境->导入Mybatis->编写代码->测试

搭建环境

创建maven项目,删除src文件夹,导入依赖

mysql、mybatis、junit

创建子模块

创建一个模块(Model),这个 模块就自动成了mybatis的子模块就不用再配置了,爽哦!

在这里插入图片描述

配置子模块

官方文档说,MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。

也就是说,我们需要在resources文件夹下创建名为mybatis-config.xml的文件
在这里插入图片描述

然后根据官方提示(《入门》这一章节),在文件中写入如下配置文件,使用idea打开数据库,方便定位database的url。

在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?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="12345678"/>
            </dataSource>
        </environment>
    </environments>
  <!--记得最后把Mapper配置文件放进来-->
      <mappers>
        <mapper resource="com/dao/UserMapper.xml"/>
    </mappers>
</configuration>

编写工具类

官方介绍了,从 XML 中构建 SqlSessionFactory,从SqlSessionFactory中获取SqlSession,这很麻烦,我们就创建工具类,简化操作

在这里插入图片描述

package 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;

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory=null;
    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 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
     * */
    public static SqlSession getSqSession(){
        return sqlSessionFactory.openSession();
    }
}

编写代码

代码目录

在这里插入图片描述

  • 实体类–>pojo文件夹下

    command+n可以打开构造器,Getter、Setter等等

    package pojo;
    
    public class User {
        String account;
        String name;
        String pwd;
        String phone;
        String type;
    
        public User() {
        }
    
        public User(String account, String name, String pwd) {
            this.account = account;
            this.name = name;
            this.pwd = pwd;
        }
    
        public String getAccount() {
            return account;
        }
    
        public void setAccount(String account) {
            this.account = account;
        }
    
        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;
        }
    
        public String getPhone() {
            return phone;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "account='" + account + '\'' +
                    ", name='" + name + '\'' +
                    ", pwd='" + pwd + '\'' +
                    ", phone='" + phone + '\'' +
                    ", type='" + type + '\'' +
                    '}';
        }
    }
    
  • Dao接口–>dao文件夹下

    public interface UserDao {
        List<User> getUserList();
    }
    
  • 接口实现类

    我们需要建立xml配置文件,告诉SqlSession 和 Mapper 具体执行什么操作,配置文件可以写在任何地方,我就放在dao层了,但是需要在主配置文件添加build ,否则会被过滤,因为默认是放在resources目录下的

    注意,命名空间为要绑定的Dao(Mapper)接口,其中id为对应的方法名字

    <?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.dao.UserDao">
        <select id="getUserList" resultType="com.pojo.User">
            select * from test.user;
        </select>
    </mapper>
    

测试

尽量使用junit进行测试,写在绿色包里面

报错:类型接口在Mapper中心是未知的

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

报错:xml找不到,在两个pom.xml配置文件中写上配置文件地址,因为没有放在rescourses文件夹下

    <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>

测试类

package com.demo.dao;


import com.utils.MybatisUtils;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;


import java.util.List;

public class UserDaoTest {

    @Test
    public void test(){
        //获得sqSession
        SqlSession sqSession = MybatisUtils.getSqSession();
        //执行sqSession
        //方式一:getmapper
        UserDao mapper = sqSession.getMapper(UserDao.class);//获取对象
        List<com.pojo.User> userList = mapper.getUserList();//执行对象的方法

        for (com.pojo.User user : userList) {//userList.for即可得到这一部分代码
            System.out.println(user.toString());
        }
        sqSession.close();
    }
}

总结

在这里插入图片描述

数据库增删改查

namesppace

namespace中的包名要和Mapper的一至

SELECT

选择,查询语句

  • id对应namespace中的方法名,相当于重写了方法啊
  • resulttype。sql的返回值
  • parameterType参数的类型

如果返回一个对象就使用类作为返回类型,这个返回值包含所有的信息,如果是字符串或者数字就指定类型。

如果通过传入的id没找到就会返回null,传入的id不存在也会返回null

    <select id="getUserById" resultType="String" parameterType="String">
        select pwd from test.user where account=#{id}
    </select>

INSERT

创建一个新用户,在调用的时候直接new一个对象

<insert id="addUser" parameterType="com.demo.pojo.User">
    insert into test.user (account,name,pwd,phone,type ) values (#{account},#{name},#{pwd},#{phone},#{type})
</insert>

注意:增删改需要提交事务

这是java的测试代码

    @Test
    public void addUserTest(){
        //获得sqSession
        SqlSession sqSession = MybatisUtils.getSqSession();
        UserMapper mapper = sqSession.getMapper(UserMapper.class);//获取对象
        int res = mapper.addUser(new User("2011","hahaha","1111","10086","adm"));
        if(res>0){
            System.out.println("完成");
        }
        // 提交事务
        sqSession.commit();
        sqSession.close();
    }

DELETE

    <delete id="removeUserById" parameterType="String">
        delete from test.user where account=#{id}
    </delete>
    //删除用户
    @Test
    public void removeUserByIdTest(){
        //获得sqSession
        SqlSession sqSession = MybatisUtils.getSqSession();
        UserMapper mapper = sqSession.getMapper(UserMapper.class);//获取对象
        int res = mapper.removeUserById("2011");
        if(res>0){
            System.out.println("删除完成");
        }
        // 提交事务
        sqSession.commit();
        sqSession.close();
    }

修改用户

    //修改密码
    @Test
    public void changePwdTest(){
        //获得sqSession
        SqlSession sqSession = MybatisUtils.getSqSession();
        //执行sqSession
        //方式一:getmapper
        UserMapper mapper = sqSession.getMapper(UserMapper.class);//获取对象
        int res = mapper.changePwdByIdd(new User("2011","woaini"));//执行对象的方法
        if (res>0){
            System.out.println("密码已修改");
        }
        sqSession.commit();
        sqSession.close();
    }

使用万能的Map

接口

int addUser2(Map<String,String> map);

xml

    <!--    使用map的时候,添加 value需要和传入的map配套哦,我们上面取的都是类的属性-->
    <insert id="addUser2" parameterType="Map">
        insert into test.user (account,pwd) values (#{user_account},#{user_pwd});
    </insert>

测试代码

    //使用map添加
    @Test
    public void addUser2(){
        SqlSession sqSession = MybatisUtils.getSqSession();
        UserMapper mapper = sqSession.getMapper(UserMapper.class);

        HashMap<String,String> map = new HashMap<String, String>();
        map.put("user_account","1111");
        map.put("user_pwd","1111");

        mapper.addUser2(map);

        sqSession.commit();
        sqSession.close();
    }

配置解析

属性优化

我们的属性:driver、password等等都可以写在properties中,嗯,这估计也是贵才哥考察的一个重点了。

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

导入proprieties,要放在第一个位置

<configuration>
   <!--导入properties文件-->
   <properties resource="db.properties"/>

   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="${driver}"/>
               <property name="url" value="${url}"/>
               <property name="username" value="${username}"/>
               <property name="password" value="${password}"/>
           </dataSource>
       </environment>
   </environments>
   <mappers>
       <mapper resource="mapper/UserMapper.xml"/>
   </mappers>
</configuration>

别名优化

设置一个短的名字,有两种方式:

  • 直接在mybatis配置文件里写,不过要放在第三个位置,没有第二个的话就放在properties下面就好

    <typeAliases>
        <typeAlias type="com.demo.pojo.User" alias="User"/>
    </typeAliases>
    
  • 读取写好的包,在使用的时候就直接使用实体类名

    <typeAliases>
        <typeAlias package="com.demo.pojo"/>
    </typeAliases>
    

在实体类少的时候,就使用第一种,很多的话就使用第二种。

不过第一种可以DIY,如果我们也想使用第二种方法DIY的话,可以给类加一个注解,这个注解就是DIY后的名字

@Alias("hello")
public class User{
  //code
}
/*这样我们就找不到hello了,只能使用hello*/

Mapper

方式一:绑定xml文件

  • 没有限制

方式二:绑定class

  • 配置文件要和class在同一个包下
  • 配置文件要和class名字相同

方式三:绑定package

  • 需要配置文件和包同名

一个半成品

点击下载

注:第二部分随缘更新啦。。。我先把考核搞定再说嘿嘿

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐