JDBC操作数据库:
- 首先需要操作mysql数据库的驱动jar包:mysql-connector-java-5.1.32.jar。
- 操作就是 : 加链预执释。
a) 需要注意的是对结果集的处理和执行sql是调用的函数不同。
数据库连接池(druid):
依赖druid的jar包: druid-1.0.9.jar
连接池中维护有都个连接对象,我们可以直接从中取对象,用完之后放回。避免频繁创建对象所花费的时间,提高效率。 - 首先写druid的配置文件,key官方指定,不能改变。
a) - 加载配置文件,得到连接对象:
执行流程分析
架构图:
执行原理图:
Mybatis的基本使用:
在上述的jdbc和druid的使用中,我们发现,我们反复书写了很多的非核心的代码,并且对结果集的处理非常的麻烦。
Mybatis中体现的ORM(对象关系映射)思想:通过对象和数据库之间映射的数据结构关系,将java程序中的对象自动持久化到关系数据库中。解决对象和关系的映射。
基本的配置:
对于mybatis所需要的jar: mybatis-3.4.5.jar(核心包)还有一些:比如日志,数据库,druid
首先我们mybatis需要两个配置文件:
- Mybatis的主配置文件。一般为mybatis-config.xml.
主配置文件一般配置数据库信息(连接池,事务,)和全局配置信息(关联映射文件,插件)等。
配置日志框架:
依赖jar包: log4j-1.2.17.jar
在全局配置文件中配置:
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
- Mybatis的映射文件(重点),一般是xxxMapper.xml xxx表哦是模型对象。
一般配置包含该对象的CRUD操作的配置和sql.
select * from student where id=#{id}
其中,我们需要配置一个namespace(命名空间)。以便找到对应的sql。
Mapper标签下有多个子标签
Insert delete update select对应增删改查。唯一的id名。
parameterType表示你的参数的类型的全限定名,一般不用配置,mybatis会根据参数自己找,
resultType表示你查询结果集的每一行封装成什么数据类型(全限定名)可以配置别名。
当我们查询多行数据的时候,记得使用list接收,调用selectList方法。单个调用selectOne方法。
基本的使用:
在test代码中:
上面就完成了最基本的使用。我们会发现最简单的很多的代码都是重复的,我们可以抽取工具类,我们创建sqlsession时调用的无参构造函数,所以我们在执行增删改的时候,我们需要手动提交事务,session.commit()。
在insert和update中,我们保存了数据,通常需要返回主键。
insert into student (name,age) values(#{name},#{age})
</insert>
将主键注入到id属性,执行之后,我们打印对象的id属性就可以看到了。
进阶操作:
- 配置别名(不区分大小写)
<typeAliases>
<package name="Hello"/><!-- 自动配置别名,默认是类名首字母小写 -->
</typeAliases>
还可以使用@Alias(“xxx”)贴在类上。用注解的方式自己配置别名为xxx。一般避免使用。
常见的数据类型(int double,String等)系统内建了有相应的别名。
2. 查询结果映射resultMap 。一般在开发中都避免这种情况
a) 当我们的结果集中的列名和对象名不对应的时候。我们需要处理结果集,使之匹配。
<resultMap type="stu" id="baseMap">
<result column="uid" property="id"/>
<result column="uname" property="name"/>
<result column="uage" property="age"/>
cloumn对应数据库中的列名。Property对应我们对象属性名。 在查询时 写上resultMap="baseMap"就ok了。 select * from student
- 我们可以采用更加简单的mapper接口的方式来执行sql.(在开发中用的更多)
a) 在mapper接口中定义每一个操作方式,直接调用mapper的方法,就相当于执行了相关联的xml中的sql语句。方便。
b) 一般我们把mapper接口和mapper.xml文件都放在一个包中,合起来叫mapper组件
c) Mapper.xml文件的namespace就是对应mapper接口的全限定名称。Mapper接口中的方法名称就对应mapper.xml中的元素的id。(相当于关联起来了)
步骤:
Mapper组件的实现原理是动态代理:
生成一个代理对象。来执行操作。 - 参数处理。我们在Sqlsession中的增删改查都只能传入一个参数。多个参数时,此时我们就可以将参数进行封装。
a) 我们将多个参数封装成一个pojo对象或者Map中。我们在mapper.xml文件中使用#{}引用的就是对象的属性或者map里面的key。
b) 使用@Param注解。在mapper接口的方法中使用多个参数,每个参数都使用@Param注解,底层的原理其实就是使用map封装。
c) 例如:在mapper方法中定义。
void save2(@Param(“name”)String name,@Param(“password”)String password);
使用:
loginMapper.save2(“曾伟2”, “123”); - #和KaTeX parse error: Expected 'EOF', got '#' at position 21: …可以获取对象中的信息。 a) #̲传递的参数会先转化成?,再通过….例如:我们在select中有一个ORDER BY 分组或者排序等后面设置一个数据。直接是sql的一部分,就是$
动态sql(拼接sql): - if,choose(类似于switch),when,otherwise:
- where,set,trim
- foreach:批量操作
a) foreach元素用于迭代一个集合/数组,通常构建在IN运算符条件中。
例如:删除id为1,2,3 的数据。
Sql:delete from student where id in (1,2,3)
现在在mapper接口中定义方法:ids={10,20,30}
void batchDelete(@Param(“ids”) long[] ids); delete from student where id in
其中collection表示需要遍历的集合或数组
Key就是在collection=“key“。
参数是数组类型,map的key为array.
参数是List类型,map的key为list
我们可以在参数上使用@param注解。可以直接规定key是什么。
open表示在遍历开始加什么,close在之后加什么,
Separator表示用什么分割,item就是后面遍历的标识符。
Index是迭代的索引。
缓存机制:
原理就是一个map(存在内存中):我们在查询的时候会从先缓存中查询。没有命中才操作数据库,并且更新缓存。
- Mybatis的一级缓存(本地缓存,):默认开启,不能关闭,性能不行。
在同一个sqlsession中存在一个map,用来缓存查询的对象。因为其实我们基本每一次操作都是新的sqlsession对象,sqlsession之间不能共享一级缓存,
Cachekey是否相同的因素有:statementId,offset,limit,sql语句,参数。
如果我们在会话中有任何修改数据库的操作,那么缓存失效。
- Mybatis的二级缓存(查询缓存,mapper级别的):手动开启和配置。
a) 在全局配置文件中启动二级缓存。默认开启。
b) 在mapper文件中使用cache元素把namespace和缓存绑定。
可以在cache中进行缓存配置。
c) 并且我们的要缓存的java对象要实现Serializable接口。
二级缓存也是把换粗放在内存里面。当内存用完了,就会放在硬盘里面(序列化),所以缓存的对象要实现Serializable接口。
d) 一般列表查询(多条数据)不使用缓存,不容易命中。可以在select中的userCache设置为false。不使用缓存。
e) 所有的select的默认都会使用缓存
f) 默认情况增删改都会刷新缓存。可以设置insert,update,delete中的flush设置为false,不刷新缓存。
我们还可以自定义缓存。
Mybatis的逆向工程:
我们可以在网上找到mybatis的逆向工程,然后自动生成mapper组件(mapper文件和pojo)。对于基本的单表查询,基本可以满足。对于逆向工程代码的具体使用如下:
一般是使用QBC风格的方式来执行。也就是criteria和example来设置条件。
忘记了可以查看项目中的代码。
Mybatis-pageHelper(Mybatis的分页插件):
在maven创建项目的pom文件中添加依赖:
com.github.pagehelper
pagehelper
3.4.2
这里使用的是3.4.2版本
实现原理:
在mysql中,分页的原理就是在sql中使用limit来限制结果数,那么我们只需要在我们执行的sql中编写相应的sql语句就可以实现分页了。但是我们一般都是使用mybatis的逆向工程来生成pojo和mapper文件。所以我们这里使用PageHelper插件来完成.(原理就是主要作用在Executor执行器与mappedeStatement之间,也就是说mybatis可以在插件中获得要执行的sql语句,在sql语句中添加limit语句,然后再去对sql进行封装,从而可以实现分页处理。)
Mybatis的执行流程图:
导入了jar之后。我们需要在mybatis的全局配置SqlMapperConfig.xml文件中配置插件。
我们在service编写代码使用。
//初始化spring容器
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“classpath*:/spring/applicationContext-dao.xml”);
//获得mapper代理对象
TbItemMapper itemMapper = applicationContext.getBean(TbItemMapper.class);
//执行sql之前设置分页信息使用pageHelper中的startPage方法
PageHelper.startPage(1, 10);
//执行sql
TbItemExample example=new TbItemExample();
List list = itemMapper.selectByExample(example);//返回一个list
//取分页信息。pageInfo
PageInfo pageInfo=new PageInfo<>(list);
System.out.println(pageInfo.getTotal());//全部记录数
System.out.println(pageInfo.getPages());//页数
System.out.println(pageInfo.getSize());