mybatis数据库连接池和sql高级

(1)连接池就是用于存储连接的容器,容器就是一个集合对象,必须是线程安全的,不能两个线程拿到同一个连接,该集合具有队列特性:先进先出

(2)mybatis连接池提供了3种配置方式

         主配置文件在Maven工程中,在resources文件下,名称为:SqlMapConfig.xml中的DataSource标签,type属性的取值有:

                        POOLED:            采用传统的javax.sql.DataSource规范中的连接池,mybatis有针对规范的实现

                       UNPOOLED:        采用传统的获取连接的方式,虽然也实现了javax.sql.DataSource接口,但是并没有实现池的思想

                       JNDI:                    采用服务器提供的JNDI技术实现获取DataSource对象,不同的服务器所能拿到的DataSource对象不一样。

                                                                如果不是web或者Maven的jar工程,是不能使用的

  (3)<mapper namespace="cn.rzpt.dao.IUserDao">:对应谁的Dao就写谁的namespace

(4)传入未知参数的xml写法  if标签:

<mapper namespace="cn.rzpt.dao.IUserDao">
<!--在这里,使用if进行判断时,只能使用and符号,不能是两个与符号-->
    <select id="findUserByCondition" resultType="cn.rzpt.domain.User" parameterType="cn.rzpt.domain.User">
        select * from user where 1=1
        <if test="username != null">
            and username = #{username}
<!--这里面需要区分大小写,要与实体类的写法一致-->
        </if>
       <if test="sex != null">
           and sex = #{sex}
       </if>
    </select>
</mapper>

where标签:

<select id="findUserByCondition" resultType="cn.rzpt.domain.User" parameterType="cn.rzpt.domain.User">
    select * from user
    <where>
        <if test="username != null">
            and username = #{username}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
    </where>
</select>

需要写VO:

public class QueryVO {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

接口

List<User> findUserByVo(QueryVO vo);

//根据传入的参数条件查询:姓名,性别,地址...,有其一,其二等,或者全部
List<User> findUserByCondition(User user);

测试类

@Test
public void testFindByCondition(){
    User user = new User();
    user.setUsername("老王");
    List<User> users = userDao.findUserByCondition(user);

    for (User u : users){
        System.out.println(u);
    }
}

(5)foreach:传入多个参数,id in(....)

<mapper namespace="cn.rzpt.dao.IUserDao">
    <!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
    <resultMap id="userMap" type="cn.rzpt.domain.User">
        <!-- 主键字段的对应 -->
        <id property="id" column="id"></id>
        <!--非主键字段的对应,property要与实体类属性一致,column要与数据库一致,在Linux下,列名区分大小写-->
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
    </resultMap>

    <!--抽取重复的sql语句-->
    <sql id="defaultUser">
        <!--如果后面还有其他语句,此时不要在写分号,要不然会报错-->
        select * from user
    </sql>

    <!--根据queryvo中的id集合实现查询用户列表-->
    <select id="findUserInIds" resultMap="userMap" parameterType="cn.rzpt.domain.QueryVO">
        <!--select * from user-->
        <include refid="defaultUser"></include>
        <where>
            <if test="ids != null and ids.size()>0">
                <foreach collection="ids" open="and id in(" close=")" item="id" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>


</mapper>
public class QueryVO {
    private User user;

    private List<Integer> ids;

    public List<Integer> getIds() {
        return ids;
    }

    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}
public interface IUserDao 中增加
/**
 * 根据queryvo中提供的id集合,查询用户信息
 * @param vo
 * @return
 */
List<User> findUserInIds(QueryVO vo);

测试类

@Test
public void testFindInIds(){
    QueryVO vo = new QueryVO();
    List<Integer> list = new ArrayList<Integer>();
    list.add(41);
    list.add(43);
     vo.setIds(list);

    List<User> users = userDao.findUserInIds(vo);

    for (User u : users){
        System.out.println(u);
    }
}

猜你喜欢

转载自blog.csdn.net/sky2line/article/details/109349941