系列博客目录: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添加成功
如果文档中有任何问题,可以直接联系我,便于我改正和进步。希望文档对您有所帮助。文档中代码GitHub地址:https://gitee.com/xiangty1/learn-MyBatis/