@Results 代替了 <id> 标签和 <result> 标签,属性介绍:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的 @One 注解 @Result(one=@One)()
many 需要使用的 @Many 注解(@Result(many=@Many)()
@One(一对一) 代替了 <assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象,属性介绍:
select 指定用来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled
使用格式:@Result(column=" ", property="", one=@One(select=""))
@Many(多对一)代替了 <collection> 标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合,
使用格式:@Result(property="", column="", many=@Many(select=""))
编写实体类
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
}
使用注解方式开发持久层接口
package cn.parzulpan.dao;
import cn.parzulpan.domain.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
* @Author : parzulpan
* @Time : 2020-12
* @Desc : 用户的持久层接口,使用注解开发
*/
public interface UserDAO {
/**
* 查询所有用户
* @return
*/
@Select("select * from user")
@Results(id = "userMap",
value = {
@Result(id = true, column = "id", property = "userId"),
@Result(column = "username", property = "userName"),
@Result(column = "birthday", property = "userBirthday"),
@Result(column = "sex", property = "userSex"),
@Result(column = "address", property = "userAddress")
})
List<User> findAll();
/**
* 根据 id 查询一个用户
* @param userId
* @return
*/
@Select("select * from user where id = #{uid}")
@ResultMap(value = {"userMap"})
User findById(Integer userId);
/**
* 插入操作
* @param user
* @return
*/
@Insert("insert into user(username, birthday, sex, address) values (#{userName}, #{userBirthday}, #{userSex}, #{userAddress})")
@SelectKey(keyColumn = "id", keyProperty = "userId", resultType = Integer.class, before = false,
statement = {"select last_insert_id()"})
int saveUser(User user);
/**
* 更新操作
* @param user
* @return
*/
@Update("update user set username = #{userName}, birthday = #{userBirthday}, sex = #{userSex}, " +
"address = #{userAddress} where id = #{userId}")
int updateUser(User user);
/**
* 删除操作
* @param userId
* @return
*/
@Delete("delete from user where id = #{uid}")
int deleteUser(Integer userId);
/**
* 使用聚合函数查询
* @return
*/
@Select("select count(*) from user")
int findTotal();
/**
*
* @param name
* @return
*/
@Select("select * from user where username like #{username}")
@ResultMap(value = {"userMap"})
List<User> findByName(String name);
}
编写 SqlMapConfig 配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 配置 properties 文件的位置 -->
<properties resource="JDBCConfig.properties"/>
<!-- 配置别名 -->
<typeAliases>
<package name="cn.parzulpan.domain"/>
</typeAliases>
<!-- 配置 MySQL 环境 -->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<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>
<!-- 配置映射信息 -->
<mappers>
<package name="cn.parzulpan.dao"/>
</mappers>
</configuration>
编写测试方法
package cn.parzulpan;
import cn.parzulpan.dao.UserDAO;
import cn.parzulpan.domain.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;
/**
* @Author : parzulpan
* @Time : 2020-12
* @Desc :
*/
public class MyBatisAnnotationCRUDTest {
private InputStream is;
private SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
private UserDAO userDAO;
@Before
public void init() throws Exception {
System.out.println("Before...");
is = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = builder.build(is);
sqlSession = sqlSessionFactory.openSession();
userDAO = sqlSession.getMapper(UserDAO.class);
}
@After
public void destroy() throws Exception {
System.out.println("After...");
sqlSession.commit();
sqlSession.close();
is.close();
}
@Test
public void findAllTest() {
List<User> users = userDAO.findAll();
for (User user : users) {
System.out.println(user);
}
}
@Test
public void findByIdTest() {
User user = userDAO.findById(41);
System.out.println(user);
}
@Test
public void saveUserTest() {
User user = new User(null, "annotation username", new Date(), "男", "Beijing");
System.out.println("save before: " + user); // User{id=null, ...}
int i = userDAO.saveUser(user);
System.out.println(i);
System.out.println("save after: " + user); // User{id=53, ...}
}
@Test
public void updateUserTest() {
User user = userDAO.findById(42);
user.setUserName("Tom Tim Tom AA");
user.setUserAddress("瑞典");
int i = userDAO.updateUser(user);
System.out.println(i);
}
@Test
public void deleteUserTest() {
int i = userDAO.deleteUser(53);
System.out.println(i);
}
@Test
public void findTotalTest() {
int total = userDAO.findTotal();
System.out.println(total);
}
@Test
public void findByNameTest() {
List<User> users = userDAO.findByName("%Tim%");
for (User user : users) {
System.out.println(user);
}
}
}