mybatis入门(包括增删改流程)

mybatis入门(包括增删改流程)

介绍

mybatisdbutils本质上但是对JDBC的封装

使用教程

maven配置

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

设置配置文件(下面是模板)

mybatis-config

文件名:mybatis.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>
    <settings>
        <!-- 设置mybatis在控制台使用日志输出sql语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!-- 设置mybatis识别实体类的驼峰命名,并将大写字母转换为_小写字母 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!-- typeAliases用于配置实体类的别名 -->
    <typeAliases>
        <!-- 方式一:为每一个实体类分别指定一个别名。比较繁琐 -->
        <!--        <typeAlias type="" alias=""/>-->
        <!-- 直接指定实体类的包,这样mybatis就会自动给这个包下所有的实体类指定创建别名,别名就是类名不包括类名,使用时也不区分大小写 -->
        <package name=""/>
    </typeAliases>

    <!-- 配置环境,主要是配置不同数据库的数据源,default指定使用的默认数据源环境的id -->
    <environments default="mysql">
        <!-- 配置mysql数据源的环境,id通常指定数据库名称 -->
        <environment id="mysql">
            <!-- 事务管理使用JDBC的事务 -->
            <transactionManager type="JDBC"/>
            <!-- type指定为pool表示数据源连接使用mybatis连接池,目的是可以让连接复用 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://数据库地址:端口?serverTimezone=Asia/Shanghai&useSSL=false"/>
                <property name="username" value=""/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>

    <!-- 解析mapper -->
    <mappers>
    </mappers>
</configuration>

mybatis-mapper

文件名:实体类Mapper.xml
useGeneratedKeys="true":这个属性告诉 MyBatis 使用数据库自动生成的主键值。当这个属性设置为 true 时,MyBatis 会在执行插入操作后从数据库获取生成的主键值。

keyProperty="uid":这个属性指定了将生成的主键值设置到哪个 Java 对象的属性中。在这个示例中,keyProperty 设置为 "uid",这意味着 MyBatis 将生成的主键值设置到 Java 对象的 uid 属性中。

<?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指定接口的完整类名 -->
<mapper namespace="">

    <!-- 给UserDao接口中的所有方法编写相应的SQL语句 -->
    <!-- insert表示传入语句,对应的删除和修改是delete和update标签 -->
    <!-- id对应接口的方法名,parameterType指定参数的类型,如果是实体可以引用mybatis.xml中定义的别名 -->
    <!-- insert标签中只能写sql语句,注释也不能写 -->
    <!-- SQL语句中的参数使用#{实体中的属性名}来获取实体对象中的属性的值(包括复杂的值比如Map<String,User> lists,使用方法#{key}.tel) -->
    <insert id="sava" parameterType="User" useGeneratedKeys="true" keyProperty="uid">
        insert into test(u_name, u_tel)
        values (#{userName}, #{tel});
    </insert>

    <!-- 如果参数是map,那么ognl表达式的值为map的key -->
    <insert id="savaMap" parameterType="Map">
        insert into test(u_name, u_tel)
        values (#{name}, #{tel});
    </insert>

    <!-- 注意:当方法参数只有一个并且是基本数据类型时候,那么ognl的值可以是任意填写 -->
    <delete id="delete" parameterType="int">
        delete
        from test
        where u_id = #{id}
    </delete>

    <update id="update" parameterType="user">
        update test
        set u_name = #{userName},
            u_tel  = #{tel}
        where u_id = #{uid}
    </update>
</mapper>

MybatisUtils(负责创建SqlSession实例)

public class MybatisUtils {
    /**
     * 声明SqlSessionFactory,用于创建SqlSession实例
     */
    public static SqlSessionFactory sqlSessionFactory;

    /**
     * 在静态代码块中初始化SqlSessionFactory工厂
     */
    static {
        try {
            // 通过查找mybatis的核心配置文件,先创建一个用于读取xml文件的输入流
            InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
            // 将输入流传给创建的SqlSessionFactoryBuilder进行解析,并初始化整个SqlSessionFactory工厂对象
            // SqlSessionFactoryBuilder:mybatis提供的负责创建SqlSessionFactory的构建器类
            // build(inputStream):接收输入流用于解析配置文件,并创建SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * SqlSession是操作数据库的核心对象,相当于封装了整个Connection(连接对象)
     * 不带参数的openSession方法得到SqlSession是需要我们手动提交事务的
     *
     * @return
     */
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }

    /**
     * openSession方法还可以传入一个boolean类型的参数
     * 如果设置为true,创建出来的SqlSession就会自动提交事务,false一样是是手动提交
     *
     * @param autoCommit 是否自动提交
     * @return
     */
    public static SqlSession getSqlSession(boolean autoCommit) {
        return sqlSessionFactory.openSession(autoCommit);
    }
}

实体类DaoImpl

public class UserDaoImpl implements UserDao {
    @Override
    public void sava(User user) {
        // 先创建SqlSession
        SqlSession session = MybatisUtils.getSqlSession();
        try {
            // 执行保存
            session.getMapper(UserDao.class).sava(user);
            // 手动提交事务(自动提交时不需要)
            session.commit();
        } catch (RuntimeException e) {
            e.printStackTrace();
            // 事务的回滚(自动提交时不需要)
            session.rollback();
        } finally {
            session.close();
        }
    }

    @Override
    public void savaMap(Map<String,Object> map) {
        SqlSession session = MybatisUtils.getSqlSession(true);
        session.getMapper(UserDao.class).savaMap(map);
    }

    @Override
    public void delete(int id) {
        SqlSession session = MybatisUtils.getSqlSession(true);
        session.getMapper(UserDao.class).delete(id);
    }

    @Override
    public void update(User user) {
        SqlSession session = MybatisUtils.getSqlSession(true);
        session.getMapper(UserDao.class).update(user);
    }
}