JavaBean中属性名和字段名不一致的情况处理
1.处理方式:SQL语句中使用别名,别名和JavaBean属性名保持一致(用的少)
2.处理方式:使用resultMap配置字段名和属性名的对应关系(推荐)
SqlMapConfig.xml核心配置文件
properties属性(了解)
可以在SqlMapConfig.xml中引入properties文件的配置信息,实现配置的热插拔效果。
例如:
有jdbc.properties配置文件在resource下
SqlMapConfig.xml配置如下:
注意加载顺序
typeAlias类型的别名
类型别名:是Mybatis为java类型设置的一个短名称的,目的仅仅是为了减少沉余
注意:类型别名不区分大小写
Mybatis提供的别名有:
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
自定义类型别名:
例如:自定义的javaBean,全限定类名太长,可以自定义类型的别名
给一个类指定别名
在映射器里面使用类型别名
指定一个包名
在SqlMapConfig.xml中为一个package下所有类注册别名:类名即别名
注意这个别名是:javaBean的类名
在映射器里面使用类型的别名
mappers映射器
用来配置映射器的接口的配置文件的位置,或者映射器接口的权限定的类名
使用最好的是package的使用方式。
SQL的动态拼接
<if>标签
需求实现
注意:
1.<where>标签代替了where 1=1
2.<where>标签内拼接的SQL没有变化,每个if的SQL中的都有and
3.使用<where>标签时,Mybatis会自动处理掉条件中的第一个and以保证SQL语法的正确
<foreach>标签
语法
需求描述
QueryVO中有一个属性ids, 是id值的集合。根据QueryVO中的ids查询用户列表。
QueryVO类如下:
public class QueryVO {
private Integer[] ids;
public Integer[] getIds() {
return ids;
}
public void setIds(Integer[] ids) {
this.ids = ids;
}
}
3.3.3 需求实现
1) 在映射器接口UserDao中增加方法
List<User> findByIds(QueryVO vo);
2) 在映射配置文件UserDao.xml中添加statement
<!--在核心配置文件中已经使用package配置了类型别名--> <select id="findByIds" resultType="user" parameterType="queryvo"> select * from user <where> <foreach collection="ids" open="and id in (" item="id" separator="," close=")"> #{id} </foreach> </where> </select>
3) 在单元测试类中编写测试代码
@Test public void testFindUserByIdsQueryVO(){ QueryVO vo = new QueryVO(); vo.setIds(new Integer[]{41, 42}); List<User> userList = dao.findByIds(vo); for (User user : userList) { System.out.println(user); } }
<sql>标签
在映射配置文件中,我们发现有很多SQL片段是重复的,比如:select * from user
。Mybatis提供了一个<sql>
标签,把重复的SQL片段抽取出来,可以重复使用。
语法介绍
多表查询
1. 多表关系
1.1 多表之间的关系
-
一对一:少,通常可以合并成一张表
-
为了效率考虑:
-
有一张大表,100个字段。80%的概率,只要使用它的20个字段;
-
可以把表拆分成两张表:常用字段一张表,不常用字段一张表
-
-
为了业务区分:
-
有一张大表,表里有用户本身的数据,有用户帐号信息(只考虑一个用户对一个帐号的情况)
-
有大表如下:
-
拆分成两张小表如下:
-
-
-
-
一对多:用户和订单,分类和商品。通过外键维护一对多关系
-
一个用户对应多个订单
-
一个订单对应一个用户
-
-
多对多:老师和学生,学生和课程,订单和商品。通过一张中间关系表,维护多对多关系
1.2 Mybatis操作多表
-
对一:一个订单对应一个用户,一个商品对应一个分类
-
一对一和多对一,都属于对一
-
创建实体JavaBean的时候,在JavaBean里有一的一方的JavaBean引用
-
比如:一个订单对应一个用户,创建的JavaBean:
class Orders{ private Integer oid; private Double money; private Integer uid; //一个订单对应一个用户,那么在Orders对象里就有一个User对象的引用 private User user; } class User{ private Integer id; private String username; //... }
-
-
-
对多:一个用户对应多个订单,一个分类对应多个商品
-
一对多和多对多,都属于对多
-
创建实现JavaBean的时候,在JavaBean里有多的一方的JavaBean集合
-
比如:一个用户对应多个订单,创建的JavaBean:
class User{ private Integer id; private String username; //... //一个用户对应多个订单,那么在User对象里就有一个Orders的集合 private List<Orders> orderList; } class Orders{ private Integer oid; private Double money; //... }
-
-
2. 多表查询语句
-
查询的技巧
-
找数据所在的表,有哪些
-
找这些表之间的关联条件
-
使用关联条件,把多表合并成一张大表
-
从合并后的大表里,进行单表查询筛选
-
-
查询的语法
-
内连接:查询表之间必定有关联的数据
-
外连接:查询一张表的全部数据,及另外一张表的关联数据
-
子查询:是查询技巧,没有固定语法。查询嵌套
-
内容回顾
-
能够解决:查询时,JavaBean的属性名和表字段名不一致的问题
-
方案一:SQL语句里,给字段起别名,别名等于属性名(用的少)
-
方案二:使用resultMap手动设置字段名和属性名的对应关系
-
在映射配置文件的statement里
<select id="" parameterType="" resultMap="resultMap的唯一标识"> sql语句 </select> <resultMap id="唯一标识" type="JavaBean对象"> <!-- id:用于配置主键字段映射;result用于配置普通字段映射 --> <id property="属性名" column="字段名"/> <result property="属性名" column="字段名"/> </resultMap>
-
-
-
能够使用传统方式,实现CURD功能
-
相关类:
-
操作数据库:
SqlSession
-
随用随取,用完就关,一定要关
-
方法:
-
selectList
:查询多个 -
selectOne
:查询一个 -
insert
-
update
-
delete
-
-
-
获取SqlSession:
SqlSessionFactory
-
通常是单例模式,一个项目里只要有一个工厂即可
-
-
获取SqlSessionFactory:
SqlSessionFactoryBuilder
-
只要构造者已经构造成功了工厂对象,构造者就可以垃圾回收了
-
-
-
使用的模式:
-
映射器接口:必须提供
-
映射配置文件:必须提供
-
映射器接口的实现类对象:
class XXXDaoImpl implements XXXDao{ private SqlSessionFactory factory; public XXXDaoImpl(SqlSessionFactory factory){ this.factory = factory; } //...其它方法 }
-
-
-
核心配置文件里:
-
配置类型别名:
<typeAliases> <!-- 指定包里的所有类都注册别名,类名即别名。别名不区分大小写 --> <package name="com.itheima.domain"></package> </typeAliases>
-
配置映射器:
<mappers> <!-- 指定包里所有的映射器都自动注册 --> <package name="com.itheima.dao"/> </mappers>
-
-
数据源和事务:了解原理和源码
-
SQL深入:
<select id="search2" parameterType="queryVo" resultType="user"> <include refid="selectUser"/> <where> <if test="idArray != null and idArray.length > 0"> <foreach collection="idArray" open=" and id in(" item="id" separator="," close=")"> #{id} </foreach> </if> <if test="user.username != null and user.username != ''"> and username like #{user.username} </if> <if test="user.sex != null and user.sex != ''"> and sex = #{user.sex} </if> </where> </select>