MyBatis注解开发
使用注解开发方式,可以减少编写Mapper映射文件
@Insert: 实现新增
@Update: 实现更新
@Delete: 实现删除
@Select: 实现查询
@Result: 实现结果集封装
@Results: 可以与@Result一起使用,封装多个结果集
@One: 实现一对一结果集封装
@Many: 实现一对多结果集封装
简单的增删改查
这里可以直接删掉mapper文件,并在核心配置文件中删掉 加载映射文件 ,修改为 加载映射关系。
<!--加载映射关系-->
<mappers>
<!--扫描使用注解的类-->
<mapper class="com.itheibai.dao.UserDao"></mapper>
</mappers>
或者使用扫描包的方式
<!--加载映射关系-->
<mappers>
<!--扫描使用注解的类,所在的包-->
<package name="com.itheibai.dao"/>
</mappers>
修改UserDao接口文件
package com.itheibai.dao;
import com.itheibai.entity.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 UserDao{
@Select("select * from user")
public List<User> findAll();
@Select("select * from user where id = #{id}")
public List<User> findById(Integer id);
@Insert("insert into user values (#{id},#{username},#{password},#{birthday})")
public void insertUser(User user);
@Update("update user set username=#{username},password=#{password},birthday=#{birthday} where id=#{id}")
public void updateUser(User user);
@Delete("delete from user where id=#{id}")
public void deleteUser(Integer id);
}
测试
package com.itheibai.test;
import com.itheibai.dao.UserDao;
import com.itheibai.entity.User;
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 MyBatisTest {
private UserDao userDao;
/**
* 抽取重用代码
* @throws IOException
*/
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
userDao = sqlSession.getMapper(UserDao.class);
}
@Test
public void test5(){
userDao.deleteUser(8);
}
@Test
public void test4(){
User user = new User();
user.setId(8);
user.setUsername("嘿嘿");
user.setPassword("654321");
user.setBirthday(new Date());
userDao.updateUser(user);
}
@Test
public void test3(){
User user = new User();
user.setId(8);
user.setUsername("哈哈");
user.setPassword("654321");
user.setBirthday(new Date());
userDao.insertUser(user);
}
/**
* 根据id进行查询
* @throws IOException
*/
@Test
public void test2() throws IOException {
List<User> all = userDao.findById(1);
for (User user:all){
System.out.println(user);
}
}
/**
* 查询所有
* @throws IOException
*/
@Test
public void test1() throws IOException {
List<User> all = userDao.findAll();
for (User user:all){
System.out.println(user);
}
}
}
复杂映射开发
实体类继续沿用前面创建的User、Order、Role类
一对一查询
一对一查询需求:查询订单的同时,查询出属于哪个用户。
在OrderDao接口中创建方法,并用注解进行配置。
分表查询方式:
sql语句:
select * from orders
select * from user where id = 1
package com.itheibai.dao;
import com.itheibai.entity.Order;
import com.itheibai.entity.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 OrderDao {
@Select("select * from orders")
@Results({
@Result(id = true,property = "id",column = "id"),
@Result(property = "ordertime",column = "ordertime"),
@Result(property = "total",column = "total"),
@Result(
property = "user",//要封装的属性名称
column = "uid",//根据哪个字段去查询user表的数据
javaType = User.class,//要封装的实体类型
//select属性 代表查询哪个接口的方法获得数据
one = @One(select = "com.itheibai.dao.UserDao.findById"))
})
public List<Order> findAllOrder();
}
UserDao
package com.itheibai.dao;
import com.itheibai.entity.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserDao{
@Select("select * from user where id = #{id}")
public List<User> findById(Integer id);
}
两张表一起查询方式:
sql语句:
select * from orders o,user u where o.uid=u.id
package com.itheibai.dao;
import com.itheibai.entity.Order;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface OrderDao {
@Select("select * from orders o,user u where o.uid=u.id")
@Results({
@Result(column = "id",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"),
@Result(column = "birthday",property = "user.birthday")
})
List<Order> findAllOrder();
}
测试
package com.itheibai.test;
import com.itheibai.dao.OrderDao;
import com.itheibai.entity.Order;
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 MyBatisTest {
private OrderDao orderDao;
/**
* 抽取重用代码
* @throws IOException
*/
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
orderDao = sqlSession.getMapper(OrderDao.class);
}
@Test
public void test(){
List<Order> allOrder = orderDao.findAllOrder();
for (Order order:allOrder){
System.out.println(order);
}
}
}
结果

一对多查询
一对多需求:查询用户的同时,查询出用户都有哪些订单
使用分表查询:
sql语句:
select * from user
select * from orders where uid=1
修改OrderDao
@Select("select * from orders where uid = #{uid}") List<Order> findByUid(Integer uid);
修改UserDao
package com.itheibai.dao;
import com.itheibai.entity.User;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserDao{
@Select("select * from user")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(column = "birthday",property = "birthday"),
@Result(
column = "id",
property = "orderList",
javaType = List.class,
many = @Many(select = "com.itheibai.dao.OrderDao.findByUid")
)
})
List<User> findAll();
}
测试
package com.itheibai.test;
import com.itheibai.dao.UserDao;
import com.itheibai.entity.Order;
import com.itheibai.entity.User;
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 MyBatisTest {
private UserDao userDao;
/**
* 抽取重用代码
* @throws IOException
*/
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
userDao = sqlSession.getMapper(UserDao.class);
}
@Test
public void test(){
List<User> allOrder = userDao.findAll();
for (User user:allOrder){
String username = user.getUsername();
System.out.println(username);
List<Order> orderList = user.getOrderList();
for (Order order : orderList) {
System.out.println(order);
}
}
}
}
结果

多对多查询
需求:查询用户拥有哪些角色信息,角色对应哪些用户
sql语句:
select * from user
select * from role r,user_role ur where r.id=ur.role_id and user_id=1
修改RoleDao
package com.itheibai.dao;
import com.itheibai.entity.Role;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface RoleDao {
@Select("select * from role r,user_role ur where r.id=ur.role_id and user_id=#{uid} ")
List<Role> findByUid(Integer uid);
}
修改UserDao
package com.itheibai.dao;
import com.itheibai.entity.User;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserDao{
@Select("select * from user")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(column = "birthday",property = "birthday"),
@Result(
column = "id",
property = "roleList",
javaType = List.class,
many = @Many(select = "com.itheibai.dao.RoleDao.findByUid")
)
})
List<User> findAll();
}
测试
package com.itheibai.test;
import com.itheibai.dao.UserDao;
import com.itheibai.entity.Role;
import com.itheibai.entity.User;
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 MyBatisTest {
private UserDao userDao;
/**
* 抽取重用代码
* @throws IOException
*/
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
userDao = sqlSession.getMapper(UserDao.class);
}
@Test
public void test(){
List<User> allOrder = userDao.findAll();
for (User user:allOrder){
String username = user.getUsername();
System.out.println(username);
List<Role> roleList = user.getRoleList();
for (Role role : roleList) {
System.out.println(role);
}
}
}
}
结果

评论前必须登录!
注册