efcore 有值才加where_SSM框架(五):mybatis中if、where、forecah标签和mybatis连接池...

mybatis中if、where、forecah标签的使用

1、if标签

在IUserDao.xml加标签,在IUserDao.java和MybatisTest.java加方法

	<!-- if 标签的使用-->
    <select id="findUserByCondition" parameterType="user" resultMap="userMap">
        select * from user where 1=1
        <if test="userName!=null and userName != '' ">
            and username like #{userName}
        </if>
        <if test="userAddress != null">
            and address like #{userAddress}
        </if>
    </select>
	/**
     * 条件查询
     * @param user
     * @return
     */
    List<User> findUserByCondition(User user);
	/**
     * if标签和where标签的使用
     */
    @Test
    public void testFindUserByCondition(){

        User user = new User();
        user.setUserName("%王%");
        //user.setUserAddress("%顺义%");
        //5.执行查询一个方法
        List<User> users = userDao.findUserByCondition(user);
        for(User u : users){
            System.out.println(u);
        }
    }

当 user.setUserName("%王%");后,userName有值,则执行上面的sql语句拼接后的结果;

5e658463a5f4acb620bd144dc21af679.png

当 user.setUserAddress("%顺义%");后,userAddress 有值,则执行下面的sql语句拼接后的结果;

1b22b6d89878644815f7626a5c292daf.png

当二者都有值时,则两个条件都会拼接

52f35ee02e232ef36ebbd927befbb808.png

两个条件查询时显示无这样的记录

2、where标签

	<!-- where 标签的使用-->
	<select id="findUserByCondition" parameterType="user" resultMap="userMap">
        select * from user
        <where>
            <if test="userName!=null and userName != '' ">
                and username like #{userName}
            </if>
            <if test="userAddress != null">
                and address like #{userAddress}
            </if>
        </where>
    </select>

f9488187a3170fa341f650409eb9194d.png

使用 where 标签 省去了在sql语句后面拼接 where 1 = 1

3、foreach标签的使用

SQL 语句:
select 字段 from user where id in (?)
<foreach>标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符

	<!-- foreach标签的使用,根据queryvo中的Id集合实现查询用户列表 -->
    <!-- SELECT * FROM USERS WHERE id IN (41,46,51) -->
    <select id="findUserInIds" resultMap="userMap" parameterType="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="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>
	/**
     * 根据queryvo中提供的id集合,查询用户信息
     * @param vo
     * @return
     */
    List<User> findUserInIds(QueryVo vo);
	/**
     * 测试foreach标签的使用
     */
    @Test
    public void testFindInIds(){
        QueryVo vo = new QueryVo();
        List<Integer> list = new ArrayList<Integer>();
        list.add(41);
        list.add(46);
        list.add(51);
        vo.setIds(list);

        //5.执行查询所有方法
        List<User> users = userDao.findUserInIds(vo);
        for(User user : users){
            System.out.println(user);
        }
    }

fb146879a64e7326a56b99599ddd250f.png

取出了id为41,46,51的三个记录

4、include和sql标签

    <!-- 抽取重复的sql语句-->
    <sql id="defaultUser">
        select * from user
    </sql>
	
    <select id="findAll" resultMap="userMap">
        <include refid="defaultUser"></include>
    </select>

e7bf77000f2815454b19fff5d03f1b2b.png

使用include 标签来抽取重复sql也可以达到同样的查询所有的功能

mybatis中的连接池

mybatis连接池提供了3种方式的配置:

配置的位置:

主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。

type属性的取值:

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

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

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

注意:如果不是web或者maven的war工程,是不能使用的。

tomcat服务器,采用连接池是dbcp连接池。

7090e6e290018b55c7d54bf5c98ae785.png

在使用POOLED时,日志最后一行明显有将连接归还池的操作

a86f00fe745461d9e5422d4593bf8b5c.png

在使用UNPOOLED时,日志最后一行是直接关闭连接,没有池的思想

09e75aedf4f6bf2c9504c345b36dd24e.png

在使用POOLED时,查看mybatis的源码可知,mybatis会先看池中有无可用连接,如果有,直接返回一个可用连接;如果没有可用连接,且连接数还没有达到最大连接数,则创建一个连接;如果达到最大连接数,则可能会处理掉最老的连接,返回清理掉的老连接,并且获取连接的过程在synchronized代码块中,保证了多个线程不能获取同一个连接,是线程安全的。

JNDI

JNDI类似于window的注册表

1d7b144c84f78178b32497acc338524f.png

对于一个web工程,需要在项目目录下,添加srcmainwebappMETA-INF目录,并在该目录下加一个文件context.xml,里面的内容是:

<?xml version="1.0" encoding="UTF-8"?>

这样tomcat启动时,就会创建一个容器,用来存放具体的信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值