实验四:MyBatis的注解开发
一、实验目的
1.掌握基于注解的单表增删改查
2.熟悉基于注解的一对一关联查询
3.熟悉基于注解的一对多关联查询
4.熟悉基于注解的多对多关联查询
二、实验内容
1.操作MyBatis注解实现修改操作
2.MyBatis注解实现简单查询
3.MyBatis注解实现一对一关联查询
4.MyBatis注解实现一对多查询
5.MyBatis注解实现多对多查询
三、实验步骤
1.操作MyBatis注解实现修改操作
(1)数据准备
使用mybatis数据库,创建tb_worker表并存入数据
USE mybatis;
CREATE TABLE tb_worker(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32),
age INT,
sex VARCHAR(8),
worker_id INT UNIQUE
);
INSERT INTO tb_worker(name,age,sex,worker_id)VALUES('孙昊楠1',32,'男',1001);
INSERT INTO tb_worker(name,age,sex,worker_id)VALUES('孙昊楠2',29,'男',1002);
INSERT INTO tb_worker(name,age,sex,worker_id)VALUES('孙昊楠3',26,'男',1003);
(2)插入操作
① 创建POJO实体类
在src\main\java文件夹中创建com\sun\pojo文件夹,在文件夹中创建Worker.java
package com.sun.pojo;
public class Worker {
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getWorker_id() {
return worker_id;
}
public void setWorker_id(String worker_id) {
this.worker_id = worker_id;
}
private Integer id;
private String name;
private Integer age;
private String sex;
private String worker_id;
@Override
public String toString() {
return "员工id:"+ id +", 员工姓名:"+ name +", 年龄:" + age + ", 性别:" + sex + ", 工号:" + worker_id;
}
}
② 创建接口
在src\main\java文件夹中创建com\sun\dao文件夹,在文件夹中创建WorkerMapper.java
package com.sun.dao;
导入相关包...
public interface WorkerMapper {
@Insert("insert into tb_worker(name,age,sex,worker_id)"
+"values(#{name},#{age},#{sex},#{worker_id})")
int insertWorker(Worker worker);
}
③ 修改mybatis-config.xml文件
在mybatis-config.xml文件的<mappers>元素下引入WoekMapper接口
<mapper class="com.sun.dao.WorkerMapper"/>
④ 创建测试类
在src\test\java文件夹下创建Test文件夹并创建MyBatisTest.java文件
@Test
public void insertWorkerTest() {
SqlSession session = MybatisUtils.getSession();
Worker worker = new Worker();
worker.setId(4);
worker.setName("孙昊楠4");
worker.setAge(36);
worker.setSex("男");
worker.setWorker_id("1004");
WorkerMapper mapper = session.getMapper(WorkerMapper.class);
int result = mapper.insertWorker(worker);
if (result > 0) {
System.out.println("成功插入" + result + "条数据");
} else {
System.out.println("插入数据失败");
}
System.out.println(worker.toString());
session.commit();
session.close();
}
运行结果:
(3)修改操作:
①修改WorkerMapper.java文件
在WorkerMapper.java接口文件中添加更新的方法,并在方法上添加@updata注解
@Update("update tb_worker set name = #{name},age = #{age} "
+"where id = #{id}")
int updateWorker(Worker worker);
②编写测试类
在MyBatisTest.java文件中添加:
@Test
public void updateWorkerTest() {
SqlSession session = MybatisUtils.getSession();
Worker worker = new Worker();
worker.setId(4);
worker.setName("孙昊楠5");
worker.setAge(28);
WorkerMapper mapper = session.getMapper(WorkerMapper.class);
int result = mapper.updateWorker(worker);
if (result > 0) {
System.out.println("成功更新" + result + "条数据");
} else {
System.out.println("更新数据失败");
}
System.out.println(worker.toString());
session.commit();
session.close();
}
运行结果:
(4)删除操作:
①修改WorkerMapper.java文件
在WorkerMapper.java接口文件中添加删除的方法,并在方法上添加@Delete注解
@Delete("delete from tb_worker where id = #{id}")
int deleteWorker(int id);
②编写测试类
在MyBatisTest.java文件中添加:
@Test
public void deleteWorkerTest() {
SqlSession session = MybatisUtils.getSession();
WorkerMapper mapper = session.getMapper(WorkerMapper.class);
int result = mapper.deleteWorker(4);
if (result > 0) {
System.out.println("成功删除" + result + "条数据");
} else {
System.out.println("删除数据失败");
}
session.commit();
session.close();
}
运行结果:
2.MyBatis注解实现简单查询
(1)修改WorkerMapper.java文件
在WorkerMapper.java接口文件中添加查询的方法,并在方法上添加@Select注解
@Select("select * from tb_worker where id = #{id}")
Worker selectWorker(int id);
(2)编写测试类
在MyBatisTest.java文件中添加:
@Test
public void findWorkerByIdTest() {
SqlSession session = MybatisUtils.getSession();
WorkerMapper mapper = session.getMapper(WorkerMapper.class);
Worker worker = mapper.selectWorker(1);
System.out.println(worker.toString());
session.close();
}
运行结果:
3.MyBatis注解实现一对一查询
(1)数据准备
使用实验三的tb_idcard表和tb_person表
(2)创建POJO实体类
使用实验三的IdCard类和Person类
(3)创建IdCardMapper接口
在src\main\java\com\sun\dao文件夹中创建IdCardMapper.java
package com.sun.dao;
import com.sun.pojo.IdCard;
import org.apache.ibatis.annotations.Select;
public interface IdCardMapper {
@Select("select * from tb_idcard where id=#{id}")
IdCard selectIdCardById(int id);
}
(4)创建PersonMapper接口
在src\main\java\com\sun\dao文件夹中创建PersonMapper.java
package com.sun.dao;
导入相关包...
public interface PersonMapper {
@Select("select * from tb_person where id=#{id}")
@Results({@Result(column = "card_id", property = "card",
one = @One(select =
"com.sun.dao.IdCardMapper.selectIdCardById"))})
Person selectPersonById(int id);
}
(5)修改mybatis-config.xml文件
在mybatis-config.xml文件的<mappers>元素下引入IdCardMapper接口和 PersonMapper接口
<mapper class="com.sun.dao.IdCardMapper"/>
<mapper class="com.sun.dao.PersonMapper"/>
(6)创建测试类
在MyBatisTest.java文件中添加:
@Test
public void selectPersonByIdTest() {
SqlSession session = MybatisUtils.getSession();
PersonMapper mapper = session.getMapper(PersonMapper.class);
Person person = mapper.selectPersonById(1);
System.out.println(person.toString());
session.close();
}
运行结果:
4.MyBatis注解实现一对多关联查询
(1)数据准备
使用实验三的tb_user表和tb_orders表
(2)创建POJO实体类
使用实验三的Users类和Orders类
(3)创建OrdersMapper接口
在src\main\java\com\sun\dao文件夹中创建OrdersMapper.java
package com.sun.dao;
导入相关包...
public interface OrdersMapper {
@Select("select * from tb_orders where user_id=#{id} ")
@Results({@Result(id = true, column = "id", property = "id"),
@Result(column = "number", property = "number")
})
List<Orders> selectOrdersByUserId(int user_id);
}
(4)创建UsersMapper接口
在src\main\java\com\sun\dao文件夹中创建UsersMapper.java
package com.sun.dao;
导入相关包...
public interface UsersMapper {
@Select("select * from tb_user where id=#{id} ")
@Results({@Result(id = true, column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "address", property = "address"),
@Result(column = "id", property = "ordersList",
many = @Many(select =
"com.sun.dao.OrdersMapper.selectOrdersByUserId"))})
Users selectUserById(int id);
}
(5)修改mybatis-config.xml文件
在mybatis-config.xml文件的<mappers>元素下引入OrdersMapper接口和UsersMapper接口
<mapper class="com.sun.dao.OrdersMapper"/>
<mapper class="com.sun.dao.UsersMapper"/>
(6)创建测试类
在MyBatisTest.java文件中添加:
@Test
public void selectUserByIdTest() {
SqlSession session = MybatisUtils.getSession();
UsersMapper mapper = session.getMapper(UsersMapper.class);
Users users = mapper.selectUserById(1);
System.out.println(users.toString());
session.close();
}
运行结果:
5.MyBatis注解实现多对多查询
(1)创建ProductMapper接口
在src\main\java\com\sun\dao文件夹中创建ProductMapper.java
package com.sun.dao;
导入相关包...
public interface ProductMapper {
@Select("select * from tb_product where id in (select product_id from " +
"tb_ordersitem where orders_id = #{id} )")
List<Product> selectProductByOrdersId(int orders_id);
}
(2)修改OrdersMapper接口
在OrdersMapper.java中添加方法
@Select("select * from tb_orders where id=#{id} ")
@Results({@Result(id = true, column = "id", property = "id"),
@Result(column = "number", property = "number"),
@Result(column = "id", property = "productList",
many = @Many(select =
"com.sun.dao.ProductMapper.selectProductByOrdersId"))})
Orders selectOrdersById(int id);
(3)修改mybatis-config.xml文件
在mybatis-config.xml文件的<mappers>元素下引入ProductMapper接口
<mapper class="com.sun.dao.ProductMapper"/>
(4)编写测试类
在MyBatisTest.java文件中添加:
@Test
public void selectOrdersByIdTest() {
SqlSession session = MybatisUtils.getSession();
OrdersMapper mapper = session.getMapper(OrdersMapper.class);
Orders orders = mapper.selectOrdersById(3);
System.out.println(orders.toString());
session.close();
}
运行结果: