Mybatis全网最详细教程(纯注解编程),包看包会!

Mybatis的注解开发

说明:因为是纯注解,所以没有任何xml配置文件,只需要写一个before()方法,将配置代码放入即可,这里面的配置相当于sqlMapConfig.xml配置文件,后面直接调用即可,接口对应的xml不要,直接在接口上面注解sql语句就ok。如下

 private UserMapper sm;
    @Before
    public void before() throws IOException {
        //建立数据源
        DruidDataSource ds = new DruidDataSource();
        Properties properties = new Properties();
        //ds.setDriverClassName();
        //ds.setUrl();
        //ds.setUsername();
        //ds.setPassword(); 这四行相当于properties文
        //作者这里使用的properties数据文件,也可以直接走编程方式
        properties.load(Resources.getResourceAsStream("jdbc.properties"));
        ds.setConnectProperties(properties);
        //相当于sql的核心配置文件
        JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("environment", jdbcTransactionFactory, ds);
        Configuration configuration = new Configuration(environment);
        configuration.addMappers("cn.seim.mapper");
        //添加分页插件(可用可不用)
        // PageInterceptor pi = new PageInterceptor();
        //  configuration.addInterceptor(pi);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //使用哪个接口就根据实际情况调用就OK
        sm = sqlSession.getMapper(UserMapper.class);//测试User表使用
    }

1.一对一查询

1.1 MyBatis的常用注解

这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper
映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@One:实现一对一结果集封装
@Many:实现一对多结果集封装

1.2 MyBatis的增删改查

完成简单的user表的增删改查的操作

@Slf4j
public class MybatisUserTest {
    private UserMapper sm;
    @Before
    public void before() throws IOException {
        //建立数据源
        DruidDataSource ds = new DruidDataSource();
        Properties properties = new Properties();
        properties.load(Resources.getResourceAsStream("jdbc.properties"));
        ds.setConnectProperties(properties);
        //相当于sql的核心配置文件
        JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("environment", jdbcTransactionFactory, ds);
        Configuration configuration = new Configuration(environment);
        configuration.addMappers("cn.seim.mapper");
        //添加分页插件(可用可不用)
        // PageInterceptor pi = new PageInterceptor();
        //  configuration.addInterceptor(pi);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        sm = sqlSession.getMapper(UserMapper.class);//测试User表使用
    }
    //user表的相关操作
    @Test
    public void save() {
        User user1 = new User();
        user1.setUsername("尼古拉斯");
        user1.setPassword("abc");
        user1.setBirthday(LocalDateTime.now());
        sm.saveUser(user1);
    }
    @Test
    public void update() {
        User user1 = new User();
        user1.setId(13);
        user1.setUsername("尼古拉斯·赵四");
        user1.setPassword("123");
        user1.setBirthday(LocalDateTime.now());
        sm.updateUser(user1);
    }
    @Test
    public void delete() {
        sm.deleteUser(13);
    }
    @Test
    public void findUserById() {
        User user = sm.findUserById(3);
        log.debug(String.valueOf(user));
    }
    @Test
    public void findUserAll() {
        List<User> all = sm.findUserAll();
        for (User user : all) {
            log.debug(String.valueOf(user));
        }
    }

1.3 MyBatis的注解实现复杂映射开发

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置

注解说明
@Results代替的是标签该注解中可以使用单个@Result注解,也可以使用@Result集合。使用格式:@Results({@Result(),@Result()})或@Results(@Result())
@Resut代替了标签和标签@Result中属性介绍:column:数据库的列名property:需要装配的属性名one:需要使用的@One 注解(@Result(one=@One)()))many:需要使用的@Many 注解(@Result(many=@many)()))
@One (一对一)代替了 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。@One注解属性介绍:select: 指定用来多表查询的 sqlmapper使用格式:@Result(column=" “,property=”",one=@One(select=""))
@Many (多对一)代替了标签, 是是多表查询的关键,在注解中用来指定子查询返回对象集合。使用格式:@Result(property="",column="",many=@Many(select=""))

1.4 一对一查询

1. 一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户
在这里插入图片描述

2. 一对一查询的语句

对应的sql语句:
select * from orders;
select * from user where id=查询出订单的uid;
在这里插入图片描述

