MyBatis中的连接池。
连接池
用于存储连接的一个容器,减少获取连接所消耗的时间。
容器其实就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到统一连接。该集合还必须实现队列的特征:先进先出。
MyBatis连接池
配置位置
主配置文件SqlMapConfig.xml中的dataSource标签,type表示使用何种连接池的方式。
Type取值
-
POOLED
:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现。 -
UNPOOLED
:采用传统的获取连接的方式,虽然也实现javax.sql.DataSource接口,但是并没有使用池的思想。 -
JNDI
:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样的。注意,如果不是Web或者Maven的war工程,是不能使用的。
MyBatis中的动态SQL语句
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
if
标签的使用
如果这个时候我们有一个需求,就是根据传入的实体类,判断哪些属性不为空,并以此作为查询条件,那么我们就可以用到了if
标签。
-
定义接口方法
1
List<User> findUserByCondition(User user);
-
配置映射文件
1
2
3
4
5
6<select id="findUserByCondition" resultType="top.tyzhang.domain.User" parameterType="top.tyzhang.domain.User">
select * from userm where 1=1
<if test="username!=null">
and username=#{username}
</if>
</select>多个条件
1
2
3
4
5
6
7
8
9<select id="findUserByCondition" resultType="top.tyzhang.domain.User" parameterType="top.tyzhang.domain.User">
select * from userm where 1=1
<if test="username!=null">
and username=#{username}
</if>
<if test="birthday != null">
and birthday = #{birthday}
</if>
</select>注意:这里加上
WHERE 1 =1
是防止所有条件都为空时拼接 SQL 语句出错。因为不加上1 = 1
这个恒等条件的话,如果后面查询条件都没拼接成功,那么 SQL 语句最后会带有一个WHERE
关键字而没有条件,不符合 SQL 语法。- 如果 test 有多个条件,那么必须使用 and 进行连接,而不能使用 Java 中的 && 运算符。
- test 中的参数名称必须与实体类的属性保持一致,也就是和 #{参数符号} 保持一致。
- 如果判断条件为字符串,那么除了判断是否为 null 外,最好也判断一下是否为空字符串,‘’ ,防止 SQL语句将其作为条件查询。
-
测试代码
1
2
3
4
5User user=new User();
user.setUsername("老王");
List<User> users=userDao.findUserByCondition(user);
for (User userq:users)
System.out.println(userq);
where
标签的使用
使用where
标签优化WHERE 1 = 1
1 | <select id="findUserByCondition" resultType="top.tyzhang.domain.User" parameterType="top.tyzhang.domain.User"> |
foreach
标签的使用
SELECT \* FROM user WHERE id IN(41,42,43);
在QueryVo
中存放一个List
1 | <select id="findUserInIds" resultType="top.tyzhang.domain.User" parameterType="top.tyzhang.domain.QueryVo"> |
测试
1 |
|
sql
标签使用
定义sql
语句
1 | <sql id="defaultSql"> |
引用
1 | <!-- 根据id集合查询用户 --> |
其他标签
多表查询
一对多
以用户和账户为例子,一个用户可以有多个账户,一个账户只能属于一个用户。
建立Account的子类AccountUser实现(实际用的不多)
1 | # 创建用户表 |
1 | public class Account implements Serializable { |
1 | public interface IAccountDao { |
1 | public class AccountUser extends Account{ |
1 | <!--查询所有账户,并且带有用户名称和地址信息--> |
1 |
|
建立实体类关系的方式
在findAll
基础上改进
1 | public class Account implements Serializable { |
1 | <resultMap id="accountUserMap" type="top.tyzhang.domain.Account"> |
1 |
|
多对多
https://blog.csdn.net/a1092882580/article/details/104152566
JNDI
JNDI: Java Naming and Directory Interface是SUN公司推出的一套规范,属于JavaEE技术之一,目的是模仿Windows系统中的注册表。
WAR工程的配置
1 | <dataSource type="JNDI"> |
参考
https://blog.csdn.net/a1092882580/article/details/104086181