Mybatis 基于注解的 CRUD 操作

Mybatis 基于注解的开发

1. 导入相关的 jar 包
	<dependencies>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!-- 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <!-- 日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- JUnit 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
	</dependencies>

2. 创建 user 和 account 实体类
package com.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class User implements Serializable {
    private Integer id;
    private String username;
    private char sex;
    private Date birthday;
    private String address;

    // 一对多的关系映射:主表实体应包含从表实体的集合引用
    private List<Account> accounts;
    
    // setXXX()、getXXX() 和 toString() 方法省略
}
package com.entity;

import java.io.Serializable;

public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private float money;

    private User user;
	
	// setXXX()、getXXX() 和 toString() 方法省略
}

3. 创建两个 dao 接口
package com.dao;

import com.entity.User;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface IUserDao {
    /**
     * 查询所有用户
     * @return
     */
    @Select("select * from user")
    @Results(id = "userMap",value = {
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "username",column = "username"),
            @Result(property = "sex",column = "sex"),
            @Result(property = "birthday",column = "birthday"),
            @Result(property = "address",column = "address"),
            @Result(property = "accounts",column = "id",many = @Many(select = "com.dao.IAccountDao.findByUid",fetchType = FetchType.LAZY))
    })
    List<User> findAll();

    /**
     * 根据id查询用户
     * @param id
     * @return
     */
    @Select("select * from user where id = #{id}")
    User findById(Integer id);

    /**
     * 根据名称查询用户
     * @param userName
     * @return
     */
    @Select("select * from user where username like #{userName}")
    List<User> findByName(String userName);

    /**
     * 保存用户操作
     * @param user
     */
    @Insert("insert into user(username,sex,birthday,address) values (#{username},#{sex},#{birthday},#{address})")
    void saveUser(User user);

    /**
     * 更新用户操作
     * @param user
     */
    @Update("update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}")
    void updateUser(User user);

    /**
     * 查询用户总数
     * @return
     */
    @Select("select count(id) from user")
    int findCount();
}
package com.dao;

import com.entity.Account;
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 org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface IAccountDao {
    /**
     * 查询所有账户
     * @return
     */
    @Select("select * from account")
    @Results(id = "accountMap", value = {
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "uid",column = "uid"),
            @Result(property = "money",column = "money"),
            @Result(property = "user",column = "uid",one = @One(select = "com.dao.IUserDao.findById",fetchType = FetchType.EAGER))
    })
    // @One(select = "com.dao.IUserDao.findById",fetchType = FetchType.EAGER)
    // select 的值是查询的唯一标识(具体到某一方法的全部路径),fetchType 的取值有两种,延迟加载(LAZY)和立即加载(EAGER)
    List<Account> findAll();

    /**
     * 根据 Uid查询账户
     * @return
     */
    @Select("select * from account where uid = #{uid}")
    List<Account> findByUid(Integer uid);
}
小点总结:
1. @Results 注解
	 @Results 注解用于定义映射结果集,相当于标签 <resultMap></resultMap>
	 		id 属性为唯一标识;
	 		value 属性用于接收 @Result[] 注解类型的数组
	 @Result 注解用于定义映射关系,相当于 <id/> 和 <result/> 标签
	 		id 属性指定主键。
    		property 属性指定实体类的属性名,column 属性指定数据库表中对应的列名
	 @ResultMap 注解用于引用 @Results 定义的映射结果集,避免了重复定义映射结果集

2. @One 注解(一对一)
	 @One 注解相当于标签 <association></association>,是多表查询的关键,在注解中用来指定子查询返回单一对象
			select 属性指定用于查询的接口方法;
			fetchType 属性用于指定立即加载( FetchType.EAGER)或延迟加载(FetchType.LAZY)
	 在包含 @one 注解的 @Result 中,column 属性用于指定将要作为参数进行查询的数据库表列

3. @Many 注解(一对多)
	 @Many 注解相当于标签 <collection></collection>,是多表查询的关键,在注解中用来指定子查询返回对象集合
	 		select 属性指定用于查询的接口方法;
	 		fetchType 属性用于指定立即加载( FetchType.EAGER)或延迟加载(FetchType.LAZY)
	 在包含 @Many 注解的 @Result 中,column 属性用于指定将要作为参数进行查询的数据库表列

4. 编写 Mybatis 的主配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org.//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="jdbcConfig.properties"></properties>

    <!-- 配置延迟加载 -->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

    <!-- 配置别名,默认是类名称(第一个字母小写) -->
    <typeAliases>
        <package name="com.entity"/>
    </typeAliases>

    <!-- 配置环境 -->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定带有注释的dao接口所在的位置 -->
    <mappers>
        <package name="com.dao"/>
    </mappers>
</configuration>
jdbcConfig.Properties 文件内容:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/learn_Mybatis
jdbc.username=root
jdbc.password=root

5. 编写测试类
package com.demo.test;

import com.dao.IUserDao;
import com.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.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class UserTest {
    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before
    public void before() throws Exception {
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        sqlSession = factory.openSession();
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    @After
    public void after() throws Exception {
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }

    @Test
    public void testFindAll() {
        List<User> users = userDao.findAll();
        for(User user : users) {
            System.out.println("-----------");
            System.out.println(user);
            System.out.println(user.getAccounts());
        }
    }

    @Test
    public void testFindById() {
        User user = userDao.findById(1);
        System.out.println(user);
    }

    @Test
    public void testSave() {
        User user = new User();
        user.setUsername("小七");
        user.setSex('女');
        user.setBirthday(new Date());
        user.setAddress("陕西西安");

        userDao.saveUser(user);

    }

    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(3);
        user.setUsername("小五");
        user.setSex('女');
        user.setBirthday(new Date());
        user.setAddress("陕西西安");

        userDao.updateUser(user);
    }

    @Test
    public void testFindCount() {
        int count = userDao.findCount();
        System.out.println(count);
    }
}
    @Test
    public void testFindAll() {
        List<Account> accounts = accountDao.findAll();
        for(Account account : accounts) {
            System.out.println("---------------------------");
            System.out.println(account);
            System.out.println(account.getUser());
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值