11.前言(使用注解开发)
1.面向接口编程
大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程
根本原因: –解耦–,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的对系统设计人员来讲就不那么重要了
而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程
关于接口的理解
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离
接口的本身反映了系统设计人员对系统的抽象理解。
接口应有两类:
第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class)
第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface)
一个体有可能有多个抽象面。抽象体与抽象面是有区别的。
三个面向区别
面向对象是指,我们考虑问题时,是 ...
10.RowBounds分页
1.接口//分页二
List<User> getUserByRowBounds();
2.Mapper.xml<!--分页-->
<select id="getUserByRowBounds" resultType="User">
select * from mybatis.user
</select>
3.测试@Test
public void getUserByRowBounds(){
SqlSession sqls = MybatisUtils.getSqlSession();
//RowBounds实现
RowBounds rowBounds = new RowBounds(1,2);
//通过Java代码层面实现分页
List<User> userList = sqls.selectList("com.mine.dao.UseMapper.getUserByRowBounds",null, ...
9.分页
为什么分页?
减少数据的处理量
1.使用Limit分页SELECT * from user limit startIndex,pageSize
SELECT * from user limit 0,2
//每页显示2个,从第0个开始
使用Mybatis实现分页,核心SQL
接口
//分页
List<User> getUserByLimit(Map<String,Integer> map);
Mapper.xml
<!--结果集映射-->
<resultMap id="UserMap" type="User">
<!--column数据库中的字段,property实体类中的属性-->
<!--<result column="id" property="id"/>-->
<!--<result column="name" property="name ...
8.Log4j
什么是Log4j?
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件
我们也可以控制每一条日志的输出格式:
通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
通过配置文件来灵活的进行配置,而不需要修改应用的代码
1.先导入log4j的包<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2.log4j.properties### 将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 ###
log4j.rootLogger = D ...
7.日志
7.日志工厂如果一个数据库操作,出现了异常,我们需要排错。日志就是最好地帮手曾经:sout、debug现在:日志工厂
SLF4J
LOG4J 【学习】
LOG4J2
JDK_LOGGING
COMMONS_LOGGING
STDOUT_LOGGING 【】
NO_LOGGING
在Mybatis中具体使用哪一个日志实现,在设置中设定!STDOUT_LOGGING标准日志输出
在mybatis核心配置文件中,配置我们地日志!
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
6.解决属性名和字段名不一致的问题
数据库中的字段
新建一个项目,拷贝之前的,测试实体类字段不一致。public class User {
private int id;
private String name;
private String password;
测试出现问题
解决方法:*起别名
<select id="getUserById" resultType="com.lv.pojo.User">
select id,name,pwd as password from mybatis.user where id = #{id}
</select>
resultMap结果集映射
id name pwd
id name password
配置UserMapper.xml
<!--结果集映射-->
<resultMap id="UserMap" type="User">
<!--column数据库中的字段 ...
5.映射器
1、映射器MapperRegistry:注册绑定我们的Mapper文件
方式一:
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
<mappers>
<mapper resource="com/lv/dao/UserMapper.xml"/>
</mappers>
方式二:
注意点:*接口和他的Mapper配置文件必须同名*接口和他的Mapper配置文件必须在同一个包下
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
<mappers>
<mapper class= "com.lv.dao.UserMapper"/>
</mappers>
方式三:使用扫描包进行注入绑定注意点:
*接口和他的Mapper配置文件必须同名*接口和他的Mapper配置文件必须在同一个包下
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
< ...
4.配置解析
1、核心配置文件*mybatis-config.xml*Mybatis 的配置文件包含了会深深影响Mybatis行为的设置和属性信息。
configuration(配置)
properties(属性)
setting(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境配置)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
2、环境配置Mybatis可以配置成适应多种环境
不过要记住:尽管可以配置多个环境,但每一个SqlSessionFactory实例只能选择一种环境学会使用配置多套环境
Mybatis默认的事务管理器就是JDBC,连接池:POOLED
3、属性(properties)我们可以通过properties属性来实现引用配置文件
这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中 ...
3.万能的Map
假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当首先考虑Map!
//万能的Map
int addUser2(Map<String,Object> map);
<insert id="addUser2" parameterType="map">
-- insert into mybatis.user (id,name,pwd) values(#{userid},#{username},#{userpwd});
insert into mybatis.user (id,pwd) values(#{userid},#{userpwd});
</insert>
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession ...
2.CRUD增删改查
CRUD
Namespacenamespace中的包名要和DAO/Mapper接口的包名一致
select选择,查询
id:就是对应namespace方法名;
resultType:Sql语句执行的返回值!
parameterType:参数类型!
编写接口
//根据ID查询用户
User getUserById(int id);
编写对应的mapper中的sql语句
<!--根据id查询-->
<select id="getUserById" resultType="com.lv.pojo.User" parameterType="int">
select * from mybatis.user where id = #{id}
</select>
测试
@Test
public void test(){
//第一步:获得SqlSession
SqlSession sqlSession ...