手把手教你MyBatis註解開發

MyBatis註解式單表查詢

準備測試用的數據庫和表

-- 創建用戶表
CREATE TABLE USER(
	uid INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20),
	PASSWORD VARCHAR(20)
);

-- 添加數據
INSERT INTO USER(username,PASSWORD) VALUES('zhangsan','123');
INSERT INTO USER(username,PASSWORD) VALUES('lisi','777');
INSERT INTO USER(username,PASSWORD) VALUES('wangwu','666');

在這裏插入圖片描述

創建UserDao映射接口

創建一個UserDao接口,並在接口的方法上用註解綁定SQL語句就可以了

public interface UserDao {
    @Insert("INSERT INTO USER(username,PASSWORD) VALUES(#{username},#{password})")
    public void save(User user);

    @Delete("delete from user where uid=#{uid}")
    public void delete(Integer id);

    @Update("update user set username=#{username},password=#{password} where uid=#{uid}")
    public void update(User user);

    @Select("select * from user")
    public List<User> findAll();

    @Select("select * from user where uid=#{uid}")
    public User findUserById(Integer id);
}

註冊映射接口

在mybatis-config.xml的核心配置文件中註冊映射接口

<!--註冊映射文件-->
<mappers>
    <mapper class="com.itheima.dao.UserDao"/>
</mappers>

編寫測試類

public class UserDaoTest {
    private UserDao mapper = null;
    private SqlSession sqlSession =null;
    
