幽兰生空谷
--绝世独自开

Mybatis快速入门(十一)-MyBatis注解开发

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

结果

赞(3) 打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Mybatis快速入门(十一)-MyBatis注解开发》
文章链接:https://www.itheibai.com/archives/236
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途,网站会员捐赠是您喜欢本站而产生的赞助支持行为,仅为维持服务器的开支与维护,全凭自愿无任何强求。

评论 抢沙发

评论前必须登录!

 

养成“打赏”的好习惯,从我做起!

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册