又回头来复习了
还是得做做笔记,虽然麻烦还费时间,写了也不一定看。但是时间久了真的容易忘,特别是一些细节,所以还是做下笔记吧,,给自己加深加深印象,以后说不定还可能拿出来翻翻。
我做得很乱,给自己看的,如果要做精致要花的时间更多了,亏。
但是有强迫症又加了不少格式,还是花了时间 哈哈哈
MyBatis配置文件
约束全国统一 复制就行
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="conf/dbconfig.properties"></properties>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<typeAlias type="com.atguigu.bean.Employee" alias="emp"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db2.driver}"/>
<property name="url" value="${db2.url}"/>
<property name="username" value="${db2.username}"/>
<property name="password" value="${db2.password}"/>
</dataSource>
</environment>
</environments>
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="DB2" value="db2"/>
</databaseIdProvider>
<mappers>
<!-- <mapper resource="EmployeeMapper.xml"/>
<mapper resource="TAdsWhDbwh0004Mapper.xml"/>
<mapper class="com.atguigu.dao.EmployeeMapperAnnotation"/>-->
<package name="com.atguigu.dao"/>
</mappers>
</configuration>
用eclipse的同学可以把mybatis的jar里的2个dtd文件拷贝出来,然后在eclipse的设置里在xml设置中添加进去,这样写标签时就有提示。(IDEA自带)
type换成URI,key就是dtd网址,上面Location点File System,选择刚拷出来的dtd文件
environments
environments
用于配置环境,可以(多个)配置数据库连接信息,可以在<environments default="development">
中切换不同的环境,比如(开发环境/正式环境)
transactionManager
事务管理器 默认JDBC
dataSource
数据库连接信息 连接类型一般是POOLED
使用连接池
mappers
mappers
标签是将mapper.xml
映射文件注册到配置文件中。
resource
就是用mapper.xml
的路径地址,类路径下就可以省略路径,只写文件名即可, class
就是用类的全类名指定。
mappers
中的namespace
命名空间:可以注册包下的所有跟接口同路径、同名的Mapper.xml
,一般的做法是在资源路径下建立跟类同包名的路径,这样在java编译时他们会在一起
Mapper.xml映射文件
还是全国统一的约束
然后是mapper
的namespace
名称空间
也就是用来指定当前这个xml文件是给哪个接口(类)用的。
select
标签:
-
声明一个查询语句,
resultType
声明返回值类型(这套是MyBatis
自带的自动封装),可以将返回值封装为JavaBean
、基础数据类型、List
、Map
等等,还能配合一些注解实现简单的自定义 例如在接口的方法上@MapKey注解 指定返回值Map的key用哪个字段 -
标签中间是写
SQL
语句的 参数用井号大可号#{}
代替,这玩意好,是采用的?
填充参数,预编译的SQL
语句,可以防止SQL注入
,而${}
不是预编译的,有面试喜欢问MyBatis
中#{}
和${}
的区别,可以留个心眼记一下。
useGeneratedKeys
配合keyProperty
可以回显自增的id
值。
(当插入一条数据,id
是null
,数据库自增,数据插入完成后,我们需要得到这条记录对应的id
,就可以使用这2个参数组合,获取到自增的id
,并存入到返回值的属性中)
ResultMap自定义封装返回值映射
-
resultMap的type
:JavaBean
的全类名,用于指定这个resultMap将返回的结果封装成啥类型 -
resultMap的id
:给此resultMap
命名用的,后面引用时写这个id即可 -
以下用于指定
resultMap
如何进行封装: -
id
:对应数据库表中的主键列 -
colunm
:对应数据库表中的普通列(非主键列)列名 -
property
:对应JavaBean中的属性名 -
其他的列如果和属性同名,或者符合驼峰命名规则,则可以不写,MyBatis也会自动封装。
但是为了符合开发习惯和规范,还是要统一全部完整的写完所有列和属性的映射。(避免你同事打你)
关联查询-级联属性封装
Employee对象新增dept属性,封装了员工所在的部门信息
Department类有2个属性
新增tbl_dept表:
数据库中新增dept_id字段:
给dept_id添加外键约束:
alter table tbl_employee add constraint fk_emp_dept
foreign key (dept_id) references tbl_dept(id)
写SQL语句 员工表左连接部门表:
select a.*,b.dept_name
from tbl_employee a
left join tbl_dept b
on a.dept_id = b.id
查询结果
给Mapper接口中新增查员工With部门方法:
public interface EmployeeMapperPlus {
public Employee selectById(Integer id);
public Employee selectWithDeptById(Integer id);
}
先编写xml中的resultMap封装返回信息:
<resultMap type="com.atguigu.bean.Employee" id="MyEmpWithDept">
<!-- type为JavaBean的全类名 id是给这个resultMap命名 -->
<id column="id" property="id"/>
<!-- id标签指定主键和 property指定主键对应的属性名 -->
<result column="last_name" property="lastName"/>
<!-- result封装非主键列和对应的属性名 -->
<result column="gender" property="gender"/>
<result column="email" property="email"/>
<result column="dept_id" property="dept.id"/>
<!-- property用属性名.属性 将数据封装到类的属性中 -->
<result column="dept_name" property="dept.deptName"/>
</resultMap>
再编写select标签:
<select id="selectWithDeptById" resultMap="MyEmpWithDept">
<!-- select标签 id为类中的方法名 resultMap为上面resultMap声明的id值 -->
select a.*,b.dept_name
from tbl_employee a
left join tbl_dept b
on a.dept_id = b.id
where a.id = #{id}
<!-- SQL语句 记得添加where条件 -->
</select>
写Java测试代码:
@Test
public void test5() {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);
Employee employee = mapper.selectWithDeptById(7);
System.out.println(employee);
} finally {
openSession.close();
}
}
运行结果:
成功封装dept部门信息
Employee [id=7, lastName=李思, email=lisi@qq.com, gender=0, dept=Department [id=2, deptName=市场部]]
下一篇
这篇再写就有点太长了 咱们下回分解
下一篇:resultMap更多玩法