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);
}
}
}