    //@Before執行在每一個測試方法之前,這裏用於加載MyBatis核心配置文件
    @Before
    public void before() {
        SqlSessionFactory ssf = null;
        try {
            ssf = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
            sqlSession= ssf.openSession();
            mapper = sqlSession.getMapper(UserDao.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //測試添加功能
    @Test
    public void testAdd() {
        User user = new User();
        user.setUsername("張三");
        user.setPassword("abc");
        int count = mapper.save(user);
        System.out.println(count>0?"添加成功":"添加失敗");
    }

    //測試查詢功能
    @Test
    public void testSelect() {
        List<User> all = mapper.findAll();
        for (User user : all) {
            System.out.println(user);
        }
        System.out.println("----");
        User user = mapper.findUserById(3);
        System.out.println(user);
    }

    //測試修改功能
    @Test
    public void testUpdate() {
        User user = new User();
        user.setUsername("張三");
        user.setPassword("abc");
        user.setUid(1);
        int count = mapper.update(user);
        System.out.println(count>0?"修改成功":"修改失敗");
    }

    //測試刪除功能
    @Test
    public void testDelete() {
        int count = mapper.delete(3);
        System.out.println(count>0?"刪除成功":"刪除失敗");
    }

    //@After執行在每一個測試方法之後,這裏用於提交事務
    @After
    public void after(){
        sqlSession.commit();
    }
}

MyBatis註解式一對一查詢

身份證和人員就是一對一的關係,一個人有一張身份證,一張身份證也只屬於一個人。

在這裏插入圖片描述

準備測試用的數據庫和表

-- 身份證表
CREATE TABLE idcard(
	id INT PRIMARY KEY AUTO_INCREMENT,
	icode VARCHAR(18)
);

-- 添加身份證數據
INSERT INTO idcard(icode) VALUES('420923199111060616');
INSERT INTO idcard(icode) VALUES('422209199210010620');
INSERT INTO idcard(icode) VALUES('422209199512011119');

-- 人員表
CREATE TABLE person(
	pid INT PRIMARY KEY AUTO_INCREMENT,
	pname VARCHAR(20),
	page INT,
	idcard_id INT UNIQUE,
	CONSTRAINT idcard_id_fk FOREIGN KEY(idcard_id) REFERENCES idcard(id)
);

-- 添加人員信息
INSERT INTO USER(username,PASSWORD) VALUES('zhangsan','123');
INSERT INTO USER(username,PASSWORD) VALUES('lisi','777');
INSERT INTO USER(username,PASSWORD) VALUES('wangwu','666');

創建IdCard類

public class IdCard {
    private Integer id;
    private String icode;
	//此處省略get和set方法
    @Override
    public String toString() {
        return "Idcard{" +
                "id=" + id +
                ", icode='" + icode + '\'' +
                '}';
    }
}

創建Person類

public class Person {
    private Integer pid;
    private String pname;
    private Integer page;
    //個人身份證關聯
    private IdCard idcard;
    
	//此處省略get和set方法
    
    @Override
    public String toString() {
        return "Person{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                ", page=" + page +
                ", idcard=" + idcard +
                '}';
    }
}

創建IdCardDao映射接口

public interface IdCardDao {
    //根據id查詢一個身份證信息
    @Select("select * from idcard where id=#{id}")
    public IdCard findIdCardById(int id);
}

創建PersonDao映射接口

public interface PersonDao {
    //查詢一個人員的身份信息,一個人員只有一個身份信息
    @Select("select * from person")
    @Results({
            @Result(id=true,property = "pid",column = "pid"),
            @Result(property = "pname",column = "pname"),
            @Result(property = "page",column = "page"),
        	//把查詢到的結果賦值給Person對象的idcard
            @Result(property = "idcard",column = "idcard_id",
                    //查詢的結果封裝爲IdCard對象
                    javaType = IdCard.class,
                    //使用IdCardDao到的findIdCardById方法查詢:根據id查詢一個身份證信息
                    one = @One(select = "com.itheima.annodao.IdCardDao.findIdCardById"))
    })
    public List<Person> findAllPerson();
}

所用註解解釋

@Results: 用來封裝多個@Result
@Result: 表示實體類和表字段的映射關係
    id=true:表示這一列爲主鍵列
    property:表示實體類的屬性
    column:表示表字段列
    javaType = IdCard.class: 查詢結果的數據類型
    //表示一對一的查詢
    one = @One(select = "com.itheima.annodao.IdCardDao.findIdCardById")

註冊映射文件

<!--註冊映射文件-->
<mappers>
    <mapper class="com.itheima.annodao.PersonDao"/>
    <mapper class="com.itheima.annodao.IdCardDao"/>
</mappers>

編寫測試類

public class AnnoPersonAndIdCardTest {
    private PersonDao mapper = null;
    private SqlSession sqlSession =null;
    @Before
    public void before() {
        SqlSessionFactory ssf = null;
        try {
            ssf = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
            sqlSession= ssf.openSession();
            mapper = sqlSession.getMapper(PersonDao.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void test1(){
        List<Person> allPerson = mapper.findAllPerson();
        for (Person person : allPerson) {
            System.out.println(person);
        }
    }

    @After
    public void after(){
        sqlSession.commit();
    }
}

MyBatis註解式一對多查詢

用戶和訂單就是一對多的關係,一個用戶可以有多個訂單,但是一個訂單不能給多個用戶。
在這裏插入圖片描述

準備測試用的數據庫和表

-- 創建用戶表
CREATE TABLE USER(
	uid INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20),
	PASSWORD VARCHAR(20)
);

INSERT INTO USER(username,PASSWORD) VALUES('zhangsan','123');
INSERT INTO USER(username,PASSWORD) VALUES('lisi','777');
INSERT INTO USER(username,PASSWORD) VALUES('wangwu','666');

-- 創建訂單表
-- 訂單表關聯用戶表:一個訂單屬於一個用戶,但是一個用戶可以有多個訂單
CREATE TABLE orders(
	id INT PRIMARY KEY AUTO_INCREMENT, -- 主鍵
	ordersn VARCHAR(10), -- 訂單號
	user_id INT, -- 用戶id
	CONSTRAINT user_id FOREIGN KEY (user_id) REFERENCES USER(uid)
);
-- 添加訂單信息
INSERT INTO orders(ordersn,user_id) VALUES('2019081701',1);
INSERT INTO orders(ordersn,user_id) VALUES('2019081702',1);
INSERT INTO orders(ordersn,user_id) VALUES('2019081703',2);
INSERT INTO orders(ordersn,user_id) VALUES('2019081704',2);

創建User實體類

public class User {
    private Integer uid;
    private String username;
    private String password;
    //一個用戶可以有多個訂單
    private List<Orders> ordersList;
    
	//此處省略了get和set方法

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", ordersList=" + ordersList +
                '}';
    }
}

創建Orders實體類

package com.itheima.domain;

import java.util.List;

public class Orders {
    private int id;
    private String ordersn;
    
	//此處省略了get和set方法
    
    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", ordersn='" + ordersn + '\'' +
                ", productList=" + productList +
                '}';
    }
}

創建OrdersDao映射接口

public interface OrdersDao {
	//查詢一個用戶的多個訂單信息
    @Select("select * from orders where user_id=#{user_id}")
    public List<Orders> findOrdersByUid(int id);
}

創建UserDao映射接口

public interface UserDao {
	//查詢所有的用戶的多個訂單信息
    @Select("select * from user")
    //每一個用戶信息包括(uid,username,password)
    //每一個訂單信息爲List<Orders>,從OrdersDao的findOrdersByUid方法獲取
    @Results({
            @Result(id = true,property = "uid",column = "uid"),
            @Result(property = "username",column = "username"),
            @Result(property = "password",column = "password"),
            @Result(property = "ordersList",column = "uid",
                    javaType = List.class,
                    many = @Many(select = "com.itheima.annodao.OrdersDao.findOrdersByUid")
            )
    })
    public List<User> findAllUserAndOrders();
}

註冊映射文件

<!--註冊映射文件-->
<mappers>
    <mapper class="com.itheima.annodao.UserDao"/>
    <mapper class="com.itheima.annodao.OrdersDao"/>
</mappers>

編寫測試類

public class UserAndOrdersDaoTest {
    private UserDao mapper = null;
    private SqlSession sqlSession =null;
    
    @Before
    public void before() {
        SqlSessionFactory ssf = null;
        try {
            ssf = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
            sqlSession= ssf.openSession();
            mapper = sqlSession.getMapper(UserDao.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void test1(){
        List<User> allUser = mapper.findAllUserAndOrders();
        for (User user : allUser) {
            System.out.println(user);
        }
    }

    @After
    public void after(){
        sqlSession.commit();
    }
}

MyBatis註解多對多查詢

商品和訂單就是多對多的關係,一個訂單可以有多個商品,一個商品可以屬於多個訂單。
在這裏插入圖片描述

準備測試用的數據庫和表

-- 創建用戶表(前面創建過)
CREATE TABLE USER(
	uid INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20),
	PASSWORD VARCHAR(20)
);
-- 添加產品信息(前面添加過)
INSERT INTO USER(username,PASSWORD) VALUES('zhangsan','123');
INSERT INTO USER(username,PASSWORD) VALUES('lisi','777');
INSERT INTO USER(username,PASSWORD) VALUES('wangwu','666');

/*下面的表示新創建的表*/
-- 創建訂單表
CREATE TABLE orders(
	id INT PRIMARY KEY AUTO_INCREMENT, -- 主鍵
	ordersn VARCHAR(10), -- 訂單號
	user_id INT, -- 用戶id
	CONSTRAINT user_id FOREIGN KEY (user_id) REFERENCES USER(uid)
);
-- 添加訂單信息
INSERT INTO orders(ordersn,user_id) VALUES('2019081701',1);
INSERT INTO orders(ordersn,user_id) VALUES('2019081702',1);
INSERT INTO orders(ordersn,user_id) VALUES('2019081703',2);
INSERT INTO orders(ordersn,user_id) VALUES('2019081704',2);

-- 創建商品表
CREATE TABLE product(
	id INT PRIMARY KEY AUTO_INCREMENT,
	pname VARCHAR(20),
	price DOUBLE
);

-- 添加商品信息
INSERT INTO product(pname,price) VALUES('小米9',2799);
INSERT INTO product(pname,price) VALUES('魅族',3699);
INSERT INTO product(pname,price) VALUES('Iphone11',7999);
INSERT INTO product(pname,price) VALUES('OPPO9',3789);
INSERT INTO product(pname,price) VALUES('華爲P30',5699);
INSERT INTO product(pname,price) VALUES('堅果3',3466);

-- 訂單和商品的中間表(訂單詳情表)
CREATE TABLE orders_detail(
	id INT PRIMARY KEY AUTO_INCREMENT,
	orders_id INT,
	product_id INT,
	
	CONSTRAINT orders_id FOREIGN KEY (orders_id) REFERENCES orders(id),
	CONSTRAINT product_id FOREIGN KEY (product_id) REFERENCES product(id)
);

-- 添加訂單信息
INSERT INTO orders_detail(orders_id,product_id) VALUES(1,1);
INSERT INTO orders_detail(orders_id,product_id) VALUES(1,2);
INSERT INTO orders_detail(orders_id,product_id) VALUES(3,2);
INSERT INTO orders_detail(orders_id,product_id) VALUES(3,3);
INSERT INTO orders_detail(orders_id,product_id) VALUES(2,3);
INSERT INTO orders_detail(orders_id,product_id) VALUES(2,4);
INSERT INTO orders_detail(orders_id,product_id) VALUES(4,3);
INSERT INTO orders_detail(orders_id,product_id) VALUES(4,1);

創建Pruduct類

package com.itheima.domain;
import java.util.List;
public class Product {
    private int pid;
    private String pname;
    private Double price;
    //一個商品可以被多個訂單引用
    private List<Orders> ordersList;
	//此處省略的get和set方法
   
    @Override
    public String toString() {
        return "Product{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                ", price=" + price +
                ", ordersList=" + ordersList +
                '}';
    }
}

創建Orders類

package com.itheima.domain;

import java.util.List;

public class Orders {
    private int id;
    private String ordersn;
    //一個訂單也可以包含多個商品
    private List<Product> productList;
    //此處省略了get和set方法
    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", ordersn='" + ordersn + '\'' +
                ", productList=" + productList +
                '}';
    }
}

創建ProductDao映射接口

public interface ProductDao {
    //查詢product表、orders表、orders_detail表(中間表)
    //查詢一個訂單的多個產品信息
    @Select("SELECT * FROM product p, orders_detail od WHERE p.id=od.product_id and od.orders_id=#{orders_id}")
    public List<Product> findAllProdcutByOrderId(int id);
}

創建OrdersDao映射接口

public interface OrdersDao {
    //查詢每一個訂單的多個產品信息
    @Select("select * from orders")
    @Results({
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "ordersn",column = "ordersn"),
            @Result(property = "productList",column = "id",
                javaType = List.class,
                    many = @Many(select = "com.itheima.annodao.ProductDao.findAllProdcutByOrderId")
            )
    })
    public List<Orders> findOrdersAndProducts();
}

註冊映射文件

<!--註冊映射文件-->
<mappers>
    <mapper class="com.itheima.annodao.ProductDao"/>
    <mapper class="com.itheima.annodao.OrdersDao"/>
</mappers>

編寫測試類

public class AnnoOrdersAndProductTest {

    private OrdersDao mapper = null;
    private SqlSession sqlSession =null;
    @Before
    public void before() {
        SqlSessionFactory ssf = null;
        try {
            ssf = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
            sqlSession= ssf.openSession();
            mapper = sqlSession.getMapper(OrdersDao.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void test1(){
        List<Orders> allOrders = mapper.findOrdersAndProducts();
        for (Orders orders : allOrders) {
            System.out.println(orders);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章