Mybatis简单入门

前言

  之前一直有直接使用Mybatis,但是没有细致的整理出来。长时间没有使用,细致的内容都忘记了。因此借此机会,从头开始整理,以后可以直接查看此次记录的内容。

Mybatis的介绍

  MyBatis是支持普通SQL查询存储过程高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.

  JDBC->dbutils(自动封装)->MyBatis->Hibernate

  参考官网文档介绍:http://www.mybatis.org/mybatis-3/zh/getting-started.html

准备工作

  依赖包

  从Mybatis的官网下载最新的jar,目前github上最新的是mybatis-3.4.6,并下载源码包导入project冲使用。下载mysql的驱动包:mysql-connector-java-5.1.7-bin.jar。下载log4j的jar:log4j-1.2.16.jar(目的是为了让mybatis能够输出日志,便于查看执行过程。此外,这次只使用Mybatis,因此在Java Project中进行验证,没有使用Maven进行管理包。

  数据库

1 create database mybatis;
2 use mybatis;
3 CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT);
4 INSERT INTO users(NAME, age) VALUES('Tom', 12);
5 INSERT INTO users(NAME, age) VALUES('Jack', 11);

  配置文件

  src下新建log4j配置文件log4j.properties

 1     log4j.properties\uFF0C
 2     log4j.rootLogger=DEBUG, Console
 3     #Console
 4     log4j.appender.Console=org.apache.log4j.ConsoleAppender
 5     log4j.appender.Console.layout=org.apache.log4j.PatternLayout
 6     log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
 7     log4j.logger.java.sql.ResultSet=INFO
 8     log4j.logger.org.apache=INFO
 9     log4j.logger.java.sql.Connection=DEBUG
10     log4j.logger.java.sql.Statement=DEBUG
11     log4j.logger.java.sql.PreparedStatement=DEBUG    log4j.properties\uFF0C
12     log4j.rootLogger=DEBUG, Console
13     #Console
14     log4j.appender.Console=org.apache.log4j.ConsoleAppender
15     log4j.appender.Console.layout=org.apache.log4j.PatternLayout
16     log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
17     log4j.logger.java.sql.ResultSet=INFO
18     log4j.logger.org.apache=INFO
19     log4j.logger.java.sql.Connection=DEBUG
20     log4j.logger.java.sql.Statement=DEBUG
21     log4j.logger.java.sql.PreparedStatement=DEBUG

 

  src新建mybatis的配置文件mybatis-config.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"/>
        <property name="username" value="root"/>
        <property name="password" value="admin"/>
      </dataSource>
    </environment>
  </environments>
 <!-- <mappers>
    <mapper resource="com/lion/test1/UserMapper.xml"/>
  </mappers>-->
</configuration>

 

验证

  1. 新建pojo User 属性 int id,String name,int age  //getter setter toString   注意:此处的属性需和数据库表字段保持一致,不然无法完成字段映射,后面讲解不一致时如何进行字段映射。
  2. 定义操作User对应users表的sql映射文件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.lion.test1.UserMapper">
      <select id="selectUser" parameterType="int" resultType="com.lion.pojo.User">
        select * from users where id = #{id}
      </select>
    </mapper>
  3. 在mybatis配置文件mybatis-config.xml中注册映射文件UserMapper.xml  (上面mybatis配置文件中注释掉内容,注意:注册映射文件使用的市文件的路径 / 而不是包路径 . )
    <mappers>
        <mapper resource="com/lion/test1/UserMapper.xml"/>
      </mappers>

    编写测试代码,执行映射文件中的查询

public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        // 加载Mybatis的配置文件 同时也会加载映射文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 使用XML文件构建sqlSessionFacory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 创建能执行映射文件中sql的sqlSession
        SqlSession session = sqlSessionFactory.openSession();
        // 映射sql的标识字符串
        String stament = "com.lion.test1.UserMapper.selectUser";
        User user = session.selectOne(stament, 1);
        System.out.println(user);
    }

    Console输出:

2018-05-16 23:48:27,714 [main] DEBUG [com.lion.test1.UserMapper.selectUser] - ==>  Preparing: select * from users where id = ? 
2018-05-16 23:48:27,867 [main] DEBUG [com.lion.test1.UserMapper.selectUser] - ==> Parameters: 1(Integer)
2018-05-16 23:48:27,956 [main] DEBUG [com.lion.test1.UserMapper.selectUser] - <== Total: 1
User [id=1, name=Tom, age=12]


解决字段名与实体类属性名不相同的冲突

  两种方式解决,一种在sql中定义查询字段别名,另一种则是在映射文件中使用resultMap进行字段映射

方式一: 通过在sql语句中定义别名
<select id="selectOrder" parameterType="int" resultType="_Order">
    select order_id id, order_no orderNo,order_price price from orders where order_id=#{id}
</select>
        
方式二: 通过<resultMap>
<select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap">
    select * from orders where order_id=#{id}
</select>

<resultMap type="_Order" id="orderResultMap">
    <id property="id" column="order_id"/>
    <result property="orderNo" column="order_no"/>
    <result property="price" column="order_price"/>
</resultMap>

 

posted @ 2018-05-16 23:52  蚂蚁分享圈  阅读(187)  评论(0编辑  收藏  举报