学习笔记_mybatis03_动态sql和多表操作

mybatis的连接池技术与事务深入

mybatis有自己的连接池技术

在mybatis的SqlMapConfig.xml配置文件中,通过dataSource type="POOLED"实现mybatis的连接池配置。
mybatis的数据源dataSource分为 UNPOOLED POOLED JNDI三类。

mybtis的事务控制

正常情况下我们通过sqlSession.commit();提交事务,不过mybatis可以设置自动提交:
通过修改sqlSession = factory.openSession();的值为true可以设置事务的自动提交。但这种方法不够灵活所以不常用。

动态sql语句

if标签

持久层dao接口

 //根据条件查询
    List<User> findByCondition(User user);

持久层 dao映射配置

<select id="findByCondition" resultType="com.itheima.domain.User" parameterType="com.itheima.domain.User">
        select * from user where 1=1
        <if test="username!=null">
            and username=#{username}
        </if>
    </select>

测试

 //根据条件查询
    @Test
    public void findByCondition(){
        User u =new User();
        u.setUsername("老王");
        List<User> users = userDao.findByCondition(u);
        for (User user:users
        ) {
            System.out.println(user);
        }
    }

where标签

用where标签可以把where 1=1 简化

<select id="findByCondition" resultType="com.itheima.domain.User" parameterType="com.itheima.domain.User">
    <where>
        select * from user
        <if test="username!=null">
            and username=#{username}
        </if>
    </where>
    </select>

foreach标签

需求

当传入多个id查询用户信息的时候要将集合中的值作为动态参数添加进来。
例如:用于多个查询的sql
select * from user where id in(41,42,46)
这时可以通过foreach实现参数的传递。

在Queryvo中加入一个List集合来封装参数
在Queryvo方法中添加一个List<> 属性ids并添加getset方法。

dao接口

    //根据queryvo中提供的id集合,查询用户信息
    List<User> findUserInIds(QueryVo vo);

持久层 dao映射配置

<select id="findUserInIds" resultType="com.itheima.domain.User" parameterType="queryvo">
        select * from user
        <where>
            <if test="ids != null and ids.size()>0">
                <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>

foreach标签的属性:
collection:代表要遍历的集合元素
open:开始部分
close:结束部分
item:遍历集合的每个元素,生成的变量名
sperator:分隔符

测试

//测试foreach标签的使用
    @Test
    public void tsetFindInIds() {
        QueryVo vo = new QueryVo();
        List<Integer> list = new ArrayList<>();
        list.add(41);
        list.add(42);
        list.add(43);
        vo.setIds(list);
        List<User> users = userDao.findUserInIds(vo);
        for (User user : users
        ) {
            System.out.println(user);
        }
    }

多表操作

一对一

方法一

在Account实体类中声明user对象并生成get set方法。
在持久层接口中

public interface IAccountDao {
    //查询所有账户
    List<Account> findAll();
}

重新配置AccountDao文件

    <!--定义封装account和user的resultMap-->
    <resultMap id="accountUserMap" type="account">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--一对一的关系映射,配置封装user的内容-->
        <association property="user" column="uid" javaType="User">
            <id property="id" column="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
            <result column="sex" property="sex"></result>
            <result column="birthday" property="birthday"></result>
        </association>
    </resultMap>
    <!-- 查询所有 -->
    <select id="findAll" resultMap="accountUserMap">
        select u.*,a.id as aid,a.uid,a.money from account a ,user u where u.id=a.uid;
    </select>

测试类

    //测试查询所有
    @Test
    public void testFindAll(){
        List<Account> accounts = accountDao.findAll();
        for (Account account : accounts) {
            System.out.println("每个account的信息");
            System.out.println(account);
            System.out.println(account.getUser());
        }
    }

方法二(简单)

定义一个AccountUser类

public class AccountUser extends Account {
    private String username;
    private String address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return super.toString()+"AccountUser{" +
                "username='" + username + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

继承了Account类,可以输出两个类中的信息。

dao接口

    //查询所有账户并且带有用户名称和地址信息
    List<AccountUser> findAllAccount();

定义配置信息

<!-- 查询所有账户并且带有用户名称和地址信息  -->
    <select id="findAllAccount" resultType="accountuser">
        select a.*,u.username,u.address from account a ,user u where u.id=a.uid;
    </select>

resultType="accountuser是 因为查询结果中包含账户信息和用户信息。
测试

//查询所有账户并且带有用户名称和地址信息
    @Test
    public void testFindAllAccountUser() {
        List<AccountUser> aus = accountDao.findAllAccount();
        for (AccountUser au : aus) {
            System.out.println(au);
        }
    }

一对多

sql语句
select * from user u left outer join account a on u.id = a.uid
在User类中加入List<Account>和其setget方法
private List<Account> accounts;
Userdao

    //查询所有用户
    List<User> findAll();

配置文件

    <!--定义User的resultMap-->
    <resultMap id="userAccountMap" type="user">
        <id property="id" column="id"></id>
        <result column="username" property="username"></result>
        <result column="address" property="address"></result>
        <result column="sex" property="sex"></result>
        <result column="birthday" property="birthday"></result>
        <collection property="accounts" ofType="account">
            <id column="aid" property="id"></id>
            <result column="uid" property="uid"></result>
            <result column="money" property="money"></result>
        </collection>
    </resultMap>
    <!-- 查询所有 -->
    <select id="findAll" resultMap="userAccountMap">
        select * from user u left outer join account a on u.id = a.uid
    </select>

测试

   //测试查询所有
    @Test
    public void testFindAll() {
       List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println("每个用户的信息");
            System.out.println(user);
            System.out.println(user.getAccounts());
        }
    }

多对多

sql语句
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 user u on u.id=ur.uid
注意其中每行末尾的空格

配置文件

   <!--定义role表的resultMap-->
    <resultMap id="roleMap" type="role">
        <id property="roleId" column="rid"></id>
        <result property="roleName" column="role_name"></result>
        <result property="roleDesc" column="role_desc"></result>
        <collection property="users" ofType="user">
            <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="address" column="address"></result>
            <result property="sex" column="sex"></result>
            <result property="birthday" column="birthday"></result>
        </collection>
    </resultMap>
    <!--查询所有-->
    <select id="findAll" resultMap="roleMap">
        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 user u on u.id=ur.uid
    </select>

测试

@Test
    public void findAll(){
        List<Role> roles  = roleDao.findAll();
        for (Role role:roles
             ) {
            System.out.println("=====每个角色的信息=====");
            System.out.println(role);
            System.out.println(role.getUsers());
        }
    }
发布了33 篇原创文章 · 获赞 0 · 访问量 504

猜你喜欢

转载自blog.csdn.net/naerjiajia207/article/details/103421799
今日推荐