Mybatis 复习笔记01

本文只用于个人复习mybatis使用:

1 简单理解Mybatis

先看一下官方的定义:

  • Mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
    (也就是说,我们写代码时只需要关注sql语句和它的返回结果就行,其他的什么数据库连接,prepareStatement(sql)、executeUpdate()统统不用管)
  • 遵循ORM(Object Relational Mapping)对象关系映射。简单地说,就是把数据库表和实体类及实体类的属性对应起来,让我们可以通过操作实体类来操作数据库表。
    (可以理解为我在java中定义了实体类,数据库也有这个实体类对应的表,我就可以直接通过实体类来多表进行增删查改操作)

2 Mybatis配置

2.1 添加Mybatis依赖

在pom.xml找到 <dependencies> </dependencies>标签,在里面加入下面的子标签:

    <!-- mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.4</version>
    </dependency>

    <!-- 数据库驱动 -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.8</version>
    <scope>runtime</scope>
    </dependency>

    <!-- 日志 -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>

   <!-- JUnit 5 -->
    <dependency>
      <groupId>org.junit.platform</groupId>
      <artifactId>junit-platform-launcher</artifactId>
      <version>1.3.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>    <!-- 提供assertEquals等断言方法、@Test等测试注解 -->
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.3.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>   <!-- 提供@ParameterizedTest、@ValueSource、@CsvSource等 -->
      <artifactId>junit-jupiter-params</artifactId>
      <version>5.3.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.vintage</groupId>
      <artifactId>junit-vintage-engine</artifactId>
      <version>5.3.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>7.1.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>compile</scope>
    </dependency>

2.2 在resources文件下创建一个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">
<!-- mybatis主配置文件 -->
<configuration>

    <!-- 全局变量 -->
    <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/db_mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </properties>

    <!-- 配置环境 -->
    <environments default="mysql_config">
        <!-- 配置mysql环境 -->
        <environment id="mysql_config">
            <!-- 配置事务类型 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>

        </environment>
    </environments>

    <!-- 指定映射配置文件的位置 -->
    <mappers>
        <mapper resource="com/cimo/DAO/IUserDao.xml"></mapper>
    </mappers>

</configuration>

3 将User数据导入数据库

-- 创建数据库
CREATE DATABASE IF NOT EXISTS db_mybatis CHARACTER SET utf8;
-- 创建数据表
DROP TABLE IF EXISTS `user`;
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','女','北京');

4 创建java实体类:User.class

User.class

package com.cimo.Entity;

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

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

5 编写IUserDao定义CRUD操作,以及使用if、where、foreach标签

package com.cimo.DAO;

import com.cimo.Entity.*;
import com.cimo.Entity.queryVo;

import java.util.List;
import java.util.Queue;

/***
 *
 * @author 谭海山
 */
public interface IUserDao {
    /**
     * 查询所有用户
     * @return
     */
    List<User> findAll();

    /**
     * 保存用户
     * @param user
     */
    void saveUser(User user);

    /**
     * 更新用户
     */
    void updataUser(User user);

    /**
     * 根据ID删除用户
     */
    void delUser(Integer userId);

    /**
     * 根据ID查询
     */
    User findByid(Integer userid);

    /**
     *根据模糊查询用户定义信息
     */
    List<User> findByName(String username);

    /**
     * 查询总用户数
     */
    int findTotal();

    /**
     * 根据queryVo中的条件查询用户
     * @return
     */
    List<User> findUserByVo(queryVo vo);

    /**
     * 根据传入参数查询 使用if标签
     * @param user 查询的条件,可能是用户名,可能是地址,可能都有,可能都没有
     * @return
     */
    List<User> findUserByCondition_if(User user);

    /**
     * 根据传入参数查询 使用where标签
     * @param user
     * @return
     */
    List<User> findUserByCondition_where(User user);

    /**
     * 根据queryVo中提供的id集合,查询用户信息
     * @param vo
     * @return
     */
    List<User> findUserInIds(queryVo vo);
}

