MyBatis从零开始-MyBatis注解范式的基本用法

系列博客目录:MyBatis从零开始博客目录

3. MyBatis注解范式的基本用法

3.1 @Select注解

UserMappe.java

import org.apache.ibatis.annotations.Select;
public interface UserMapper {
    
    
	/**
	 * 使用Select注解根据id查询
	 * @param id
	 * @return
	 */
	@Select({
    
    "SELECT id, username, password FROM user WHERE id = #{id}"})
	User selectById(int id);
}

UserTest.java

@Test
public void selectById(){
    
    
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    try{
    
    
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.selectById(1);
        System.out.println(user);
    } finally {
    
    
        sqlSession.close();
    }
}

输出内容:
DEBUG [main] - ==>  Preparing: SELECT id, username, password FROM user WHERE id = ? 
DEBUG [main] - ==> Parameters: 1(Integer)
TRACE [main] - <==    Columns: id, username, password
TRACE [main] - <==        Row: 1, 管理员, 123456
DEBUG [main] - <==      Total: 1
User [id=1, username=管理员, password=123456]

注:使用注解同样需要考虑表字段和Java属性的映射关系,可以在SQL语句中使用别名,也可以使用mapUnderscoreToCamelCase配置以及使用resultMap方式。

3.1.1 使用mapUnderscoreToCamelCase配置

​ mapUnderscoreToCamelCase配置方法,MyBatis的配置文件中添加< setting > 配置,此处是在mybatis-config.xml文件中做如下配置:

<settings>
    <!-- 驼峰命名 -->
    <setting name="mapUnderscoreToCamelCase" value="true"></setting>
</settings>

UserContactMapper.java

import org.apache.ibatis.annotations.Select;

public interface UserContactMapper {
    
    	
	
	/**
	 * 查询userContact信息,方法一:mapUnderscoreCamelCase驼峰命名配置
	 * @param id
	 * @return
	 */
	@Select({
    
    "SELECT id, email, phone, home_address FROM user_contact"})
	List<UserContact> selectUserContact();
	
}

UserContactTest.java

@Test
public void selectUserContact() {
    
    
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    try {
    
    
        UserContactMapper userContactMapper = sqlSession.getMapper(UserContactMapper.class);
        List<UserContact> userContactList = userContactMapper.selectUserContact();
        if (userContactList != null && userContactList.size() > 0) {
    
    
            userContactList.forEach(userContact -> System.out.println(userContact));
        }
    } finally {
    
    
        sqlSession.close();
    }
}

输出信息:
DEBUG [main] - ==>  Preparing: SELECT id, email, phone, home_address, user_id FROM user_contact 
DEBUG [main] - ==> Parameters: 
TRACE [main] - <==    Columns: id, email, phone, home_address, user_id
TRACE [main] - <==        Row: 1, testname@qq.com, 13612345678, testname地址, 3
TRACE [main] - <==        Row: 2, admin@qq.com, 13412345677, 管理员home地址, 1
DEBUG [main] - <==      Total: 2
UserContact [id=1, email=testname@qq.com, phone=13612345678, homeAddress=testname地址, user=null]
UserContact [id=2, email=admin@qq.com, phone=13412345677, homeAddress=管理员home地址, user=null]

3.1.2 使用resultMap方法

UserContactMapper.java

import java.util.List;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

public interface UserContactMapper {
    
    	
	/**
	 * 查询userContact信息,方法二:使用resultMap方式
	 * @return
	 */
	// @Results 中id属性设置id属性后其他方法可以通过id属性引用
	@Results(id="userContactResultMap" , value={
    
    
		// @Result注解id=true表示对应<id>元素
		@Result(property="id", column="id", id=true),
		@Result(property="email", column="email"),
		@Result(property="phone", column="phone"),
		@Result(property="homeAddress", column="home_address"),
	})
	@Select({
    
    "SELECT id, email, phone, home_address FROM user_contact"})
	List<UserContact> selectUserContact2();
	
	/**
	 * 效果和selectUserContact2
	 * @return
	 */
	@ResultMap("userContactResultMap")
	@Select({
    
    "SELECT id, email, phone, home_address FROM user_contact"})
	List<UserContact> selectUserContact3();
	
}

UserContactTest.java

