- 常用标签的介绍
- mybatis配置文件的标签
Properties
resource: 直接可以获取类路径 <properties resource=”jdbc.properties” />
url: 指定文件所在位置的绝对路径
<properties url=”d:/a/b/jdbc.properties” />
使用properties配置时有两种方式
方式一:
<properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/test"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
方式二:
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
typeAliases
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="user" type="com.tledu.zrz.pojo.User"/>
<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) -->
<package name="com.tledu.zrz.pojo"/>
<package name="其它包"/>
</typeAliases>
Mappers属性
Mappers使我们所说的映射器,用于通过mybatis配置文件去找到对应的mapper文件
有三种用法
Resources
使用相对于类路径的资源
如:<mapper resource="com/tledu/mjw/mapper/UserMapper.xml" />
class
使用 mapper 接口类路径
如:<mapper class="com.tledu.mjw.mapper.UserMapper"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
Package
注册指定包下的所有 mapper 接口
如:<package name="com.tledu.zrz.mapper"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
- Mapper.xml sql标签介绍
取值属性:
#{} 取值特点:会默认将获取值加单引号,可以防止sql注入
String name = “tom”;
Select * from t_user where name = #{name}
解析后:
Select * from t_user where name = ‘tom’
可以防止sql注入
举例:
Select * from user where account = ‘admin’ and password=’123’
account= ‘’’ or 1=1 #’ and password=’’;
${} 取值特点:直接将值取出不会加引号,可能会出现sql注入的风险
select * from t_user order by id
我们在操作表结构表中的字段的时候可以使用这种取值方式
alter t_user add column sex
parameterType
作用:用来接收出入参数的类型
如果在mybatis中已经有注册的别名那么我们就可以直接使用
如下图
如果没有注册,那么我们一般写类型的全类名,获取我们自定义别名
resultType
作用:用来设置返回数据的数据类型
如果在mybatis中已经有注册的别名那么我们就可以直接使用
注意:
实体类中的名称必须与表的字段名保持一致
resultMap
作用:如果在表中的字段与接收对象的属性名不一致时,可以通过定义resultMap来实现映射。
可以实现一次封装多次调用
- Junit单元测试
作用:实现局部多个不同模块的快速测试
第一步:导入junit 包
第二部:直接在要测试的方法上加@Test注解
//在Test方法执行前调用
@Before
public void before(){
System.out.println("before");
}
//在Test方法执行后调用
@After
public void after(){
System.out.println("after");
}
//要测试运行的方法
@Test
public void test1(){
System.out.println("test");
}
- 分页
分页需要的参数:
cpage:当前页
PageSize: 分页单位
totalPage:总页数
totalCount:总条数
start: 起始值= (cpage-1) * pageSize;
核心sql: limit start,pageSize;
实现分页sql拼接需要两个参数,所以我们封装了一个Map集合,在遇到传入多个参数时要想到这种方式。在Map结合中的key值要一定与sql中取值的获取名保持一致
Map map = new HashMap();
map.put(“start”,start);
map.put(“pageSize”,pageSize);
Select * from t_user limit #{start},#{pageSize}
- 模糊查询
以前的查询:select * from t_user where username like “%a%”;
select CONCAT('a','b','c');
concat()函数就是用来拼接字符串的
where username like “%a%” and sex=’男’ and age > 18
当在where后面有多个条件的时候我们可以用and连接条件
但如果where后面的第一个条件没有那么就没办法使用and
- 动态SQL
if标签
<if test=”name != null”>
where name like concat(‘%’,#{name},’%’);
</if>
where标签
<where>
<if test=”name != null”>
where name like concat(‘%’,#{name},’%’);
</if>
<if test=”name != null”>
where name like concat(‘%’,#{name},’%’);
</if>
<where>
set标签
<set>
<if test="name != null">name=#{name},</if>
<if test="price != null">price=#{price},</if>
</set>
trim标签
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
<trim prefix="SET" suffixOverrides=",">
...
</trim>
choose、when、otherwise
<where>
<choose>
<when test="name != null">
name like concat('%',#{name},'%')
</when>
<when test="price != null and price != 0">
price > #{price}
</when>
<otherwise>
id > 1
</otherwise>
</choose>
</where>
foreach标签
item集合中每一个元素进行迭代时的别名,
open该语句以什么开始,
separator在每次进行迭代之间以什么符号作为分隔 符,
close以什么结束,
<foreach collection="list" item="ii" open="(" close=")" separator="," >
#{ii}
</foreach>
bind标签
<select id="listProductByName" parameterType="Product" resultType="Product">
<bind name="likename" value="'%' + name + '%'" />
select * from t_product where name like #{likename}
</select>
- 关联查询
一对多:一个产品类型有多个产品信息
- 想到在一的一方Category 添加多的一方属性 List<Product> products
- 创建ResultMap标签,通过collection标签将多的一方进行封装
- 注意哪张表是主表哪张表信息是从表
resultMap标签中的type属性表示主表的数据类型
Collection标签中的 ofType属性表示从表也就是多数据的数据类型
<resultMap id="categoryBean" type="Category">
<id column="cid" property="id"></id>
<result column="cname" property="name"></result>
<collection property="products" ofType="Product">
<id column="pid" property="id"></id>
<result column="pname" property="name"></result>
<result column="price" property="price"></result>
</collection>
</resultMap>
多对一:多个产品中每个产品对应了一个产品类型
- 在每个商品中添加对应的类型属性 Category category
- 创建ResultMp标签,通过association标签将对应的每个类型进行映射
- association标签中的 javaType 指定对应的映射类型 Category
<resultMap id="productBean" type="Product">
<id column="pid" property="id"></id>
<result column="pname" property="name"></result>
<!--映射对应的类型-->
<association property="category" javaType="Category">
<id column="cid" property="id"></id>
<result column="cname" property="name"></result>
</association>
</resultMap>