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教程-實戰看這一篇就夠了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章