@Test
public void selectUserContact2() {
    
    
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    try {
    
    
        UserContactMapper userContactMapper = sqlSession.getMapper(UserContactMapper.class);
        List<UserContact> userContactList = userContactMapper.selectUserContact2();
        if (userContactList != null && userContactList.size() > 0) {
    
    
            userContactList.forEach(userContact -> System.out.println(userContact));
        }
    } finally {
    
    
        sqlSession.close();
    }
}

输出信息:
DEBUG [main] - ==>  Preparing: SELECT id, email, phone, home_address FROM user_contact 
DEBUG [main] - ==> Parameters: 
TRACE [main] - <==    Columns: id, email, phone, home_address
TRACE [main] - <==        Row: 1, testname@qq.com, 13612345678, testname地址
TRACE [main] - <==        Row: 2, admin@qq.com, 13412345677, 管理员home地址
DEBUG [main] - <==      Total: 2
UserContact [id=1, email=testname@qq.com, phone=13612345678, homeAddress=testname地址, user=null]
UserContact [id=2, email=admin@qq.com, phone=13412345677, homeAddress=管理员home地址, user=null]

3.2 @Insert注解

3.2.1 不需要返回主键值

UserContactMapper.java

/**
 * 不需要返回主键
 * @param userContact
 * @return
 */
@Insert({
    
    "insert into user_contact(email, phone, home_address, user_id) values (#{email}, #{phone}, #{homeAddress}, #{user.id})"})
int insert1(UserContact userContact);

UserContactTest.java

/**
 * 测试新增不需要返回主键
 */
@Test
public void insert1(){
    
    
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    try{
    
    
        // 数据准备
        UserContact userContact = new UserContact();
        userContact.setEmail("[email protected]");
        userContact.setPhone("13412345678");
        userContact.setHomeAddress("insert地址");
        User user = new User();
        user.setId(1);
        userContact.setUser(user);

        UserContactMapper userContactMapper = sqlSession.getMapper(UserContactMapper.class);
        int result = userContactMapper.insert1(userContact);
        if(result > 0){
    
    
            System.out.println("insert1添加成功");
        } else {
    
    
            System.out.println("insert1添加失败");
        }
        // 提交事务
        sqlSession.commit();
    } finally {
    
    
        sqlSession.close();
    }
}

输出结果:
DEBUG [main] - ==>  Preparing: insert into user_contact(email, phone, home_address, user_id) values (?, ?, ?, ?) 
DEBUG [main] - ==> Parameters: insert1@email.com(String), 13412345678(String), insert地址(String), 1(Integer)
DEBUG [main] - <==    Updates: 1
insert1添加成功

3.2.2 返回自增主键

UserContactMapper.java

/**
 * 返回自增主键
 * 
 * @param userContact
 * @return
 */
@Insert({
    
     "insert into user_contact(email, phone, home_address, user_id) values (#{email}, #{phone}, #{homeAddress}, #{user.id})" })
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insert2(UserContact userContact);

UserContactTest.java

/**
 * 测试新增返回自增主键
 */
@Test
public void insert2(){
    
    
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    try{
    
    
        // 数据准备
        UserContact userContact = new UserContact();
        userContact.setEmail("[email protected]");
        userContact.setPhone("13412345678");
        userContact.setHomeAddress("insert2地址");
        User user = new User();
        user.setId(1);
        userContact.setUser(user);

        UserContactMapper userContactMapper = sqlSession.getMapper(UserContactMapper.class);
        int result = userContactMapper.insert2(userContact);
        if(result > 0){
    
    
            System.out.println("insert2添加成功,主键是id:"+ userContact.getId());
        } else {
    
    
            System.out.println("insert2添加失败");
        }
        // 提交事务
        sqlSession.commit();
    } finally {
    
    
        sqlSession.close();
    }
}

输出结果:
DEBUG [main] - ==>  Preparing: insert into user_contact(email, phone, home_address, user_id) values (?, ?, ?, ?) 
DEBUG [main] - ==> Parameters: insert2@email.com(String), 13412345678(String), insert2地址(String), 1(Integer)
DEBUG [main] - <==    Updates: 1
insert2添加成功,主键是id:6

3.2.3 返回非自增主键

UserContactMapper.java

/**
 * 返回非自增主键
 * 
 * @param userContact
 * @return
 */
