Mybatis入门

Posted 师兄白泽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis入门相关的知识,希望对你有一定的参考价值。

1.简介

1-1什么是mybatis

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

  • github仓库下载
  • maven
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
  • mybatis中文文档

1-2.持久层简介

数据持久化
持久化:就是将程序的数据在持久状态和瞬时状态时转换的过程
内存:断电即失—内存转换到硬盘就是持久化
数据库(JDBC)IO文件持久化(由于IO浪费资源,所以诞生了数据库)
为什么需要持久化
持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。
● 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;
● 代码重用性高,能够完成大部分数据库操作;
● 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。
持久层
Dao层,Service层,Controller层

  • 完成持久化的代码块
  • 层界限十分明显
    [quote]狭义的理解: “持久化”仅仅指把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库相关的各种操作(持久化就是将有用的数据以某种技术保存起来,将来可以再次取出来应用,数据库技术,将内存数据一文件的形式保存在永久介质中(磁盘等)都是持久化的例子.)。
    ● 保存:把域对象永久保存到数据库。
    ● 更新:更新数据库中域对象的状态。
    ● 删除:从数据库中删除一个域对象。
    ● 加载:根据特定的OID,把一个域对象从数据库加载到内存。
    ● 查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。

1-3.为什么需要mybatis

mybatis做好了自动封装数据对象这件事
实际上在mybatis的应用场景里面,开发者要的就是自动封装,把sql查询结果转化为指定的java对象,这就足够了。

  • 简单方便
  • 减少冗余,解耦合
  • 自动化
  • 容易上手
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql。
  • 使用的人(公司)多
    技术没有高低之分,关键还在个人。

2.第一个mybatis程序

思路:搭建环境–>导入mybatis–>编写代码–>运行

2-1.搭建环境

搭建数据库
用sql语句或者可视化工具创建数据库,在这里建议用sql语句

CREATE DATABASE ConfessionWall;
USE ConfessionWall;
-- 用户表
CREATE TABLE IF NOT EXISTS userTbl(
userId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
userName VARCHAR(200) NOT NULL,
userAvatarId VARCHAR(500) NOT NULL,
userNickName VARCHAR(200),
userPassword VARCHAR(200) NOT NULL,
userQuestion VARCHAR(200),
userAge INT,
userSex VARCHAR(20),
userMajor VARCHAR(100),
userClass VARCHAR(100)
);

新建普通maven项目
新建maven项目删除结构,新建子项目;
在父项目的pom.xml中导入依赖

    <!--父工程-->
    <!--导入依赖-->
    <dependencies>
        <!--mysql驱动-->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
        <!--mybatis-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!--junit-->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

2-2.创建一个模块

  • 编写mybatis核心配置文件

在resources下新建文件mybatis-config.xml
注意在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核心配置文件-->
<configuration>
    <!--环境(可以配置多个环境)-->
    <environments default="development">
        <environment id="development">
            <!--事务管理-->
            <transactionManager type="JDBC"/>
            <!--数据源-->
            <dataSource type="POOLED">
                <!--driver-->
                <property name="driver" value="${driver}"/>
                <!--url-->
                <property name="url" value="${url}"/>
                <!--数据库名-->
                <property name="username" value="${username}"/>
                <!--数据库密码-->
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--配置映射mapper.xml-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>
  • 编写mybatis工具类

com.baize.utils.MybatisUtil.java

/**
 * SqlSessionFactory--sqlSession
 */
public class MybatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    /*
    static方法会在类中自动运行
     */
    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 getSqlSession(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}

2-3.编写代码

  • 实体类
/**
 * 实体类
 */
public class User {
    private int id;
    private String name;
    private String sex;
    private String tell;
    private String addr;
    private int money;

    public User(int id, String name, String sex, String tell, String addr, int money) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.tell = tell;
        this.addr = addr;
        this.money = money;
    }

    public User() {}

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getTell() {
        return tell;
    }

    public void setTell(String tell) {
        this.tell = tell;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\\'' +
                ", sex='" + sex + '\\'' +
                ", tell='" + tell + '\\'' +
                ", addr='" + addr + '\\'' +
                ", money=" + money +
                '}';
    }
}
  • Dao接口

