MyBatis 教程 —— 乐之者java

By 乐之者java ,相关链接:

https://space.bilibili.com/392539815
http://www.roadjava.com/

MyBatis 官方文档

https://mybatis.org/mybatis-3/zh/index.html

select 快速入门

  1. 工程目录结构
    image
  2. QuickStartTest.java 的内容
package org.example;

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 org.example.POJO.User;
import org.example.mapper.UserMapper;
import org.junit.Test;

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

public class QuickStartTest {
    /**
     * mybatis 的第二种写法(最终写法):
     * 1. 创建 mybatis 的配置文件 mybatis-config.xml ,名字可以随便起
     * 2. 创建 SqlSessionFactory
     * 3. 通过 SqlSessionFactory 创建 SqlSession
     * 4. 创建 mapper 文件
     * 5. 使用 SqlSession 对象获取接口代理
     * 6. 调用接口的方法即可
     * */
    @Test
    public void test2() throws IOException {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user = userMapper.selectUserById(1L);
            System.out.println(user);
        }
    }

    /**
     * mybatis 的第一种写法:
     * 1. 创建 mybatis 的配置文件 mybatis-config.xml ,名字可以随便起
     * 2. 创建 SqlSessionFactory
     * 3. 通过 SqlSessionFactory 创建 SqlSession
     * 4. 创建 mapper 文件
     * 5. 使用 SqlSession 对象执行
     * */
    @Test
    public void test1() throws IOException {
        // 1. 从类路径开始找配置文件:
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 2. 创建 SqlSessionFactory :
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 3. 通过 SqlSessionFactory 创建 SqlSession :
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 4. 执行指定的 sql 语句 id 标识,命名规则:namespace 的值 + 语句的 id 属性值
            String statementId = "abcd.selectUserById";
            User user = (User) session.selectOne(statementId, 1);
            System.out.println(user);
        }
    }
}
  1. mybatis/mybatis-config.xml 的内容
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--    定义一些键值对,可以在当前文件中(或 mapper 文件中)通过 ${} 的方式来使用;-->
<!--    resource:指定外部配置文件的文件,从类路径开始算:-->
    <properties resource="mybatis/config.properties">
        <property name="prop1" value="prop1"/>
    </properties>
<!--    数据库环境的配置:-->
    <environments default="development">
<!--        db 环境可以有多个,通过 id 属性区分:-->
        <environment id="development">
<!--            type 取值:JDBC 或 MANAGED ;-->
<!--            JDBC:使用 java.sql.Connection 管理事务:-->
            <transactionManager type="JDBC"/>
<!--            type:POOLED 或 UNPOOLED 或 JNDI-->
<!--            POOLED:org.apache.ibatis.datasource.pooled.PooledDataSource :-->
            <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>
<!--    告诉 mybatis 去哪里找 mapper 文件:-->
    <mappers>
<!--        从类路径开始找 mapper 文件:-->
        <mapper resource="mybatis/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
  1. mybatis/config.properties 的内容
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username=root
password=06669590
  1. mybatis/mapper/UserMapper.xml 的内容
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:
第一种写法:避免语句 id 的重复;
第二种写法:
  1. 避免语句 id 的重复;
  2. 用于确定和哪个接口对应,要求 namespace 的值是对应接口的全限定名:-->
<!--<mapper namespace="abcd">-->
<mapper namespace="org.example.mapper.UserMapper">
    <!--
    select 标签用于查询;
    #{xxx} :取出方法入参的值,mybatis 会将其替换为 ? 号,相当于:
    Connection connection;
    PreparedStatement ps = connection.prepareStatement(sql);
    ps.setObject(1, "1aaa");
    -->
    <select id="selectUserById" resultType="org.example.POJO.User">
<!--        select * from user where user_id = #{userId}-->
        select
            user_id as userId,
            user_name as userName,
            age,
            addr,
            gender
        from user where user_id = #{userId}
    </select>
</mapper>
  1. User.java 的内容
package org.example.POJO;

import lombok.Data;

@Data
public class User {
//    private Long user_id;
//    private String user_name;
//    private Integer age;
//    private String addr;
//    private String gender;

    private Long userId;
    private String userName;
    private Integer age;
    private String addr;
    private String gender;
}
  1. UserMapper.java 的内容
package org.example.mapper;

import org.example.POJO.User;

// 命名为 mapper 或 dao 都可以:
public interface UserMapper {
    User selectUserById(Long userId);
}

insert

  1. 在 QuickStartTest.java 中添加:
    @Test
    public void test3() throws IOException {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                // 指定要使用哪一个环境:
                .build(inputStream, "development");
        // 默认获取到的 session 是不自动提交的(connection.setAutoCommit(false)):
        // try (SqlSession session = sqlSessionFactory.openSession(true)) { // 获取自动提交的 session
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user2save = new User();
            user2save.setUserName("小红");
            user2save.setAge(99);
            user2save.setAddr("杭州");
            user2save.setGender("女");
            userMapper.insert(user2save);
            session.commit();
        }
    }
  1. 在 UserMapper.xml 中添加:
    <insert id="insert">
        insert into user(user_name, age, addr, gender)
        values (
            #{userName}, #{age}, #{addr}, #{gender}
        )
    </insert>
  1. 在 UserMapper.java 中添加:
void insert(User user);

delete

  1. 在 QuickStartTest.java 中添加:
    @Test
    public void test4() throws IOException {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            userMapper.deleteById(4L);
            session.commit();
        }
    }
  1. 在 UserMapper.xml 中添加:
    <delete id="deleteById">
        delete from user where user_id = #{id}
    </delete>
  1. 在 UserMapper.java 中添加:
void deleteById(Long userId);

update

  1. 在 QuickStartTest.java 中添加:
    @Test
    public void test5() throws IOException {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user2update = new User();
            user2update.setUserName("小红");
            user2update.setAge(18);
            user2update.setAddr("杭州西湖区");
            user2update.setGender("女");
            user2update.setUserId(6L);
            userMapper.updateById(user2update);
            session.commit();
        }
    }
  1. 在 UserMapper.xml 中添加:
    <update id="updateById">
        update user set
            user_name = #{userName},
            age = #{age},
            addr = #{addr},
            gender = #{gender}
        where user_id = #{userId}
    </update>
  1. 在 UserMapper.java 中添加:
void updateById(User user);

获取自动生成的主键的两种方式

useGeneratedKeys + keyProperty

  1. 在 QuickStartTest.java 中添加:
@Test
    public void test6() throws IOException {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "development");
        /**
         * 在 JDBC 中通過如下方式獲取:
         * Connection connection;
         * PreparedStatement ps = connection.prepareStatement("");
         * ps.getGeneratedKeys();
         * 或通過 select last_insert_id() 获取。
         * */
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user2save = new User();
            user2save.setUserName("小红");
            user2save.setAge(99);
            user2save.setAddr("杭州");
            user2save.setGender("女");
            userMapper.insert(user2save);
            session.commit();
            System.out.println(user2save.getUserId());
        }
    }
  1. 在 UserMapper.xml 中添加:
<!--useGeneratedKeys 的默认值是 false ,设置为 true 会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键;
    keyProperty :设置取到自动生成的主键后要把主键值赋给谁:-->
    <insert id="insert" useGeneratedKeys="true" keyProperty="userId">
        insert into user(user_name, age, addr, gender)
        values (
            #{userName}, #{age}, #{addr}, #{gender}
        )
    </insert>

selectKey 子元素

posted @ 2023-03-22 08:30  HopeLive  阅读(31)  评论(0)    收藏  举报