@Insert({
    
     "insert into user_contact(email, phone, home_address, user_id) values (#{email}, #{phone}, #{homeAddress}, #{user.id})" })
@SelectKey(statement="SELECT LAST_INSERT_ID()",
           keyProperty = "id", 
           keyColumn = "id",
           resultType = Integer.class,
           before = false)
int insert3(UserContact userContact);

UserContactTest.java

/**
 * 测试新增返回非自增主键
 */
@Test
public void insert3() {
    
    
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    try {
    
    
        // 数据准备
        UserContact userContact = new UserContact();
        userContact.setEmail("[email protected]");
        userContact.setPhone("13412345678");
        userContact.setHomeAddress("insert2地址");
        User user = new User();
        user.setId(1);
        userContact.setUser(user);

        UserContactMapper userContactMapper = sqlSession.getMapper(UserContactMapper.class);
        int result = userContactMapper.insert3(userContact);
        if (result > 0) {
    
    
            System.out.println("insert2添加成功,主键是id:" + userContact.getId());
        } else {
    
    
            System.out.println("insert2添加失败");
        }
        // 提交事务
        sqlSession.commit();
    } finally {
    
    
        sqlSession.close();
    }
}

输出结果:
DEBUG [main] - ==>  Preparing: insert into user_contact(email, phone, home_address, user_id) values (?, ?, ?, ?) 
DEBUG [main] - ==> Parameters: insert2@email.com(String), 13412345678(String), insert2地址(String), 1(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - ==>  Preparing: SELECT LAST_INSERT_ID() 
DEBUG [main] - ==> Parameters: 
TRACE [main] - <==    Columns: LAST_INSERT_ID()
TRACE [main] - <==        Row: 7
DEBUG [main] - <==      Total: 1
insert2添加成功,主键是id:7

3.3 @Update注解和@Delete注解

UserContactMapper.java

/**
 * 更新数据
 * @param userContact
 * @return
 */
@Update({
    
    "update user_contact set email=#{email}, phone=#{phone}, home_address=#{homeAddress}, user_id=#{user.id} where id=#{id}"})
int updateById(UserContact userContact);

/**
 * 根据id删除
 * @param id
 * @return
 */
@Delete({
    
    "delete from user_contact where id = #{id}"})
int deleteById(Integer id);

UserContactTest.java

@Test
public void updateByIdAndDeleteById(){
    
    
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    try {
    
    
        // 数据准备
        UserContact userContact = new UserContact();
        userContact.setId(7);
        userContact.setEmail("[email protected]");
        userContact.setPhone("13411111111");
        userContact.setHomeAddress("updateById地址");
        User user = new User();
        user.setId(2);
        userContact.setUser(user);

        UserContactMapper userContactMapper = sqlSession.getMapper(UserContactMapper.class);
        int result = userContactMapper.updateById(userContact);
        if (result > 0) {
    
    
            System.out.println("updateById添加成功");
        } else {
    
    
            System.out.println("updateById添加失败");
        }
        // 提交事务
        sqlSession.commit();

        result = userContactMapper.deleteById(7);
        if (result > 0) {
    
    
            System.out.println("deleteById添加成功");
        } else {
    
    
            System.out.println("deleteById添加失败");
        }
        sqlSession.commit();
    } finally {
    
    
        sqlSession.close();
    }
}

输出结果:
DEBUG [main] - ==>  Preparing: update user_contact set email=?, phone=?, home_address=?, user_id=? where id=? 
DEBUG [main] - ==> Parameters: updateById@email.com(String), 13411111111(String), updateById地址(String), 2(Integer), 7(Integer)
DEBUG [main] - <==    Updates: 1
updateById添加成功
DEBUG [main] - ==>  Preparing: delete from user_contact where id = ? 
DEBUG [main] - ==> Parameters: 7(Integer)
DEBUG [main] - <==    Updates: 1
deleteById添加成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zPA06dON-1614513937815)(C:\Users\xiangty\Desktop\s8.jpg)]

如果文档中有任何问题,可以直接联系我,便于我改正和进步。希望文档对您有所帮助。文档中代码GitHub地址:https://gitee.com/xiangty1/learn-MyBatis/

猜你喜欢

转载自blog.csdn.net/qq_33369215/article/details/114238963