使用注解开发
mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到MyBatis 3提供了
新的基于注解的配置。不幸的是,Java 注解的的表达力和灵活性十分有限。最强大的 MyBatis 映
射并不能用注解来构建
主要的sql注解类型
- @Select
- @Insert
- @Delete
- @Update
当使用注解开发的的时候不再需要Mapper.xml映射文件
创建接口类:
添加方法并使用注解:
@Select("select * from user ")
List<User> getUsers();
在Mybatis核心配置文件注入:
<mappers>
<mapper class="com.lx.dao.UserMapper"/>
</mappers>
测试方法:
@Test
public void test(){ //getUsers
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUsers();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
测试结果:
查询结果pwd为null 因为在实体类中的属性为pwd ,而在数据库中的对应属性为password
解决方案: 使用注解Result
@Select("select * from user ")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(column = "password",property = "pwd")
})
List<User> getUsers();
查询结果正常化:
ResultMap
为了提高代码的复用性,当为同一个实体类,属性值相同时,可以设置Result的id,再使用ResultMap来提高代码的复用性
@Select("select * from user ")
@Results(id = "user", value={
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(column = "password",property = "pwd")
})
List<User> getUsers();
@Select("select * from user where id=#{id}")
@ResultMap("user")
User getUserById(@Param("id") int id);
注解增删改查,没什么好说的:
package com.lx.dao;
import com.lx.pojo.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
import java.util.Map;
public interface UserMapper {
@Select("select * from user ")
@Results(id = "user", value={
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(column = "password",property = "pwd")
})
List<User> getUsers();
@Select("select * from user where id=#{id}")
@ResultMap("user")
User getUserById(@Param("id") int id);
@Insert("insert into user (id,name,password) values (#{id},#{name},#{pwd})")
int addUser(User user);
@Update("update user set name=#{name} , password=#{pwd} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id=#{id}")
int deleteUserById(int id);
}
测试类:
import com.lx.dao.UserMapper;
import com.lx.pojo.User;
import com.lx.utils.MybatisUtils;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class TestUserMapper {
@Test
public void test(){ //getUsers
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUsers();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void Test2(){ //getUserById
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(999);
System.out.println(user);
sqlSession.close();
}
@Test
public void test3(){ //addUser
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.addUser(new User(555, "noone", "1030"));
if (0 != i){
System.out.println("插入成功");
}
//已将openSession设置为true 会自动提交,不需要手动 sqlSession.commit();
sqlSession.close();
}
@Test
public void test4(){ //updateUser
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.updateUser(new User(555, "hello", "longTime"));
if (0 != i)
System.out.println("更新成功");
sqlSession.close();
}
@Test
public void test5(){ // deleteUserById
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUserById(555);
if (0 != i)
System.out.println("删除成功");
sqlSession.close();
}
}
测试示列:
对应文件mybatis-05