美文网首页
MyBatis--初入MyBatis

MyBatis--初入MyBatis

作者: aruba | 来源:发表于2022-05-12 15:38 被阅读0次

    MyBatis是一个ORM框架,广泛运用于Java后台开发,是SSM框架中的一个,用于建立数据库和JavaBean的映射关系,简化了JDBC的一系列操作,如数据库连接、statement的创建等等,使得后台人员只需要关注SQL语句的编写

    一、MyBatis的依赖导入

    1. Ideal中新建Maven工程

    我这边是建了一个Maven主工程,以及Maven的Module,后续依赖导入直接放入主工程pom中,方便其他Module使用

    2. Maven导入MyBatis依赖

    Maven中心地址:https://mvnrepository.com/
    Maven中心搜索mybatis,这边根据个人习惯,使用热度高的版本


    将上面标签复制到工程pom文件中
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.7</version>
            </dependency>
        </dependencies>
    
    3. 导入其他依赖

    为了测试和方便,再分别导入junit和lombok插件,使用lombok插件记得开启注解解析器

            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.1</version>
                <scope>test</scope>
            </dependency>
            <!--lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.12</version>
                <scope>provided</scope>
            </dependency>
    

    jdbc依赖导入,这边使用的MySQL数据库

            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.28</version>
            </dependency>
    
    4. 配置MyBatis核心配置文件

    在resources目录下新建sqlMapConfig.xml,约定俗成使用该文件名

    sqlMapConfig.xml
    内容为jdbc的配置信息:
    <?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://127.0.0.1:3306/mydb?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>
    
    </configuration>
    

    二、 运行测试

    接下来来简单的使用下,后续会对如何使用MyBatis进行详细说明

    1. 数据库中准备数据

    使用下面sql创建表和插入一些数据,就是oracle中默认的几张表

    create table DEPT(  
      DEPTNO int(2) not null,  
      DNAME  VARCHAR(14),  
      LOC    VARCHAR(13)  
    );  
    alter table DEPT  
      add constraint PK_DEPT primary key (DEPTNO); 
            
    create table EMP  
    (  
      EMPNO    int(4) primary key,  
      ENAME    VARCHAR(10),  
      JOB      VARCHAR(9),  
      MGR      int(4),  
      HIREDATE DATE,  
      SAL      double(7,2),  
      COMM     double(7,2),  
      DEPTNO   int(2)  
    );  
    alter table EMP  
      add constraint FK_DEPTNO foreign key (DEPTNO)  
      references DEPT (DEPTNO);  
            
    create table SALGRADE  
    (  
      GRADE int primary key,  
      LOSAL double(7,2),  
      HISAL double(7,2)  
    );  
    create table BONUS  
    (  
      ENAME VARCHAR(10),  
      JOB   VARCHAR(9),  
      SAL   double(7,2),  
      COMM  double(7,2)  
    );  
    insert into DEPT (DEPTNO, DNAME, LOC)  
    values (10, 'ACCOUNTING', 'NEW YORK');  
    insert into DEPT (DEPTNO, DNAME, LOC)  
    values (20, 'RESEARCH', 'DALLAS');  
    insert into DEPT (DEPTNO, DNAME, LOC)  
    values (30, 'SALES', 'CHICAGO');  
    insert into DEPT (DEPTNO, DNAME, LOC)  
    values (40, 'OPERATIONS', 'BOSTON');  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);  
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)  
    values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);  
    insert into SALGRADE (GRADE, LOSAL, HISAL)  
    values (1, 700, 1200);  
    insert into SALGRADE (GRADE, LOSAL, HISAL)  
    values (2, 1201, 1400);  
    insert into SALGRADE (GRADE, LOSAL, HISAL)  
    values (3, 1401, 2000);  
    insert into SALGRADE (GRADE, LOSAL, HISAL)  
    values (4, 2001, 3000);  
    insert into SALGRADE (GRADE, LOSAL, HISAL)  
    values (5, 3001, 9999); 
    

    完成后如下:


    2. 新建Dept类

    对应数据库中的dept表


    dept表

    包结构:


    Dept类 :

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Dept implements Serializable {
        /**
         * 部门编号
         */
        private Integer deptno;
        /**
         * 部门名称
         */
        private String dname;
        /**
         * 地址
         */
        private String loc;
    }
    
    3. 在resources目录下新建xml映射文件

    DeptMapper.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">
    <!--暂时命名为a-->
    <mapper namespace="a">
        <!--public List<Dept> findAll(){    }-->
        <select id="findAll" resultType="com.aruba.bean.Dept">-- resultType对应实体类
            select * from dept
        </select>
    </mapper>
    
    4. 在sqlMapConfig.xml中配置映射文件路径

    光创建了映射文件,MyBatis并不会自动导入,得告诉它加载哪些映射文件

    <?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://127.0.0.1:3306/mydb?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>
        <!--加载mapper映射文件-->
        <mappers>
            <mapper resource="com/aruba/mapper/DeptMapper.xml"/>
        </mappers>
    </configuration>
    
    5. 测试代码

    创建测试类:


    内容如下:

    public class Test1 {
        private SqlSession sqlSession;
    
        @Before
        public void init() throws IOException {
            SqlSessionFactoryBuilder sb = new SqlSessionFactoryBuilder();
            // 将配置文件作为参数传入
            sqlSession = sb.build(Resources.getResourceAsStream("sqlMapConfig.xml")).openSession();
        }
    
    
        @Test
        public void test1(){
            List<Dept> result = sqlSession.selectList("findAll");
            result.forEach(System.out::println);
        }
    }
    

    运行结果:



    可以看到我们成功得获得数据库中的数据,并且MyBatis将数据自动转换为Java中的实体类

    三、日志配置

    MyBatis默认支持的日志框架如下:


    可以通过配置文件进行指定使用哪个日志框架,我们这边使用的log4j1日志框架

    1. 导入log4j依赖
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    
    2. 创建log4j配置文件

    resources目录下新建log4j.properties文件,文件名必须一致

    #定义全局日志级别调试阶段推荐debug
    #制定使用哪种方式输出日志,这边只输出到控制台,要保存到文件,在后面加上logfile
    log4j.rootLogger=debug,stdout
    
    #输出控制台
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.err
    log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
    
    #日志保存到文件中
    log4j.appender.logfile=org.apache.log4j.FileAppender
    log4j.appender.logfile.File=d:/msb.log
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
    
    3. MyBatis配置指定日志框架

    不指定会自动查找,所以这步可以省略,如果要配置的话settings必须在environments之上
    sqlMapConfig.xml:

    4. 测试运行

    结果:


    现在可以看到sql语句输出了

    四、其他配置

    1. 事务配置(了解即可)

    事务我们在之前就已经配置好了,在配置文件sqlMapConfig.xml的environment标签下:

    transactionManager可选项如下:

    • JDBC :就是使用数据库连接自带的事务
    • MANAGED :相当于不使用事务。交由容器来管理,如Spring
    2.映射文件的加载方式

    目前我们使用的是:


    DeptMapper.xml

    加载方式一共有4种:

    • resource:资源文件路径
    • url:网络路径
    • class:指定类的全路径
    • package:包扫描,就是不需要一个一个添加了

    后续基于接口代理会用到类加载的方式

    3. 实体类别名处理

    在映射文件DeptMapper.xml中,目前resultType需要使用全包名:

    我们可以在MyBatis配置文件sqlMapConfig.xml中,对类进行别名处理

    sqlMapConfig.xml
    方便复制:
        <!--为实体类设置别名-->
        <typeAliases>
            <typeAlias type="com.aruba.bean.Dept" alias="dept"/>
        </typeAliases>
    

    这时我们可以在映射文件中使用别名代替全包名

    DeptMapper.xml

    别名处理也支持包扫描,将包下所有实体类进行别名处理,默认每个实体类的别名是首字母小写的类名

        <!--为实体类设置别名-->
        <typeAliases>
    <!--        <typeAlias type="com.aruba.bean.Dept" alias="dept"/>-->
            <!--扫描com.aruba.bean下所有实体类-->
            <package name="com.aruba.bean"/>
        </typeAliases>
    

    五、外部属性配置文件

    我们想把数据库链接信息存储在properties文件中,然后在MyBatis配置文件中读取

    1. 创建jdbc.properties

    在resources中创建文件

    jdbc.properties

    内容如下:

    jdbc_driver=com.mysql.cj.jdbc.Driver
    jdbc_url=jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    jdbc_username=root
    jdbc_password=root
    
    2.配置文件中读取
    sqlMapConfig.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>
    <!--    引入外部properties文件-->
        <properties resource="jdbc.properties"></properties>
    
        <settings>
            <setting name="logImpl" value="LOG4J"/>
        </settings>
        <!--为实体类设置别名-->
        <typeAliases>
    <!--        <typeAlias type="com.aruba.bean.Dept" alias="dept"/>-->
            <!--扫描com.aruba.bean下所有实体类-->
            <package name="com.aruba.bean"/>
        </typeAliases>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
    <!--                使用外部properties文件中的值-->
                    <property name="driver" value="${jdbc_driver}"/>
                    <property name="url" value="${jdbc_url}"/>
                    <property name="username" value="${jdbc_username}"/>
                    <property name="password" value="${jdbc_password}"/>
                </dataSource>
            </environment>
        </environments>
        <!--加载mapper映射文件-->
        <mappers>
            <mapper resource="com/aruba/mapper/DeptMapper.xml"/>
            <!--包扫描-->
            <package name="com.aruba.mapper"/>
        </mappers>
    </configuration>
    

    好了,MyBatis的配置和初步使用就到此结束了

    项目地址:

    https://gitee.com/aruba/mybatis_study.git

    相关文章

      网友评论

          本文标题:MyBatis--初入MyBatis

          本文链接:https://www.haomeiwen.com/subject/uirsurtx.html