3. 创建Order和User实体
/**
 * @Author: [seim]
 * @emil: [webseim@126.com]
 * @ClassName Order
 * @date 2021/7/15 21:49
 * @Version 15
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {
    private int id;
    private LocalDate ordertime;
    private double total;
    //表示当前订单属于哪一个用户
    private User user;
}
/**
 * @Author: [seim]
 * @emil: [webseim@126.com]
 * @ClassName User
 * @date 2021/7/15 16:45
 * @Version 15
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
   private int id;
   private String username;
   private String password;
   private LocalDateTime birthday;
}
4. 创建OrderMapper接口
public interface OrderMapper {
  public List<Order> findOrderALl();
}
5. 使用注解配置Mapper
OrderMapper
//查询全部方法二(两张表分开查)
@Select("select *,o.id oid from test.orders o,test.user u where o.uid=u.id")
@Results({
        @Result(column = "oid",property = "id"),
        @Result(column = "ordertime",property = "ordertime"),
        @Result(column = "total",property = "total"),
       @Result(
               property = "user", //要封装的属性名称
               column = "uid",  //根据哪个字段来查user表的信息
               javaType = User.class, //要封装的实体类型
               one = @One(select = "cn.seim.mapper.UserMapper.findUserById")
       )
})
public List<Order> findOrderALl();
UserMapper
public interface UserMapper {
    @Select("select * from test.user where id=#{id}")
    public User findUserById(int id);
}
6. 测试结果
@Test
public void findOrderAll() {
    List<Order> orderALl = om.findOrderALl();
    for (Order order : orderALl) {
        log.debug(String.valueOf(order));
    }
}

在这里插入图片描述

2.一对多查询

2.1 一对多查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单
在这里插入图片描述

2.2 一对多查询的语句

对应的sql语句:
select * from user;
select * from orders where uid=查询出用户的id;
在这里插入图片描述

2.3 修改User、Order实体

在这里插入代码片/**
 * @Author: [seim]
 * @emil: [webseim@126.com]
 * @ClassName User
 * @date 2021/7/15 16:45
 * @Version 15
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
   private int id;
   private String username;
   private String password;
   private LocalDateTime birthday;
   //表示当前用户具有的订单
   private List<Order> orderList;
}
/**
 * @Author: [seim]
 * @emil: [webseim@126.com]
 * @ClassName Order
 * @date 2021/7/15 21:49
 * @Version 15
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {
    private int id;
    private LocalDate ordertime;
    private double total;
    //表示当前订单属于哪一个用户
    private User user;
}

2.4 创建UserMapper接口

public interface UserMapper {
    public List<User> findUserAndOrderAll();
}

2.5 使用注解配置Mapper

UserMapper
@Select("select * from test.user")
@Results({
        @Result(id = true,column = "id",property = "id"),
        @Result(column = "username",property = "username"),
        @Result(column = "password",property = "password"),
        @Result(column = "birthday",property = "birthday"),
        @Result(
                property = "orderList",
                column = "id",
                javaType =List.class,
                many = @Many(select = "cn.seim.mapper.OrderMapper.findByUid")
        )
})
public List<User> findUserAndOrderAll();
OrderMapper
@Select("select * from orders where uid=#{uid}")
public List<Order> findByUid(int uid);

2.6 测试结果

@Test
public  void findUserAndOrderAll(){
    List<User> all = sm.findUserAndOrderAll();
    for (User user : all) {
        log.debug(String.valueOf(user));
    }
}

3.多对多查询

3.1多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色
在这里插入图片描述

3.2 多对多查询的语句

对应的sql语句:
select * from user;
select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=用户的id
在这里插入图片描述

3.3创建Role实体,修改User实体

/**
 * @Author: [seim]
 * @emil: [webseim@126.com]
 * @ClassName Role
 * @date 2021/7/16 9:41
 * @Version 15
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Role {
   private int id;
   private String roleName;
   private String roleDesc;
}
/**
 * @Author: [seim]
 * @emil: [webseim@126.com]
 * @ClassName User
 * @date 2021/7/15 16:45
 * @Version 15
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
   private int id;
   private String username;
   private String password;
   private LocalDateTime birthday;
   //表示当前用户具有的订单
   private List<Order> orderList;
   //表示当前用户具有的角色
   private List<Role> roleList;
}

3.4添加UserMapper接口方法

public List<User> findUserAndRoleALl();

3.5使用注解配置Mapper

UserMapper
@Select("select * from user")
@Results({
        @Result(id = true,column = "id",property = "id"),
        @Result(column = "username",property = "username"),
        @Result(column = "password",property = "password"),
        @Result(column = "birthday",property = "birthday"),
        @Result(
                property = "roleList",
                column = "id",
                javaType = List.class,
                many = @Many(select = "cn.seim.mapper.RoleMapper.findRoleByUid")
        )
})
public List<User> findUserAndRoleALl();
RoleMapper
@Select("select * from test.sys_user_role ur,test.sys_role r where ur.roleId=r.id and ur.userId=#{uid}")
public List<Role> findRoleByUid(int uid);

3.6 测试结果

@Test
public void findUserAndRoleALl(){
    List<User> all = sm.findUserAndRoleALl();
    for (User user : all) {
        log.debug(String.valueOf(user));
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值