Mybatis 的应用1 —— 简单例子

2017-10-17  本文已影响0人  WesleyLien

导入相关包

创建 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内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:

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

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

上一篇下一篇

猜你喜欢

热点阅读