美文网首页
Mybatis 的应用1 —— 简单例子

Mybatis 的应用1 —— 简单例子

作者: WesleyLien | 来源:发表于2017-10-17 00:04 被阅读0次

    导入相关包

    创建 maven 工程导入相关包 pom.xml:

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.12</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.8.2</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.25</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    

    导入的 log4j 和 slf4j 相关包用于输出 sql 语句

    创建 mybatis XML 配置文件

    创建 mybatis XML 配置文件 :

    <!-- mybatisConfig.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.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
          </dataSource>
        </environment>
      </environments>
      <mappers>
        <mapper resource="com/lian/mapper/UserMapper.xml"/>
      </mappers>
    </configuration>
    

    每个 <environment> 代表一个数据库连接。它包含获取数据库连接实例的数据源(DataSource)、决定事务作用域和控制方式的事务管理器(TransactionManager)

    创建对应的 XML 映射文件

    <!-- com/lian/mapper/UserMapper.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.lian.mapper.UserMapper">
      <select id="selectUserById1" resultType="hashmap" parameterType="Integer">
        select * from tb_user where id = #{id}
      </select>
    </mapper>
    

    创建输出 sql 的 log4j 配置文件 log4j.properties

    log4j.rootLogger=DEBUG, Console  
      
    #Console  
    log4j.appender.Console=org.apache.log4j.ConsoleAppender  
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout  
    log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n  
      
     
    log4j.logger.org.apache=INFO  
    log4j.logger.java.sql=DEBUG
    log4j.logger.java.sql.ResultSet=INFO 
    log4j.logger.java.sql.Connection=DEBUG  
    log4j.logger.java.sql.Statement=DEBUG  
    log4j.logger.java.sql.PreparedStatement=DEBUG
    

    PS:关于日志详细见 其他 - 日志

    从 XML 配置文件中构建 SqlSessionFactory

    // 建议使用类路径下的资源文件进行配置
    String resource = "mybatisConfig.xml";
    // 可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置
    // Resources 的工具类,它包含一些实用方法,可使从 classpath 或其他位置加载资源文件更加容易
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    

    示例代码加载的是默认<environment> 构建的 SqlSessionFactory 实例,如果要加载其他 <environment> ,可选择其他 build() 方法

    SqlSessionFactory 的生命周期一般同应用程序的生命周期

    PS:亦可通过 Configuration 实例构建 SqlSessionFactory ,见 其它 - Configuration 实例构建 SqlSessionFactory

    从 SqlSessionFactory 中获取 SqlSession

    SqlSession session = sqlSessionFactory.openSession();
    try {
        HashMap hashMap = session.selectOne("selectUserById1", 1);
        System.out.println("username :" + hashMap.get("username"));
        System.out.println("password :" + hashMap.get("password"));
    } catch (Exception e) {
        session.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }
    

    SqlSessionFactory 实例的 openSession 方法可获取 SqlSession 实例

    SqlSessionFactory 实例的 openSession 方法可传进一个 boolean 值作为参数,当为 false 时,获取的 SqlSession 实例关闭自动提交,默认情况下是关闭自动提交

    SqlSession 实例有对应增删改查方法和提交事务( commit )、回滚( rollback )、关闭( close )方法

    SqlSession 的生命周期一般于相关 SQL 操作结束时结束

    上述例子中 SqlSession 实例的 selectOne 方法的第一个参数表示调用映射文件 UserMapper.xml 中 id 为 selectUserById1 的 <select> 元素,也可写全为"com.lian.mapper.UserMapper.selectUserById1",第二个参数为传入的参数。
    返回的类型在映射文件对应 id 为 selectUserById1 的 <select> 元素的属性 resultType 指定为 hashmap。则返回的 hashmap 的键值对以字段为key,以值为 value。
    亦可将自定义 JavaBean 作为 resultType 。创建 JavaBean:

    public class User {
    
        private Integer id;
        private String username;
        private String password;
        
        // 省略 getter 和 setter 方法...
    }
    

    修改映射文件 UserMapper.xml 中 id 为 selectUserById1 的 <select> 的属性 resultTyperesultType="com.lian.model.User"

    <?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.lian.mapper.UserMapper">
      <select id="selectUserById1" resultType="com.lian.model.User" parameterType="Integer">
        select * from tb_user where id = #{id}
      </select>
    </mapper>
    

    则调用方法可修改为:

    SqlSession session = sqlSessionFactory.openSession();
    try {
        User user = session.selectOne("selectUserById1", 1);
        System.out.println("username :" + user.getUsername());
        System.out.println("password :" + user.getPassword());
    } catch (Exception e) {
        session.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }
    

    此时返回结果将自动映射到 User 实例中为与数据库字段同名的属性。

    当然亦可为:

    public class User2 {
    
        private Integer id;
        private String user2_username;
        private String user2_password;
        
        // 省略 getter 和 setter 方法...
    }
    
    <select id="selectUserById3" resultType="com.lian.model.User2" parameterType="Integer">
        select id,username as user2_username, password as user2_password from tb_user where id = #{id}
      </select>
    

    PS:除了可以用 XML映射文件,还可用 Java 注解的形式进行配置和使用,见其它 - 配置和使用映射器接口

    其它

    Configuration 实例构建 SqlSessionFactory

    DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
    TransactionFactory transactionFactory = new JdbcTransactionFactory();
    Environment environment = new Environment("development", transactionFactory, dataSource);
    Configuration configuration = new Configuration(environment);
    configuration.addMapper(BlogMapper.class);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
    

    该例中,configuration 添加了一个映射器类(mapper class)。映射器类是 Java 类,它们包含 SQL 映射语句的注解从而避免了 XML 文件的依赖。不过,由于 Java 注解的一些限制加之某些 MyBatis 映射的复杂性,XML 映射对于大多数高级映射(比如:嵌套 Join 映射)来说仍然是必须的。有鉴于此,如果存在一个对等的 XML 配置文件的话,MyBatis 会自动查找并加载它(这种情况下, BlogMapper.xml 将会基于类路径和 BlogMapper.class 的类名被加载进来)。

    配置和使用映射器接口

    使用对于给定语句能够合理描述参数和返回值的接口(比如说UserMapper.class),这样不但可以执行更清晰和类型安全的代码,而且还不用担心易错的字符串字面值以及强制类型转换

    上文中的 XML 映射配置可以用映射器类替代为:

    // BlogMapper.class
    public interface BlogMapper {
      @Select("SELECT * FROM tb_user WHERE id = #{id}")
      User selectBlog(Integer id);
    }
    

    则可以如下进行使用:

    SqlSession session = sqlSessionFactory.openSession();
    try {
      BlogMapper mapper = session.getMapper(BlogMapper.class);
      Blog blog = mapper.selectBlog(101);
    } finally {
      session.close();
    }
    

    对于简单语句来说,注解使代码显得更加简洁,然而 Java 注解对于稍微复杂的语句就会力不从心并且会显得更加混乱。因此,如果需要做很复杂的事情,那么最好使用 XML 来映射语句

    或者,可以将两者结合

    // BlogMapper.class
    public interface BlogMapper {
      
      User selectBlog(Integer id);
    }
    

    这里,只需将 XML 映射文件的根元素 <mapper> 的属性 namespace 指向 BlogMapper 的位置,且 BlogMapper.class 中的方法名为对应的 id 名,传入参数和返回值也对应好即可

    调用方法同上,mybatis 会自动在 XML 映射文件中找到对应的 SQL 语句生成

    日志

    Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:

    • SLF4J
    • Apache Commons Logging
    • Log4j 2
    • Log4j
    • JDK logging

    具体选择哪个日志实现工具由MyBatis的内置日志工厂确定。按上文的顺序查找是否有相关的 jar 包,如果都没找到,则日志功能禁用

    或者在 mybatis 的 XML 配置文件中 <settings> 元素中配置 <setting name="logImpl" value="XXX"/> ,可选项有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING

    相关文章

      网友评论

          本文标题:Mybatis 的应用1 —— 简单例子

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