前言
使用注解开发的方式,可以减少编写映射文件的步骤,从而使得开发步骤更加简洁。本文将对mybatis框架的注解开发方式进行相关描述。
一、利用注解开发方式完成对数据库的基本操作
使用注解方式完成数据库的增、删、改、查操作。
1.mybatis的常用注解
2.注解开发步骤
1).创建数据表
2).创建数据表对应的实体
3).创建Dao层接口,并完成相关方法及注解的编写
4).编写核心文件,需要加载映射关系
5).编写测试类进行测试
1).创建数据表user
2).创建数据表对应的实体
package com.itheima.domain;
public class User {
private int id;
private String username;
private String password;
//省略get、set方法
}
3).创建Dao层接口,并完成相关方法及注解的编写
package com.itheima.mapper;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
public interface UserMapper {
@Select(" select * from user1")
public List<User> findAll();
@Insert("insert into user1 values(#{id},#{username},#{password})")
public void add(User user);
@Update("update user1 set username=#{username},password=#{password} where id=#{id}")
public void update(User user);
@Delete("delete from user1 where id=#{id}")
public void delete(int i);
@Select(" select * from user1 where id=#{id}")
public User findById(int i);
}
4).编写核心文件,需要加载映射关系
与使用映射文件方式相同,不同的是不再加载映射文件,而是加载映射关系。
<mappers>
<!-- 指定接口所在的包 -->
<package name="com.itheima.mapper"/>
</mappers>
5).编写测试类进行测试
public class MyBatisTest {
private UserMapper mapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
mapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void test1() throws IOException {
List<User> userList = mapper.findAll();
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testAdd() throws IOException {
User a = new User();
a.setUsername("小李");
a.setPassword("dddd");
mapper.add(a);
List<User> userList = mapper.findAll();
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testUpdate() throws IOException {
User a = new User();
a.setId(5);
a.setUsername("小高");
a.setPassword("5523");
mapper.update(a);
List<User> userList = mapper.findAll();
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testDelete() throws IOException {
/* User a = new User();
a.setId(5);
a.setUsername("小高");
a.setPassword("5523");*/
int id = 6;
mapper.delete(id);
List<User> userList = mapper.findAll();
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testFindById() throws IOException {
/* User a = new User();
a.setId(5);
a.setUsername("小高");
a.setPassword("5523");*/
int id = 1;
User id1 = mapper.findById(id);
System.out.println(id1);
/*List<User> userList = mapper.findAll();
for (User user : userList) {
System.out.println(user);
}*/
}
}
二、多表操作
MyBatis的注解实现复杂映射开发:
1.一对一
user表中的一个对象对应多个order对象,
一个order对象对应一个user对象。
1.建立数据表
主表user:
从表orders:
2.建立实体类
user类:
package com.itheima.domain;
import java.util.List;
public class User {
private int id;
private String username;
private String password;
//省略get、set方法
Order类:
package com.itheima.domain;
import java.util.Date;
public class Order {
private int id;
private Date ordertime;
private double total;
private User user;
其中private User user 为orders的外键uid对应的实体对象。
3、创建Dao层接口,并完成相关方法及注解的编写
package com.itheima.mapper;
import com.itheima.domain.Order;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface OrderMapper {
/* //方法一:一次查询,两张表一起
@Select("select * ,o.id oid from orders o,user u where u.id = o.uid")
@Results({
@Result(column = "oid" ,property = "id"),
@Result(column = "ordertime" ,property = "ordertime"),
@Result(column = "total" ,property = "total"),
@Result(column = "uid" ,property = "user.id"),
@Result(column = "username" ,property = "user.username"),
@Result(column = "password" ,property = "user.password"),
})*/
//方法二:分两次查询,第一次查orders,然后利用uid来查user(调用user接口的方法来查询)
@Select("select * from orders ")
@Results({
@Result(column = "id" ,property = "id"),
@Result(column = "ordertime" ,property = "ordertime"),
@Result(column = "total" ,property = "total"),
@Result(
property = "user",//要封装的实体属性的名称,即Order中的private User user
column = "uid", //要根据哪个字段去查询user表的数据
javaType = User.class ,//要封装的实体类型,即结果的类型
//select属性,代表调用哪个接口的方法来获得数据
one=@One(select = "com.itheima.mapper.UserMapper.findById")
)
})
public List<Order> findAll();
@Select("select * from orders where uid=#{uid}")
public List<Order> findByUid(int i);
}
4.编写测试方法
package com.itheima.tset;
import com.itheima.domain.Order;
import com.itheima.domain.User;
import com.itheima.mapper.OrderMapper;
import com.itheima.mapper.UserMapper;
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.List;
public class MyBatisTest1 {
private OrderMapper mapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
mapper = sqlSession.getMapper(OrderMapper.class);
}
@Test
public void test1() throws IOException {
List<Order> all = mapper.findAll();
for (Order order : all) {
System.out.println(order);
}
}
}
2.一对多
查询一个user对象,对应多个order对象
创建Dao层接口,并完成相关方法及注解的编写
@Select("select * from user")
@Results({
@Result( id = true ,column = "id",property = "id"),//代表主键
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(
property = "orderList",//封装的实体属性的名称,即User中的private List<Order> orderList
column = "id",//要根据哪个字段去查询order表的数据
javaType = List.class,//要封装的实体类型,即结果的类型,结果为集合
//select属性,代表调用哪个接口的方法来获得数据
many = @Many(select = "com.itheima.mapper.OrderMapper.findByUid")
)
})
public List<User> findUserAndOrderAll();
编写测试方法
package com.itheima.tset;
import com.itheima.domain.Order;
import com.itheima.domain.User;
import com.itheima.mapper.OrderMapper;
import com.itheima.mapper.UserMapper;
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.List;
public class MyBatisTest2 {
private UserMapper mapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
mapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void test1() throws IOException {
List<User> userAndOrderAll = mapper.findUserAndOrderAll();
for (User user : userAndOrderAll) {
System.out.println(user);
}
}
}
3.多对多
1.建立数据表
数据表之间的多对多关系,需要借助中间表来实现。
已经有两个表,user和sys_role之间存在多对多关系,建立中间表sys_user_role,表中有两个外键:userId和orderId分别指向表user和sys_role.
表:sys_role
中间表:sys_user_role
2.建立实体类
Role类:
public class Role {
private int id;
private String roleName;
private String roleDesc;
User类:
public class User {
private int id;
private String username;
private String password;
private List<Role> roleList;
3.创建Dao层接口,并完成相关方法及注解的编写
@Select("select * from user")
@Results({
@Result(id = true,column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(property = "roleList",//要封装的实体属性的名称,即User中的private List<Role> roleList
column = "id",//要根据哪个字段去查询role表的数据
javaType = List.class,//要封装的实体类型,即结果的类型,结果为集合
//select属性,代表调用哪个接口的方法来获得数据
many = @Many(select = "com.itheima.mapper.RoleMapper.findByUid")
)
})
public List<User> findUserAndRoleAll();
public interface RoleMapper {
@Select("select * from sys_user_role ur,sys_role r where ur.roleId = r.id and ur.userId = #{uid}")
public List<Role> findByUid(int uid);
}
4.编写测试方法
package com.itheima.tset;
import com.itheima.domain.User;
import com.itheima.mapper.UserMapper;
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.List;
public class MyBatisTest3 {
private UserMapper mapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
mapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void test1() throws IOException {
List<User> userAndRoleAll = mapper.findUserAndRoleAll();
for (User user : userAndRoleAll) {
System.out.println(user);
}
}
}