Mybatis框架(入门)

注:在此使用的是maven创建的Java项目

  1. mybaties的环境搭建
  1. 创建maven工程并导入坐标
  1. 打开IDEA—>Create New Project —> Maven(在此处可以选择不勾选Create from archetype)—>写入必要信息—>finish
  2. 在pom.xml中导入依赖jar包
	<groupId>zhi.itlearn</groupId>
    <artifactId>java_mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>  <!-- 设定打包方式 -->

    <!-- 导入依赖jar包。
     其中:mybatis、mysql-connector-java是必须的依赖
    log4j:日志和junit测试是非必须的-->
	<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
  1. 引入log4j.properties文件(附:具体配置代码。若文件丢失可直接自创建)
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
  1. 创建实体类和dao的接口(注意是接口,而不再需要接口实现类)
  1. 在main/java下创建包路径:itlearn.zhi.domain
  2. 创建实体类:User
package itlearn.zhi.domain;

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

/*
* 实体类应该实现Serializable接口
* */
public class User implements Serializable {
        private Integer id;
        private String username;
        private Date birthday;
        private String sex;
        private String address;
	
    //get、set和toString方法省略
}
  1. 在itlearn.zhi下创建包dao
  2. 在dao包中创建dao层接口:IUserDao
package itlearn.zhi.dao;

import itlearn.zhi.domain.User;

import java.util.List;

public interface IUserDao {
    //查询所有User
    public List<User> findAll();
}
  1. 在main/resources下创建Mybatis的主配置文件:SqlMapConfig.xml
  1. 引入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">
  1. 配置环境
<configuration>
    <!-- 配置环境 -->
    <environments default="mysql">	<!-- 这里的default属性值不固定,建议与当前使用的数据库名称相同 -->
        <!-- 配置mysql的环境 -->
       <environment id="mysql"> <!-- 这里的id属性值必须和上面default值相同 -->
            <!-- 配置事务的类型:JDBC -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <!-- 配置连接事务的四个基本信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb" />
               <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    
	<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
    <mappers>
        <mapper resource="itlearn/zhi/dao/IUserDao.xml"></mapper>
    </mappers>
</configuration>
  1. 创建映射配置文件:IUserDao.xml
  1. 接口映射配置文件的路径必须和对应的接口路径相同,只不过是在resources包中

在main/resources下创建与映射接口相同包路径。

注:在resources中不能像java文件夹中创建package一样,而是要逐层创建文件夹。

  1. 引入接口映射配置文件的约束
<?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">
  1. 进行接口方法配置
<!-- 必须在<mapper></mapper>中 -->
<mapper namespace="itlearn.zhi.dao.IUserDao">  <!-- namespace属性值必须是dao接口的全限定类名 -->
    <select id="findAll" resultType="itlearn.zhi.domain.User"><!-- id属性必须对应接口中的方法 -->
        SELECT * FROM USER; <!-- 具体的实现语句 -->
    </select>
</mapper>  
  1. 环境搭建的注意事项
1.	mybatis的接口映射配置文件的位置必须和dao接口的包结构相同
2.	每个dao层接口都对应一个接口映射配置文件【重点】
3.	接口映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
4.	映射配置文件的id属性取值必须是dao接口的方法名
5.	在开发中不需要再写dao接口的实现类【重点】
  1. 创建测试类MybatisTest,进行入门学习
  1. 调用接口方法的步骤:
1.读取配置文件
2.创建SqlSessionFactory工厂
3.使用工厂生产SqlSession对象
4.使用SqlSession创建Dao接口的代理对象
5.使用代理对象执行方法
6.释放资源
内部思路:通过读取SqlMapConfig配置文件,创建一个工厂,通过这个工厂生产一个SqlSession对象,这个对象用于创建dao的代理,实现之后可通过此代理对象调用dao的方法。
  1. 代码展示:
package itlearn.zhi.test;

import itlearn.zhi.dao.IUserDao;
import itlearn.zhi.domain.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.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {
    public static void main(String[] args) throws IOException {

        //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 dao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = dao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }
}
  1. 注意事项:
1.	读取核心配置文件:使用InputStream流,读取核心配置文件的代码为:				Resources.getResourceAsStream("SqlMapConfig.xml");
2.	创建SqlSessionFactory对象的时候,SqlSessionFactory是一个接口,不能直接new,只能通过实现类(SqlSessionFactoryBuilder)创建对象来接收。
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);//传入输入流对象
3.	产生动态代理调用的方法为:getMapper(传入dao层接口的字节码对象),使用dao层接口接收
IUserDao dao = session.getMapper(IUserDao.class);
4.	创建工厂使用的是:构建者模式:将创建对象的具体细节隐藏,使使用者直接调用方法即可创建对象。
  1. 注解开发(简单入门)

把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定sql语句。

同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名

	<mappers>
        <mapper class="itlearn.zhi.dao.IUserDao"></mapper>
    </mappers>

	@Select("select * from user;")
    public List<User> findAll();