MyBatis基于注解的初体验
需求缘起
其实上一节中我们使用的就是xml方式了,现在我们换一种方式,通过注解的方式来操作数据库。
本小节代码
1.定义接口文件UserInfoMapper.java
在上一小节项目的基础上定义接口文件UserMapper.java,在这个类中我们写几个接口,对应上一节的几个功能。
package com.mybatis.demo.mapper;
import com.mybatis.demo.model.UserInfo;
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;
/**
* @auther kklu
* @date 2019/10/11 19:01
* @describe
*/
public interface UserInfoMapper {
//根据 id 查询 user_info 表数据
@Select("select * from user_info where id = #{id}")
UserInfo selectUserInfoById(int id) throws Exception;
//查询 user_info 表所有数据
@Select("select * from user_info")
List<UserInfo> selectUserInfoAll() throws Exception;
//根据 id 查询 user_info 表数据
@Select("select * from user_info where username like '%${value}%'")
List<UserInfo> selectLikeUserName(String username) throws Exception;
//向 user_info 表插入一条数据
@Insert("insert into user_info(username,password) value(#{username},#{password})")
void insertUserInfo(UserInfo userInfo) throws Exception;
//根据 id 修改 user_info 表数据
@Update("update user_info set username=#{username} where id=#{id}")
void updateUserInfoById(UserInfo userInfo) throws Exception;
//根据 id 删除 user_info 表数据
@Delete("delete from user_info where id=#{id}")
void deleteUserInfoById(int id) throws Exception;
}
2.在配置文件mybatis-config.xml中注册UserMapper接口
配置文件mybatis-config.xml 在上一节中已经说明,这里需要做些修改,
<mappers>
<!--基于注解的方式,接口UserInfoMapper的包路径-->
<mapper class="com.mybatis.demo.mapper.UserInfoMapper"/>
<!--基于xml的方式,mapper.xml文件的路径-->
<!--<mapper resource="mapper/UserInfoMapper.xml"/>-->
</mappers>
3.删除UserInfoMapper.xml文件
为了不影响学习,把上一节中的UserInfoMapper.xml 文件删除。这个文件的功能已经用注解的方式替代了。
4. 测试
测试也需要做些修改
package com.mybatis.demo.mapper;
import com.mybatis.demo.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
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.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
/**
* @auther kklu
* @date 2019/9/29 15:49
* @describe
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class UserInfoMapperTest {
private static SqlSessionFactory sqlSessionFactory;
private static SqlSession sqlSession ;
private static UserInfoMapper userInfoMapper;
@BeforeClass
public static void init() {
try {
//将工具类读入 reader
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//创建 SqlSessionFactory 对象,该对象包含了mybatis-config.xml相关配置信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
sqlSession = sqlSessionFactory.openSession();
userInfoMapper = sqlSession.getMapper(UserInfoMapper.class);
reader.close();
} catch (IOException ignore) {
ignore.printStackTrace();
}
}
//根据id查询user表数据
@Test
public void testSelectUserInfoById() {
try {
UserInfo userInfo = userInfoMapper.selectUserInfoById(1);
log.info("userInfo={}", userInfo);
} catch (Exception e) {
e.printStackTrace();
} finally {
//不要忘记关闭 sqlSession
sqlSession.close();
}
}
//查询所有user表所有数据
@Test
public void testSelectUserInfoAll() {
try {
List<UserInfo> listUser = userInfoMapper.selectUserInfoAll();
for (UserInfo userInfo : listUser) {
log.info("userInfo={}", userInfo);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//不要忘记关闭 sqlSession
sqlSession.close();
}
}
//模糊查询:根据 user 表的username字段
@Test
public void testSelectLikeUserName() {
try {
List<UserInfo> listUser = userInfoMapper.selectLikeUserName("J");
for (UserInfo userInfo : listUser) {
log.info("userInfo={}", userInfo);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//不要忘记关闭 sqlSession
sqlSession.close();
}
}
//向 user 表中插入一条数据
@Test
public void testInsertUser() {
try {
UserInfo user = new UserInfo();
user.setUsername("黎明");
user.setPassword("123456");
userInfoMapper.insertUserInfo(user);
//提交插入的数据
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
//不要忘记关闭 sqlSession
sqlSession.close();
}
}
//根据 id 更新 user 表的数据
@Test
public void testUpdateUserById() {
try {
//如果设置的 id不存在,那么数据库没有数据更改
UserInfo user = new UserInfo();
user.setId(7L);
user.setUsername("Jack");
userInfoMapper.updateUserInfoById(user);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
//不要忘记关闭 sqlSession
sqlSession.close();
}
}
//根据 id 删除 user 表的数据
@Test
public void testDeleteUserInfoById() {
try {
userInfoMapper.deleteUserInfoById(8);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
//不要忘记关闭 sqlSession
sqlSession.close();
}
}
}
不出意外,测试的效果跟上一节是一致的。