mybatis入门案例

181 阅读4分钟

声明

之前学javaweb心态爆炸,觉得很烦躁。就直接上框架了,果然还是上点有挑战性的内容更能激发自己的学习能力。如果按部就班的学习效率不高的话,我也推荐大家可以尝试自上而下的学习方法,学以致用!

另外,我观看的是黑马的mybatis教学视频,感兴趣的同学可以去看视频内容。这一部分视频不长,讲得很清楚,推荐观看。

0.案例需要准备的数据库内容

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` datetime default NULL COMMENT '生日',
  `sex` char(1) default NULL COMMENT '性别',
  `address` varchar(256) default NULL COMMENT '地址',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),(45,'传智播客','2018-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小马宝莉','2018-03-08 11:44:00','女','北京修正');

1.mybatis简要介绍

mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身

mybatis 通过 xml注解的方式 将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

2.mybatis框架快速入门

2.1 mybatis框架开发的准备

2.1.1 去官网下载mybatis框架

这里就不赘述如何去下载了。另外,官方文档还是很有用的,入门案例中用到一些xml配置文件,里面的内容可以去官方文档那里直接copy,然后进行修改。

2.2 搭建mybatis开发环境

2.2.1 创建maven工程

2.2.2 引入依赖

这里的内容其实就是之前在javaweb那里所学的引入jar包。但是在idea中的maven工程引入jar包非常方便。用上就会爱上! 在 pom.xml文件中的 <projects> </project> 便签中引入依赖

 <dependencies>
     <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
         <version>3.4.5</version>
     </dependency>
     
     <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.10</version>
         <scope>test</scope>
     </dependency>
     
     <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>5.1.6</version>
         <scope>runtime</scope>
     </dependency>
     
     <dependency>
         <groupId>log4j</groupId>
         <artifactId>log4j</artifactId>
         <version>1.2.12</version>
     </dependency>
 </dependencies>

值得注意的是:在写了上述代码之后最好右键pom.xml,点击maven-->reload project 另外要在resource文件夹下面创建一个log4j.properties

image.png

# 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

2.2.3 编写实体类

对应数据库中的表,在scr下(具体看自己的包结构,下面图示只是一个例子)编写实体类。

image.png

2.2.4 编写持久层接口

接口位置结构如上图。

package com.zhouman.dao;

import com.zhouman.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;

/**
 * 用户的持久层接口
 */
public interface IUserDao {
    /**
     * 查询所有
     * @return
     */
    @Select("select * from user")
    List<User> findAll();
}

看到这里,可能就会有同学想说,下一步是不是需要编写接口的实现类。但是mybatis框架的好处就是不需要那么做,只需要专注于sql语句即可。

2.2.5 编写持久层接口的映射文件IUserDao.xml

实现 IUserDao 接口的方法这里总结两种,这是其中之一,另一种是使用注释的方法。

IUserDao.xml 的编写要求:

  1. 创建位置:必须和持久层接口在相同的包中(区别在于它在resource下)
  2. 名称:与持久层接口,后缀名是.xml

image.png

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.zhouman.dao.IUserDao">

    <!--配置查询所有-->
    <select id="findAll" resultType="com.zhouman.domain.User">
        select * from user
    </select>
</mapper>

下面是去官方文档复制的内容: “入门-->探究已映射的 SQL 语句” image.png

2.2.6 编写SqlMapConfig.xml配置文件

这是个全局配置文件。同样的模板也是可以去官方文档中copy,然后自己修改。

<?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">
        <environment id="mysql">
            <!-- 配置事务的类型 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
    <mappers>
        <mapper resource="com/zhouman/dao/IUserDao.xml"/>
    </mappers>


</configuration>

下面是去官方文档复制的内容: “入门-->从 XML 中构建 SqlSessionFactory” image.png

2.2.7 编写测试类

image.png

使用框架的方便之处在于不用编写接口的实现类,需要通过SqlSession创建Dao接口的代理对象,然后执行方法即可!

/**
 * mybatis的入门案例
 */
public class MybatisTest {
    /**
     * 入门案例
     * @param args
     */
    public static void main(String[] args) throws Exception {
        //1.读取配置文件 SqlMapConfig.xml    注意 /
        InputStream in = Resource.class.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();
    }
}

3 使用注解的方式实现接口的方法

大多数地方都是一样的,下面直接讲需要修改的部分。

第一个需要修改的地方:修改 SqlMapConfig.xml

image.png

    <mappers>
        <mapper class="com.zhouman.dao.IUserDao"/>
    </mappers>

第二个需要修改的地方:不需要持久层接口的映射文件IUserDao.xml

第三个需要修改的地方:持久层接口文件

方法体上添加注释

/**
 * 用户的持久层接口
 */
public interface IUserDao {
    /**
     * 查询所有
     * @return
     */
    @Select("select * from user")
    List<User> findAll();
}