**注意 使用了注解项目中就不能存在xml的配置
其中 注解开发的配置 在SqlMapConfig.xml中
<!--指定带有注解的dao接口-->
<mappers>
<package name="com.itheima.dao"></package>
</mappers>
**
1.单表中的注解查询
新建实体类
dao层 IUserDao
package com.itheima.dao;
import com.itheima.domain.User;
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;
public interface IUserDao {
/**
* 查询所有
* @return
*/
@Select("select * from user")
List<User> findAll();
/**
* 保存方法
* @param user
*/
@Insert("insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})")
void saveUser(User user);
/**
* 更新操作
*/
@Update("update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}")
void updateUser(User user);
/**
* 删除操作
*/
@Delete("delete from user where id=#{id}")
void deleteUser(Integer userId);
/**
* 根据用户ID查询信息
*/
@Select("select * from user where id=#{id}")
User findById(Integer userid);
/**
* 根据用户名称模糊查询
*/
@Select("select *from user where username like #{username}")
List<User> findUserByName(String username);
/**
* 查询总用户数量
*/
@Select("select count(*) from user")
int findTotalUser();
}
测试注解方法
package com.itheima.test;
import com.itheima.dao.IUserDao;
import com.itheima.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.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisTest01 {
/***
* 测试查询
*/
@Test
public void testSelect() throws Exception{
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产的SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession对象创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
/**
* 测试保存对象
*/
@Test
public void testSave() throws Exception{
User user = new User();
user.setUsername("mybatis save01");
user.setAddress("3306");
user.setSex("男");
user.setBirthday(new Date());
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产的SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession对象创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法 保存
userDao.saveUser(user);
session.commit();
//6.释放资源
session.close();
in.close();
}
/***
* 测试更新操作
* @throws Exception
*/
@Test
public void testUpdate() throws Exception{
User user = new User();
user.setId(50);
user.setUsername("mybatis update01");
user.setAddress("3307");
user.setSex("女");
user.setBirthday(new Date());
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产的SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession对象创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
userDao.updateUser(user);
session.commit();
//6.释放资源
session.close();
in.close();
}
/**
* 测试删除操作
*/
@Test
public void testDelete() throws Exception{
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产的SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession对象创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
userDao.deleteUser(52);
session.commit();
//6.释放资源
session.close();
in.close();
}
/**
* 测试根据ID查找
*/
@Test
public void testFindOne() throws Exception{
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产的SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession对象创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
User user = userDao.findById(46);
session.commit();
System.out.println(user);
//6.释放资源
session.close();
in.close();
}
/***
* 根据名称模糊查询
*/
@Test
public void testfindUserByName() throws Exception{
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产的SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession对象创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findUserByName("%王%");
for(User user:users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
/**
* 查询用户总数量
*/
@Test
public void testfindTotalUser() throws Exception{
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产的SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession对象创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
int total = userDao.findTotalUser();
System.out.println(total);
//6.释放资源
session.close();
in.close();
}
}
2.多表查询
2.1多对一
User实体类
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
//一对多关系映射 主表实体应该包含从表实体的集合引用
private List<Account> accounts;
public List<Account> getAccounts() {
return accounts;
}
public void setAccounts(List<Account> accounts) {
this.accounts = accounts;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
Account实体类
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
/**
* 要表现出一对多的关系:从表实体应该包含一个主表的对象引用
* 并且提供set和get的方法
*/
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", uid=" + uid +
", money=" + money +
", user=" + user +
'}';
}
}
配置SqlMapConfig.xml 配置相关内容 并指定带有注解的dao接口
<mappers>
<package name="com.itheima.dao"></package>
</mappers>
IAccountDao
public interface IAccountDao {
/**
* 查询所有的账户,并且获取每个账户所属的用户信息
*/
@Select("select * from account")
@Results(id="accountMap",value = {
@Result(id=true,column = "id",property = "id"),
@Result(column = "uid",property = "uid"),
@Result(column = "money",property = "money"),
@Result(property = "user",column = "uid",one = @One(select = "com.itheima.dao.IUserDao.findById",fetchType = FetchType.EAGER)),
//多对一 其中是@One ,一对多则是@Many
})
List<Account> findAll();
List<Account> findAll();
@Select("select * from account where uid=#{id}")
List<Account> findAccountById(Integer id);
}
IUserDao
public interface IUserDao {
/**
* 查询所有
* @return
*/
@Select("select * from user")
@Results(id="userMap",value = {
@Result(id=true,column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "address",property = "address"),
@Result(property = "sex",column = "sex"),
@Result(column = "birthday",property = "birthday"),
@Result(column = "id",property = "accounts",
many = @Many(select = "com.itheima.dao.IAccountDao.findAccountById",
fetchType = FetchType.LAZY))
})
List<User> findAll();
/**
* 根据用户ID查询信息
*/
@Select("select * from user where id=#{id}")
User findById(Integer userid);
测试类
AccountTest
public class AccountTest {
@Test
public void testSelect() throws Exception{
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产的SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession对象创建Dao接口的代理对象
IAccountDao userDao = session.getMapper(IAccountDao.class);
//5.使用代理对象执行方法
List<Account> accounts = userDao.findAll();
for (Account account : accounts) {
System.out.println("-----每个账户信息-----");
System.out.println(account);
System.out.println(account.getUser());
}
//6.释放资源
session.close();
in.close();
}
}
运行结果

测试类
UserTest
public class UserTest {
@Test
public void testSelect() throws Exception{
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产的SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession对象创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println("-----每个用户信息-----");
System.out.println(user);
System.out.println(user.getAccounts());
}
//6.释放资源
session.close();
in.close();
}
}
运行结果

本文介绍了如何在MyBatis中使用注解进行单表操作,如CRUD,并演示了多对一关联的案例,通过实例展示了如何配置SqlMapConfig.xml和编写测试类。
845





