IDEA 2020 MyBatis环境搭建及入门案例(使用xml方式和注解方式配置)

MyBatis入门

 

MyBatis环境搭建

使用IDEA搭建MyBatis环境

1.创建Maven工程并添加依赖

创建Maven工程
pom.xml中添加依赖:(log4j可以在控制台输出执行的sql语句,便于观察)

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13-beta-3</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.创建实体类和dao的接口

注意包名,在src/main/java下创建包com.cjx.entity和com.cjx.dao

package com.cjx.entity;

import java.io.Serializable;
import java.util.Date;

/**
 * @author :
 * @date :Created in 2019/11/7 17:03
 * @description : user
 */
public class User implements Serializable {
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
package com.cjx.dao;

import com.cjx.entity.User;

import java.util.List;

/**
 * @author :
 * @date :Created in 2019/11/7 17:07
 * @description : dao
 */
public interface IUserDao {

    /**
     * @author      :
     * @description :查询所有
     * @date        :Created in 2019/11/7
     */
    List<User> findAll();
}

3.创建MyBatis主配置文件:SqlMapConfig.xml

这里要提前准备好一个数据库,这里取名为eesy_mybatis,表名为user,设计如下图:
在这里插入图片描述
随便往里面添加一些数据。
在resources中创建文件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">
<!-- MyBatis的主配置文件 -->
<configuration>
    <!-- 配置环境 -->
    <environments default="mysql">
        <!-- 配置MySQL环境 -->
        <environment id="mysql">
            <!-- 配置事务类型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源/连接池 -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息  -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="1999"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置文件的位置 -->
    <mappers>
        <mapper resource="com/cjx/dao/IUserDao.xml"/>
    </mappers>
</configuration>

4.创建映射配置文件

在resources中创建目录com.cjx.dao,然后创建文件IUserDao.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">
<mapper namespace="com.cjx.dao.IUserDao">
    <!-- 配置查询所有 -->
    <select id="findAll" resultType="com.cjx.entity.User">
        select * from user
    </select>
</mapper>

5.创建log4j的配置文件

与SqlMapConfig同级创建log4j.properties文件

log4j.rootLogger=DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.R.File=../logs/service.log
#log4j.appender.R.layout=org.apache.log4j.PatternLayout
#log4j.appender.R.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#log4j.logger.com.ibatis = debug
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = debug
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner = debug
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = debug
#log4j.logger.java.sql.Connection = debug
log4j.logger.java.sql.Statement = debug
log4j.logger.java.sql.PreparedStatement = debug
log4j.logger.java.sql.ResultSet =debug

搭建环境的注意事项

  1. 创建IUserDao.xml和IUserDao.java时名称是为了和以前的知识保持一致。在MyBatis中把持久层的操作接口名称和映射文件也叫做Mapper。所以在其他项目中可能叫IUserMapper,到时候也要能看懂。
  2. 在idea中创建目录时和包是不一样的。包在创建是com.cjx.dao,这是一个三级的结构,而目录com.cjx.dao,这是一个1级的目录,目录的名字就叫“com.cjx.dao”,创建目录必须用斜杠,即com/cjx/dao,才会创建三级目录,在IDEA2019中会默认把目录也折叠成com.cjx.dao的形式,如果要创建一个service目录,那么就还在resources目录下创建一个com/cjx/service,就可以正常创建。
    IDEA2019目录结构

(此图展示com/cjx/dao的情况下IDEA2019中会默认把目录也折叠成com.cjx.dao的形式)

  1. MyBatis的映射配置文件位置必须和dao接口的包结构相同,包在com.cjx.dao,那么xml也必须在resources中的com/cjx/dao。
  2. 映射配置文件的mapper标签的namespace属性的取值必须是dao接口的全限定类名。
  3. 映射配置文件的操作配置(如select),id属性的取值必须是dao接口的方法名,因为查询操作有返回值,所以必须指定一个返回的结果类型,属性为resultType,取值是返回值的类,这里就是user。

当我们遵从了3、4、5点后,我们在开发中就无需再写dao的实现类,剩下的功能会由MyBatis来实现。
 

MyBatis入门案例

创建测试函数实现数据库查询

在test/java中创建包com.cjx.test,创建类MybatisTest,在类中创建Main函数,主要有以下几步:

  1. 读取配置文件
  2. 创建SqlSessionFactory工厂
  3. 使用工厂生产一个SqlSession对象
  4. 使用SqlSession创建dao接口的代理对象
  5. 使用代理对象执行方法
  6. 释放资源

代码如下:

package com.cjx.test;

import com.cjx.dao.IUserDao;
import com.cjx.entity.User;
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 java.io.InputStream;
import java.util.List;

/**
 * @author :
 * @date :Created in 2019/11/8 10:12
 * @description : 入门案例
 */
public class MybatisTest {
    /**
     * @author      :
     * @description :入门案例
     * @param       : [args]
     * @return      : void
     * @date        :Created in 2019/11/8
     */
    public static void main(String[] args) throws Exception {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产一个SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession创建dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for (User user :
                users) {
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }
}

点击运行后可能出现的一些问题

不支持发行版本 5

这是因为Maven默认的Java版本是1.5,而大部分人装的都是新的版本。解决方法如下:

  1. File->Settings->Build,Excution,Deployment->Compiler->Java Compiler中设置target bytecode version为13(我的是13,其他人可能是1.8)在这里插入图片描述
  2. 在pom.xml中与<dependencies>同级的配置中加入
    <properties>
       <java.version>13</java.version>
       <maven.compiler.source>13</maven.compiler.source>
       <maven.compiler.target>13</maven.compiler.target>
   </properties>
  1. File->Project Structure->Project Settings->Project中修改两处Project SDK
    在这里插入图片描述
  2. Modules中也修改一处Language Level
    在这里插入图片描述

访问数据库时可能出现的时区问题

解决方法:在数据库链接后面加上时区参数"?serverTimezone=UTC",即修改SqlMapConfig.xml文件中的这一句

        <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"/>

使用注解方式重新运行此项目

使用注解方式就可以删除掉映射配置文件,使用注解来代替,使项目更加简洁。

1.在dao接口中添加注解指定sql语句

在创建dao接口时,在findAll方法上加注解@Select(“select * from user”)即可取代映射配置文件。代码如下:

package com.cjx.dao;

import com.cjx.entity.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @author :
 * @date :Created in 2019/11/7 17:07
 * @description : dao
 */
public interface IUserDao {

    /**
     * @author      :
     * @description :查询所有
     * @date        :Created in 2019/11/7
     */
    @Select("select * from user")
    List<User> findAll();
}

2.在主配置文件中配置mapper

在SqlMapConfig.xml中,配置mapper时使用class属性指定dao接口的全限定类名,代码如下:(主要是最后几行发生了变化),配置完成后就可以把resources下的com.cjx.dao.IUserDao.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">
<!-- MyBatis的主配置文件 -->
<configuration>
    <!-- 配置环境 -->
    <environments default="mysql">
        <!-- 配置MySQL环境 -->
        <environment id="mysql">
            <!-- 配置事务类型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源/连接池 -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息  -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="1999"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 使用xml方式配置时这里指定映射配置文件的位置,但是本次使用注解配置,应该使用class属性指定被注解的dao全限定类名 -->
    <mappers>
        <mapper class="com.cjx.dao.IUserDao"/>
    </mappers>
</configuration>

删除IUserDao.xml后再次点击运行,仍然可以成功运行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章