文章目录
项目目录
导入maven坐标
<!-- mybatis框架-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- 连接数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!-- 测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
创建account表
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`date` datetime NULL DEFAULT NULL,
`money` float(255, 0) NULL DEFAULT NULL,
PRIMARY KEY (`id`, `uid`) USING BTREE,
INDEX `a_uid`(`uid`) USING BTREE,
CONSTRAINT `a_uid` FOREIGN KEY (`uid`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
INSERT INTO `account` VALUES (1, 1, '2020-04-27 16:25:57', 100);
INSERT INTO `account` VALUES (2, 1, '2020-04-27 16:26:02', 1000);
INSERT INTO `account` VALUES (3, 2, '2020-04-27 16:26:05', 200);
INSERT INTO `account` VALUES (4, 2, '2020-04-27 16:26:08', 2000);
创建user表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
INSERT INTO `user` VALUES (1, 'aaa');
INSERT INTO `user` VALUES (2, 'bbb');
INSERT INTO `user` VALUES (3, 'ccc');
INSERT INTO `user` VALUES (4, 'ddd');
INSERT INTO `user` VALUES (5, 'eee');
实体类
账户类Acount.java
public class Account {
private Integer id;
private Integer uid;
private Date date;
private Float money;
//从表实体应该包含一个主表实体的对象引用
private User user;
//Setter
//Getter
//toString
}
用户类User.java
public class User {
private Integer id;
private String username;
//一对多关系映射:主表方法应该包含一个从表方的集合引用
private List<Account> accounts;
//Setter
//Getter
//toString
}
mybatis配置文件SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射信息-->
<mappers>
<mapper class="com.cenzn.dao.IUserDao"/>
<mapper class="com.cenzn.dao.IAccountDao"/>
</mappers>
</configuration>
常用的注解
@Results相当于mybatis中xml配置中的resultMap(封装一些对象)
@Many: 用于一对多或多对多查询使用
@selec:查询用户的唯一标识
@column:用户根据id查询账户是所需要的参数
@fetchType:指定延时查询FetchType.LAZY或立即查询FetchType.EAGER
一对一(每个账户只有一个用户)
IAccount.java
public interface IAccountDao {
/**
* 查询所有账户
* @return
*/
@Select("select * from account")
@Results(id = "accountMap",
value = {
@Result(id = true,column = "id",property = "id"),
@Result(column = "uid",property = "uid"),
@Result(column = "date",property = "date"),
@Result(column = "uid",property = "user",
one = @One(select = "com.cenzn.dao.IUserDao.findUserById",
fetchType = FetchType.LAZY
)
)
})
public List<Account> findAccountAll();
}
IUser.java
public interface IUserDao {
//根据Id查询用户
@Select("select * from user where id =#{uid}")
@Results(id = "userMap",
value = {
@Result(id = true ,column = "id",property = "id"),
@Result(column = "username",property = "name")
})
User findUserById(Integer id);
}
测试
@Test
public void findAccountTest() throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
IAccountDao accountDao = session.getMapper(IAccountDao.class);
//6.使用代理对象执行查询所有方法
List<Account> accounts =accountDao.findAccountAll();
for (Account account : accounts){
System.out.println("==========每个account的信息=============");
System.out.println(account);
System.out.println(account.getUser());
}
//7.释放资源
session.close();
in.close();
}
运行结果
一对多(一个用户可以有多个账户)
IUserDao.java
public interface IUserDao {
@Select("select * from user")
@Results(id = "userMap",
value = {
@Result(id = true,column = "id",property = "id"),
@Result(column = "username" ,property = "name"),
@Result(column = "id",property = "accounts",
many = @Many(select = "com.cenzn.dao.IAccountDao.findAccountById",
fetchType = FetchType.LAZY
)
)
})
List<User> findUserAll();
IAccountDao.java
public interface IAccountDao {
@Select("select * from account where uid = #{id}")
public List<Account> findAccountById(Integer id);
测试
@Test
public void findUserTest() throws IOException {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession(true);
IUserDao UserDao = session.getMapper(IUserDao.class);
List<User> users = UserDao.findUserAll();
for (User user : users){
System.out.println("---------------------每个用户拥有的账户---------------------");
System.out.println(user);
System.out.println(user.getAccounts());
}
}