6 编写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.cimo.DAO.IUserDao">

    <!-- 查询所有 -->
    <select id="findAll" resultType="com.cimo.Entity.User">
        select * from user ;
    </select>

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="com.cimo.Entity.User">
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday) value (#{username},#{address},#{sex},#{birthday});
    </insert>

    <!-- 更新用户 -->
    <update id="updataUser" parameterType="com.cimo.Entity.User">
        update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
    </update>

    <!-- 删除用户 -->
    <delete id="delUser" parameterType="Integer">
        delete from user where id = #{id};
    </delete>

    <!-- 根据id查询用户信息 -->
    <select id="findByid" parameterType="integer" resultType="com.cimo.Entity.User">
        select * from user where id=#{id};
    </select>

    <!-- 根据username模糊查询 -->
    <select id="findByName" parameterType="String" resultType="com.cimo.Entity.User">
        select * from user where username like #{name}
    </select>

    <!-- 查询总用户数 -->
    <select id="findTotal" resultType="int">
        select count(id) from user
    </select>

    <!-- OGNL : 根据queryVo的条件查询用户 -->
    <select id="findUserByVo" parameterType="com.cimo.Entity.queryVo" resultType="com.cimo.Entity.User">
        select * from user where username like #{user.username}
    </select>

    <!-- 根据条件查询 if -->
    <select id="findUserByCondition_if" parameterType="com.cimo.Entity.User" resultType="com.cimo.Entity.User">
        select * from user where 1=1
        <if test="username != null">
            and username = #{username}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
    </select>

    <!-- 根据条件查询  where -->
    <select id="findUserByCondition_where" parameterType="com.cimo.Entity.User" resultType="com.cimo.Entity.User">
        select * from user
        <where>
            <if test="username != null">
                and username = #{username}
            </if>
            <if test="sex != null">
                and sex = #{sex}
            </if>
        </where>
    </select>

    <!-- 根据queryVo中的Id集合实现查询用户列表 -->
    <select id="findUserInIds" parameterType="com.cimo.Entity.queryVo" resultType="com.cimo.Entity.User">
        select * from user
        <where>
            <if test="ids != null and ids.size()>0">
            <!-- 遍历ids集合,将遍历中的每一个元素填充到括号中,并且用,号分割,从而达到id in (1,2,3,...)的效果 -->
                <foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>

</mapper>

7 编写mybatisTest.class测试类(使用Junit测试)

import com.cimo.DAO.IUserDao;
import com.cimo.Entity.*;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author cimo
 *
 * 测试mybatis的crud操作
 */
public class mybatisTest {

    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before         //用于在测试方法执行之前执行
    public void init()throws Exception{
        //1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("mybatis_config.xml");
        //2.获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.获取SqlSession对象、true自动提交事务
        sqlSession = factory.openSession(true);
        //4.获取dao的代理对象
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    @After              //用于在测试方法执行之后执行
    public void destroy()throws Exception{
        //提交事务
        //sqlSession.commit();
        //6.释放资源
        sqlSession.close();
        in.close();
    }

    @Test
    public void testFindAll() {
        List<User> users = userDao.findAll();
        for (User user : users){
            System.out.println(user);
        }
    }

    @Test
    public void testSaveUser(){
        User user = new User();
        user.setUsername("殷伟伟2");
        user.setAddress("广西南宁市");
        user.setSex("男");
        user.setBirthday(new Date());
        System.out.println("保存操作之前:");
        System.out.println(user);
        //保存
        userDao.saveUser(user);
        System.out.println("保存操作之后:");
        System.out.println(user);
    }

    @Test
    public void testUpdata(){
        User user = new User();
        user.setId(50);
        user.setUsername("殷飞龙");
        user.setAddress("南宁");
        user.setSex("女");
        user.setBirthday(new Date());
        //修改
        userDao.updataUser(user);

    }

    @Test
    public void testDel(){
        //删除
        userDao.delUser(45);
    }

    @Test
    public void testfindByid(){
        //通过id查找
        User user = userDao.findByid(50);
        System.out.println(user);
    }

    @Test
    public void testfindByName(){
        //通过username查找
        List<User> user = userDao.findByName("%王%");
        for ( User u : user){
            System.out.println(u);
        }
    }

    @Test
    public void testfindTotal(){
        //查询总用户数
        System.out.println(userDao.findTotal());
    }

    /**
     * 测试使用queryVo做为查询条件
     */
    @Test
    public void testfindByVo(){
        queryVo vo = new queryVo();
        User user = new User();
        user.setUsername("%王%");
        vo.setUser(user);
        List<User> users = userDao.findUserByVo(vo);
        for(User u : users){
            System.out.println(u);
        }
    }

    /**
     * 测试使用条件查询if
     */
    @Test
    public void testfindUserByCondition_if(){
        User user = new User();
        user.setUsername("老王");
        user.setSex("女");
        List<User> users = userDao.findUserByCondition_if(user);
        for(User u : users){
            System.out.println(u);
        }
    }

    /**
     * 测试使用条件查询 where
     */
    @Test
    public void testfindUserByCondition_where(){
        User user = new User();
        user.setUsername("老王");
        user.setSex("女");
        List<User> users = userDao.findUserByCondition_where(user);
        for(User u : users){
            System.out.println(u);
        }
    }

    /**
     *测试foreach标签的使用
     */
    @Test
    public void testfindUserInIds(){
        queryVo queryVo = new queryVo();
        List<Integer> list = new ArrayList<Integer>();
        list.add(41);
        list.add(42);
        list.add(46);
        queryVo.setIds(list);
        List<User> users = userDao.findUserInIds(queryVo);
        for(User u : users){
            System.out.println(u);
        }
    }

}

8 思路终结:

  1. 在pom.xml中引入依赖
  2. 创建mybatis_config.xml配置文件
  3. 创建数据库
  4. 编写User实体类,尽量与数据库中的字段名保持一致(不一致可以用resultMap映射)
  5. 编写IUserDao接口
  6. 编写IUserDao.xml配置文件,注意namespace、resultType都应该为全限定类名
  7. 在mybatis_config中指定mapper映射文件
  8. 编写测试类
  9. 其他:不喜欢用注解方式,这样感觉还是把sql语句写在java文件里了。

学习视频:
Mybatis教程IDEA版-4天-2018黑马SSM

学习资料:
Mybatis教程-实战看这一篇就够了

原创文章 31 获赞 30 访问量 7096

猜你喜欢

转载自blog.csdn.net/qq_41912398/article/details/105216405