1. 程式人生 > >Mybatis實現增刪改查、模糊查詢、多條件查詢

Mybatis實現增刪改查、模糊查詢、多條件查詢

專案總體結構如下:

資料庫準備:在 資料庫dbmybatis中建立一張category的表,我錄入了幾條記錄方便測試,表字段結構如下圖:

1.建立好了表後使用idea新建一個Maven專案,pom.xml加入如下依賴:

<dependencies>
    <!--資料庫連線驅動-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.3.0</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

<!--配置編譯原始碼的jdk版本-->
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

2.resources下建立mybatis的配置檔案mybatis-config.xml。

設定別名是為了在具體的mapper.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>
    <typeAliases> <!--設定別名-->
        <package name="com.byh.pojo"/>
    </typeAliases>
    <!--連線資料庫-->
    <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/dbmybatis?characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="admin"/>
            </dataSource>
        </environment>
    </environments>
    <!--掃描mapper檔案-->
    <mappers>
        <mapper resource="mapper/CategoryMapper.xml"/>
    </mappers>

</configuration>

3.建立實體Category.java。

package com.byh.pojo;

public class Category {

    private int id;
    private String name;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Category{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

4.建立CategoryMapper.xml.其中編寫了對category表的增刪改查、模糊、多條件查詢的語句。

注意:namespace的值是自己專案中所對應的mapper.java介面。一定不能寫錯。

<?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.byh.mapper.CategoryMapper">

    <insert id="addCategory" parameterType="Category" >
            insert into category ( name ) values (#{name})
    </insert>
    <delete id="delCategory" parameterType="Category" >
            delete from category where id= #{id}
    </delete>
    <update id="updateCategory" parameterType="Category" >
            update category set name=#{name} where id=#{id}
    </update>
    <select id="getCategory" parameterType="_int" resultType="Category">
            select * from  category  where id= #{id}
    </select>
    <select id="listCategory" resultType="Category">
            select * from category
    </select>

    <select id="listCategoryByName"  parameterType="string" resultType="Category">
        select * from   category  where name like concat('%',#{0},'%')
   </select>
    <select id="listCategoryByIdAndName"  parameterType="map" resultType="Category">
        select * from   category  where id > #{id}  and name like concat('%',#{name},'%')
    </select>

</mapper>

5.然後寫對應的介面CategoryMapper 。

這裡介面中的方法有如下規定:

(1)方法名和對應的mapper配置檔案中查詢語句的id相同

(2)返回型別和resultType的型別一致,沒有就是void。

(3)方法中的引數列表中的型別和parameterType一致。

(4)mapper配置檔案的namespace對應mapper介面類的全路徑。

package com.byh.mapper;

import com.byh.pojo.Category;

import java.util.List;
import java.util.Map;

public interface CategoryMapper {

    void addCategory(Category category);

    void delCategory(Category category);

    void updateCategory(Category category);

    void getCategoryById(int id);

    List<Category> listCategory();

    List<Category> listCategoryByName(String name);

    List<Category> listCategoryByIdAndName(Map<String,Object> map);

}

6.建立測試。下面貼出了完整的增刪改查、模糊、多條件查詢的測試通過的程式碼:

import com.byh.mapper.CategoryMapper;
import com.byh.pojo.Category;
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.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Demo1 {

    private SqlSession session ;
    private CategoryMapper categoryMapper;
    @Before
    public void bef() throws IOException {
        //mybatis的配置檔案
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        //構建sqlSession的工廠
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //建立能執行對映檔案中sql的sqlSession
        session=sqlSessionFactory.openSession();
        categoryMapper = session.getMapper(CategoryMapper.class);
    }

    /**
     * 關閉SqlSession的方法
     * @param session
     */
    public void close(SqlSession session){
        session.commit();
        session.close();
    }
    /*
    1. 程式向找Mybatis找資料
    2. mybatis從資料庫中:
        (1).通過mybatis-config.xml 定位是哪個資料庫,
        (2).通過Category.xml執行對應的select語句
        (3).基於Category.xml把返回的資料庫記錄封裝在Category物件中
        (4).把多個Category物件裝在一個Category集合中
        這樣找到資料
    3. 返回一個Category集合
     */
    @Test  //查詢所有
    public void findAll() throws IOException {
        List<Category> cs=categoryMapper.listCategory();
        for (Category c : cs) {
            System.out.println(c.getName());
        }
    }
    @Test //增加
    public void add() throws IOException {
        Category c = new Category();
        c.setName("我是新增的分類");
        categoryMapper.addCategory(c);
        findAll();
        //提交和關閉,呼叫自定義方法
        close(session);
    }
    @Test //刪除
    public void del() throws IOException {
        findAll();
        System.out.println("------------刪除後-----------");
        Category c = new Category();
        c.setId(5);
        categoryMapper.delCategory(c);//這裡的5是一個數據庫存在的id
        findAll();
        close(session);
    }
    @Test //更新
    public void update() throws IOException {
        findAll();
        System.out.println("------------更新後-----------");
        Category c = session.selectOne("getCategory",2);//查詢單個物件
        c.setName("分類2被修改了a");
        categoryMapper.updateCategory(c);

        findAll();
        close(session);
    }
    @Test //模糊查詢
    public void like() throws IOException {
        findAll();
        System.out.println("------------模糊查詢-----------");
        //返回符合條件的結果集
        List<Category> cs=categoryMapper.listCategoryByName("了");
        for (Category c : cs) {
            System.out.println(c.getName());
        }
    }
    @Test //多條件
    public void moreLike() throws IOException {
        findAll();
        //這裡查詢的是id大於1並且分類的name中帶有數字2的記錄,為了直觀,建議資料庫多錄入幾條資料測試
        Map<String,Object> params = new HashMap<>();
        params.put("id", 1);
        params.put("name", "2");
        List<Category> cs = categoryMapper.listCategoryByIdAndName(params);
        System.out.println("------------多條件-----------");
        for (Category c : cs) {
            System.out.println(c.getName());
        }
    }

}