Mybatis架構注解開發
- 1 MyBatis的常用注解
- 2 MyBatis的增删改查
-
- 2.1 使用xml實作curd
- 2.2 使用注解實作curd
- 3 MyBatis的注解實作複雜映射開發
-
- 3.1 一對一的注解開發
- 3.2 一對多的注解開發
- 3.3 多對多的注解開發
1 MyBatis的常用注解
@Insert:實作新增
@Update:實作更新
@Delete:實作删除
@Select:實作查詢
@Result:實作結果集封裝
@Results:可以與@Result 一起使用,封裝多個結果集
@One:實作一對一結果集封裝
@Many:實作一對多結果集封裝
2 MyBatis的增删改查
2.1 使用xml實作curd
public interface UserMapper {
public void save(User user);
public void update(User user);
public void delete(int id);
public User findById(int id);
public List<User> findAll();
}
<?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="lifeilin.mapper.UserMapper">
<insert id="save" parameterType="lifeilin.domain.User">
insert into user
values (#{id}, #{username}, #{password}, #{birthday})
</insert>
<update id="update" parameterType="lifeilin.domain.User">
update user
set username = #{username},
password = #{password}
where id = #{id}
</update>
<delete id="delete" parameterType="int">
delete
from user
where id = #{id}
</delete>
<select id="findById" parameterType="int" resultType="lifeilin.domain.User">
select *
from user
where id = #{id}
</select>
<select id="findAll" resultType="lifeilin.domain.User">
select *
from user
</select>
</mapper>
import lifeilin.domain.User;
import lifeilin.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.Date;
import java.util.List;
public class MapperTest {
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 testSave() {
User user = new User();
user.setId(11);
user.setUsername("觀音");
user.setPassword("78999");
user.setBirthday(new Date());
mapper.save(user);
}
@Test
public void testUpdate() {
User user = new User();
user.setId(10);
user.setUsername("觀音");
user.setPassword("78999");
user.setBirthday(new Date());
mapper.update(user);
}
@Test
public void testDelete() {
mapper.delete(11);
}
@Test
public void testFindById() {
User u = mapper.findById(9);
System.out.println(u);
}
@Test
public void testFindAll() {
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
}
}
}
2.2 使用注解實作curd
删除映射關系檔案(UserMapper.xml),在核心配置檔案(sqlMapConfig.xml)種删除加載映射檔案,添加加載映射關系。
<!-- <!– 加載映射檔案–>-->
<!-- <mappers>-->
<!-- <mapper resource="lifeilin.mapper\UserMapper.xml"></mapper>-->
<!-- </mappers>-->
<!-- 加載映射關系 -->
<mappers>
<!-- 指定接口所在的包-->
<package name="lifeilin.mapper"/>
</mappers>
public interface UserMapper {
@Insert("insert into user values (#{id}, #{username}, #{password}, #{birthday})")
public void save(User user);
@Update("update user set username = #{username}, password = #{password} where id = #{id}")
public void update(User user);
@Delete("delete from user where id = #{id}")
public void delete(int id);
@Select("select * from user where id = #{id}")
public User findById(int id);
@Select("select * from user")
public List<User> findAll();
}
3 MyBatis的注解實作複雜映射開發
3.1 一對一的注解開發
一對一查詢的需求:查詢一個訂單,與此同時查詢出該訂單所屬的使用者
在接口中使用注解配置:
第一種配置方法:
public interface OrderMapper {
@Select("SELECT *,`order`.id oid FROM `order` ,`user` WHERE `order`.uid = `user`.id;")
@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")
})
public List<Order> findAll();
}
第二種配置方法:
public interface OrderMapper {
@Select("SELECT * FROM `order`")
@Results({
@Result(column = "id", property = "id"),
@Result(column = "ordertime", property = "ordertime"),
@Result(column = "total", property = "total"),
@Result(
property = "user", //要封裝的屬性名稱
column = "uid", //根據哪個字段去查詢user表
javaType = User.class, //要封裝的實體類型
//select屬性 代表查詢哪個接口的方法獲得資料
one = @One(select = "lifeilin.mapper.UserMapper.findById")
)
})
public List<Order> findAll();
}
測試:
3.2 一對多的注解開發
@Select("select * from user")
@Results({
@Result(id = true, property = "id", column = "id"),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property = "birthday", column = "birthday"),
@Result(property = "orders", column = "id",
javaType = List.class,
many = @Many(select =
"lifeilin.mapper.OrderMapper.findByUid"))
})
List<User> findAllUserAndOrder();
3.3 多對多的注解開發
@Select("select * from user")
@Results({
@Result(id = true, property = "id", column = "id"),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property = "roleList", column = "id",
javaType = List.class,
many = @Many(select =
"lifeilin.mapper.RoleMapper.findByUid")
)
})
List<User> findUserAndRole();