/**
 * 等价与之后的mapper
 */
public interface UserDao {
    List<User> getUserList();
}
  • 接口实现类
    没有mybatis之前
/**
 * 没有mybatis时的写法
 */
public class UserDaoImpl implements UserDao{
    @Override
    public List<User> getUserList() {
        //执行sql
        String sql = "";
        //返回结果集
        //******
        return null;
    }
}

有了mybatis之后

<?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.baize.dao.UserDao">
    <!--
        查询语句
        id 对应查询名字
        resultType返回值类型
    -->
    <select id="getUserList" resultType="com.baize.entity.User">SELECT * FROM customer_table</select>
</mapper>

2-4.测试

在绿色文件夹中相同位置编写测试类(需要有junit)

/**
 * 测试类
 */
public class UserDaoTest {

    @Test
    public void test(){
        //获得SqlSession对象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        //执行sql(方式一:getmapper)
//        UserDao userMapper = sqlSession.getMapper(UserDao.class);
//        List<User> userList = userMapper.getUserList();
        //方式2:(不推荐使用)
        List<User> users = sqlSession.selectList("com.baize.dao.UserDao.getUserList");

        for (User user:users) {
            System.out.print(user.getName());
        }
        //关闭sqlSession
        sqlSession.close();
    }
}

3.CRUD(增删改查)

UserDao(UserMapper.java)

/**
 * 等价与之后的mapper
 */
public interface UserDao {
    //获取全部用户
    List<User> getUserList();
    //根据id查询用户
    User getUserById(int id);
    //增加一个用户
    int addUser(User user);
    //修改一个用户
    int updateUser(User user);
    //删除一个用户
    int deleteUser(int id);
}

UserMapper.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">
<!--namespace绑定一个对应的dao/mapper接口-->
<mapper namespace="com.baize.dao.UserDao">
    <!--
        查询语句
        id 对应查询名字
        resultType返回值类型
    -->
    <select id="getUserList" resultType="com.baize.entity.User">
        SELECT * FROM customer_table
    </select>
    <select id="getUserById" resultType="com.baize.entity.User" parameterType="int">
        SELECT * FROM customer_table WHERE id = #{id}
    </select>
    <!--对象中的属性可以直接取出来-->
    <insert id="addUser" parameterType="com.baize.entity.User">
        INSERT INTO customer_table (id, name, sex, tell, addr, money) values(#{id},#{name},#{sex},#{tell},#{addr},#{money})
    </insert>
    <update id="updateUser" parameterType="com.baize.entity.User">
        UPDATE customer_table SET money=#{money},addr = #{addr} where id = #{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        DELETE FROM customer_table where id = #{id}
    </delete>
</mapper>

UserDaoTest

package com.baize.dao;

import com.baize.entity.User;
import com.baize.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * 测试类
 */
public class UserDaoTest {

    @Test
    public void test(){
        //获得SqlSession对象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        //执行sql(方式一:getmapper)
//        UserDao userMapper = sqlSession.getMapper(UserDao.class);
//        List<User> userList = userMapper.getUserList();
        //方式2:
        List<User> users = sqlSession.selectList("com.baize.dao.UserDao.getUserList");

        for (User user:users) {
            System.out.print(user.getName());
        }
        //关闭sqlSession
        sqlSession.close();
    }

    /**
     * 根据id查询用户
     */
    @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = userDao.getUserById(1);
        System.out.println(user.toString());
        sqlSession.close();
    }
    @Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = new User(229,"张三","NAN","18271837181","BeiJing",2000);
        int result = userDao.addUser(user);
        //增删改需要 提交事务
        sqlSession.commit();
        System.out.println(result);
        sqlSession.close();
    }
    @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = new User();
        user.setId(1);
        user.setAddr("shanghai");
        user.setMoney(3000);
        int result = userDao.updateUser(user)以上是关于Mybatis入门的主要内容,如果未能解决你的问题,请参考以下文章

markdown [mybatis参考]关于mybatis #mybatis的一些片段

推荐net开发cad入门阅读代码片段

MyBatis入门详解——附代码

MyBatis从入门到精通—MyBatis基础知识和快速入门

MyBatis从入门到入土——使用详解

myBatis简单入门