SQL语句查询一个数据表所有字段的类型:desc [table name]
表之间的关系
一对多
一对一
多对一
多对多
mybatis多表查询
步骤:
1.建立两个表:用户表,和账户表(一个用户对应多个账户)
2.对应两个表的实体类,体现多对一和一对一
public class account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
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 +
'}';
}
}
用户实体类
public class User implements Serializable {
private Integer id;
private String username;
private Integer age;
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
'}';
}
}
将用户对象封装到类中
public class AccountAndUser implements Serializable {
private Integer id;
private Integer uid;
private Double money;
private 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;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "AccountAndUser{" +
"id=" + id +
", uid=" + uid +
", money=" + money +
", user=" + user +
'}';
}
}
使用的方法结合用户和账号信息
public class AccountUser extends account implements Serializable {
private String username;
private Integer age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return super.toString()+"AccountUser{" +
"username='" + username + '\'' +
", age=" + age +
'}';
}
}
3.建立两个对应的配置文件
<?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>
<properties resource="db.properties">
</properties>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="jdbc"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/dao/IAcount.xml"></mapper>
</mappers>
</configuration>
4.实现配置文件:查询用户时得到账户信息,查询账户时得到用户信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.Dao.IAccount">
<!--定义将user封装到对象中-->
<resultMap id="accountMapUser" type="com.User.AccountAndUser">
<id property="id" column="id"></id>
< result property="uid" column="uid"/>
<result property="money" column="money"/>
<!--建立一对一的关系映射 ,配置封装user-->
<association property="user" column="uid" javaType="com.User.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="age" column="age"/>
</association>
</resultMap>
<!-- SELECT u.*, a.money FROM user1 u , account a where a.uid = u.id-->
<!-- 使用上面创建的rsultMap建立封装的对象这个语句和下面的语句都能实现一样的效果accountMapU serselect * from account-->
<select id="findUserAndAccount" resultMap="accountMapUser">
SELECT u.*, a.money FROM user1 u , account a where a.uid = u.id
</select>
<select id="findAll" resultType="com.User.account">
select * from account
</select>
<!--查询所用用户名称及账户-->
<select id="findAllAccount" resultType="com.User.AccountUser">
SELECT u.*, a.money FROM user1 u , account a where a.uid = u.id
</select>
</mapper>
5测试类
/**
* @Author: zheng
* @Data :2019/11/4 19:51
*/
public class AccountTest {
IAccount iDao;
SqlSession sqlSession;
InputStream in;
@Before
public void init() throws IOException {
in = Resources.getResourceAsStream("SqlConfigMap.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
sqlSession = sqlSessionFactory.openSession();
iDao = sqlSession.getMapper(IAccount.class);
}
@After
public void destroy() throws IOException {
sqlSession.close();
in.close();
}
@Test
public void testAccount() {
List<account> list = iDao.findAll();
for (account a : list) {
System.out.println(a);
}
}
/**
* 查询所用用户名称及账户
*/
@Test
public void testAccountUser() {
List<AccountUser> list = iDao.findAllAccount();
for (AccountUser a : list) {
System.out.println(a);
}
}
@Test
public void testAccountAndUser() {
List<AccountAndUser> list = iDao.findUserAndAccount();
for (AccountAndUser a : list) {
System.out.println(a);
}
}
}
多对多
SELECT u.*, r.id as rid ,r.role_name,r.role_desc
from role r
LEFT OUTER JOIN user_role ur ON r.id = ur.rid
LEFT OUTER JOIN user1 u ON u.id = ur.uid
实例 : 用户和角色
1.建立两个表:账户表,角色表(一个用户对应多个账户) 需要使用中间表包含各自的主键
中间表
CREATE TABLE user_role
(
uid int NOT NULL,
rid int NOT NULL,
PRIMARY KEY (uid, rid),
FOREIGN KEY (uid) REFERENCES role(id),
FOREIGN KEY (uid) REFERENCES user1(id)
)ENGINE = InnoDB DEFAULT CHARSET = utf8;
2.对应两个表的实体类,体现多对多,各自包含对方的对象引用
public class User implements Serializable {
private Integer id;
private String username;
private Integer age;
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
'}';
}
}
角色类
public class Role implements Serializable {
// 一个角色可以赋予多个用户
private Integer id;
private String role_name;
private String role_desc;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRole_name() {
return role_name;
}
public void setRole_name(String role_name) {
this.role_name = role_name;
}
public String getRole_desc() {
return role_desc;
}
public void setRole_desc(String role_desc) {
this.role_desc = role_desc;
}
@Override
public String toString() {
return "Role{" +
"id=" + id +
", role_name='" + role_name + '\'' +
", role_desc='" + role_desc + '\'' +
'}';
}
}
结果集查看
public class UserAndRole {
// 一个角色可以赋予多个用户
private Integer id;
private String role_name;
private String role_desc;
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRole_name() {
return role_name;
}
public void setRole_name(String role_name) {
this.role_name = role_name;
}
public String getRole_desc() {
return role_desc;
}
public void setRole_desc(String role_desc) {
this.role_desc = role_desc;
}
@Override
public String toString() {
return "Role{" +
"id=" + id +
", role_name='" + role_name + '\'' +
", role_desc='" + role_desc + '\'' +
", users=" + users +
'}';
}
}
3.建立两个对应的配置文件
映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.Dao.IRoleDao">
<resultMap id="roleMap" type="com.User.Role">
<id property="id" column="id" />
<result property="role_name" column="role_name"/>
<result property="role_desc" column="role_desc"/>
</resultMap>
<resultMap id="roleMap1" type="com.User.UserAndRole">
<id property="id" column="rid" />
<result property="role_name" column="role_name"/>
<result property="role_desc" column="role_desc"/>
<collection property="users" ofType="com.User.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="age" column="age"/>
</collection>
</resultMap>
<select id="findRole" resultMap="roleMap">
select * from role
</select>
<select id="findRoleAndUser" resultMap="roleMap1">
SELECT u.*, r.id as rid ,r.role_name,r.role_desc
from role r
LEFT OUTER JOIN user_role ur ON r.id = ur.rid
LEFT OUTER JOIN user1 u ON u.id = ur.uid
</select>
</mapper>
4.实现配置文件:查询用户时得到角色信息,
查询角色时得到用户信息
public interface IRoleDao {
/**
* 查询所有角色
*/
List<Role> findRole();
/**
* 查询所有角色和关联的用户
*/
List<UserAndRole> findRoleAndUser();
}
5.测试类
public class RoleTest {
IRoleDao iDao;
SqlSession sqlSession;
InputStream in;
@Before
public void init() throws IOException {
in = Resources.getResourceAsStream("SqlConfigMap.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
sqlSession = sqlSessionFactory.openSession();
iDao = sqlSession.getMapper(IRoleDao.class);
}
@After
public void destroy() throws IOException {
sqlSession.close();
in.close();
}
@Test
public void testRole()
{
List<Role> list = iDao.findRole();
for (Role a : list) {
System.out.println(a);
}
}
@Test
public void testRoleAndUser()
{
List<UserAndRole> list = iDao.findRoleAndUser();
for (UserAndRole a : list) {
System.out.println(a);
}
}
从用户查询角色
首先需要将
SQL语句改成
SELECT u.*, r.id as rid ,r.role_name,r.role_desc
from user1 u
LEFT OUTER JOIN user_role ur ON u.id = ur.rid
LEFT OUTER JOIN role r ON r.id = ur.uid
反过来查询
然后新建一个类继承User 封装角色也就是Role
public class RoleAndUser extends User {
private List<Role> list;
public List<Role> getList() {
return list;
}
public void setList(List<Role> list) {
this.list = list;
}
@Override
public String toString() {
return super.toString()+"RoleAndUser{" +
"list=" + list +
'}';
}
}
修改映射文件
<resultMap id="roleMap2" type="com.User.RoleAndUser">
<id property="id" column="id" />
<result property="username" column="username"/>
<result property="age" column="age"/>
<collection property="list" ofType="com.User.Role">
<id property="id" column="rid"/>
<result property="role_name" column="role_name"/>
<result property="role_desc" column="role_desc"/>
</collection>
</resultMap>
<select id="findRoleAnd" resultMap="roleMap2">
SELECT u.*, r.id as rid ,r.role_name,r.role_desc
from user1 u
LEFT OUTER JOIN user_role ur ON u.id = ur.rid
LEFT OUTER JOIN role r ON r.id = ur.uid
</select>
测试方法
@Test
public void testRoleAnd()
{
List<RoleAndUser> list = iDao.findRoleAnd();
for (RoleAndUser a : list) {
System.out.println(a);
}
}
网友评论