Mybatis基础-01

时间:2021-07-17
本文章向大家介绍Mybatis基础-01,主要包括Mybatis基础-01使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Mybatis基础-01

1.Mybatis第一个程序

  1. 引入依赖
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>
  1. 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/springboot"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- mapper的位置 -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>
  1. mapper配置文件
<?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 namespace="com.my.mybatis.dao.UserDao">
    <select id="selectAll" resultType="com.my.mybatis.pojo.User">
        select * from tb_user
    </select>
</mapper>
  1. SQL
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int NOT NULL,
  `class_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', 'tom', '20', '2');
INSERT INTO `tb_user` VALUES ('2', 'bob', '30', '2');
INSERT INTO `tb_user` VALUES ('3', 'alice', '40', '4');
INSERT INTO `tb_user` VALUES ('4', 'sir', '50', '4');
INSERT INTO `tb_user` VALUES ('5', 'one', '19', '5');
INSERT INTO `tb_user` VALUES ('6', 'two', '20', '6');
INSERT INTO `tb_user` VALUES ('7', 'three', '30', '7');
INSERT INTO `tb_user` VALUES ('8', 'z', '10', '8');
  1. 启动程序。
public class User {

    private Integer id;
    private String name;
    private Integer age;
}

public interface UserDao {

    List<User> selectAll();
}

public class MybatisTest {

    @Test
    public void test01() {
        // 加载mybatis配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //创建SqlSessionFactory对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession();

            UserDao userDao = sqlSession.getMapper(UserDao.class);
            List<User> users = userDao.selectAll();
            users.forEach(System.out::println);
        }catch (SqlSessionException e) {
            e.printStackTrace();
        }finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

2.Mybatis多环境配置

<!-- 多个环境时,使用default定义要使用的 environment 的id -->
<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/springboot"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </dataSource>
    </environment>

    <environment id="test">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/springboot"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </dataSource>
    </environment>
</environments>

3.Mybatis两种事务管理器

  1. JDBC。这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
  2. MANAGED。这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。

4.Mybatis数据源

  1. mybatis有三种内建的数据源类型type="[UNPOOLED|POOLED|JNDI]"POOLED的实现类似数据库的连接池。

5.properties属性

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/springboot
username=root
password=123456
<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>
</configuration>

6.允许Mybatis使用类的别名

<configuration>
    <!-- 别名定义 -->
    <typeAliases>
        <!-- 对一个类起别名 -->
       <typeAlias type="com.my.mybatis.pojo.User" alias="user" />

        <!-- 对该包下所有的类起别名,别名为类名的首字母小写。如,User为User或user,建议使用user。
        @Alias("user")可以修改类别名,@Alias("user")只在使用package配置别名时有效。-->
        <package name="com.my.mybatis.pojo" />
    </typeAliases>
</configuration>

7.mapper映射

<configuration>
    <!-- 告诉mybatis mapper 文件的位置 -->
    <mappers>
        <mapper resource="mapper/UserDao.xml"/>

        <!-- 该用法mapper时mapper文件必须和对应到dao接口在相同的路径,并且和dao接口名相同,
         同时只能配置一个mapper和dao的对应关系。-->
        <mapper class="com.my.mybatis.dao.UserDao"/>

        <!-- 使用package时mapper文件必须和对应到dao接口在相同的路径,切和dao接口名相同 -->
        <package name="com.my.mybatis.dao"/>
    </mappers>
</configuration>

8.Mybatis三大对象的生命周期和作用域

  1. SqlSessionFactoryBuilder一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
  2. SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。因此 SqlSessionFactory 的最佳作用域是应用作用域。
    有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
  3. SqlSession。如果将SqlSessionFactory比作数据库连接池,那么SqlSession相当于数据库连接池中的线程。每个线程都应该有它自己的SqlSession实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。

9.ResultMap

<mapper namespace="com.my.mybatis.dao.UserDao">

    <!-- 使用resultMap进行结果接映射。可以只映射类属性和表列名不同的字段 -->
    <resultMap id="User" type="com.my.mybatis.pojo.User">
        <result property="id" column="id" />
        <result property="name" column="name" />
        <result property="age" column="age" />
    </resultMap>

    <select id="selectAll" resultMap="User">
        select * from tb_user
    </select>
</mapper>

10.Mybatis日志框架

  1. 标准日志框架STDOUT_LOGGING
<configuration>
    <settings>
        <!-- 标准日志框架,org.apache.ibatis.logging.stdout.StdOutImpl',
		引入后可以直接使用。-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>>
</configuration>
  1. log4j的使用

    1. 引入依赖
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    
    1. 导入log4j.properties配置
    ### 配置根 ###
    log4j.rootLogger = debug,console,file
    
    ### 配置输出到控制台 ###
    log4j.appender.console = org.apache.log4j.ConsoleAppender
    log4j.appender.console.Target = System.out
    log4j.appender.console.Threshold = debug
    log4j.appender.console.layout = org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern =  [%c]-%m%n
    
    # 文件输出相关设置
    log4j.appender.file = org.apache.log4j.RollingFileAppender
    # 将日志输出到当前工程中
    log4j.appender.file.File = ./log/mybatis.log
    log4j.appender.file.MaxFileSize = 10MB
    log4j.appender.file.Threshold = debug
    log4j.appender.file.layout = org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern = [%p][%d{yy-MM-dd}][%c]%m%n
    
    #日志级别
    log4j.logger.org.mybatis = debug
    log4j.logger.java.sql = debug
    log4j.logger.java.sql.Statement = debug
    log4j.logger.java.sql.ResultSet = debug
    log4j.logger.java.sql.PreparedStatement = debug
    
    1. mybatis-config.xml中开启日志处理
    <configuration>
        <settings>
            <!-- log4j -->
            <setting name="logImpl" value="LOG4J"/>
        </settings>
    </configuration>
    

11.分页

  1. limit 0,2 从第一个数据开始,取两行数据,即第1和2行的数据。

  2. 一般传入前段传入pageNum(第几页)和pageSize(每页大小)

  3. 转换为limit的算法。limit (pageNum-1)*pageSize, pageSize。这是简单的计算过程,实际情况需要考虑数据的边界问题。

原文地址:https://www.cnblogs.com/godistance/p/15024722.html