1.Mybatis
优秀的数据持久层框架
最新版本Maven配置:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
1.搭建工程:
mybatis依赖+数据库连接依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
因为mybatis留有对数据库的接口,需要实现对应数据库(如mysql)的接口包,此时mybatis依赖搭建完成。
2.配置文件:
主标签:< configuration>< /configuration>
可选配置:
1.< properties >设置properties文件(可选)可用来存放配置文件需要用到的数据,如:数据库连接的相关信息。配置之后可以在配置文件中使用${key}来代指。
2.< settings >基本设置(可选)可用来设置SQL日志
3.< typeAliases>类型别名配置(可选)
必须配置:
1.< environments> 数据库环境配置
2.< mappers> mapper文件注册,***Mapper.xml 文件要想生效,这是必须的
<?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="jdbc.properties"/>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<package name="com.dream.mybatis.model"/>
</typeAliases>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="com.dream.mybatis.dataSource.DruidDataSourceFactory">
<property name="driverClassName" 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="product">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver1}"/>
<property name="url" value="${jdbc.url1}"/>
<property name="username" value="${jdbc.username1}"/>
<property name="password" value="${jdbc.password1}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver2}"/>
<property name="url" value="${jdbc.url2}"/>
<property name="username" value="${jdbc.username2}"/>
<property name="password" value="${jdbc.password2}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/studentMapper.xml"/>
<mapper resource="mapper/userMapper.xml"/>
<mapper resource="mapper/courseMapper.xml"/>
<mapper resource="mapper/teacherMapper.xml"/>
</mappers>
</configuration>
3. mapper.xml:
< mapper namespace=" "> 写对应的mapper接口全路径。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dream.mybatis.mapper.StudentMapper">
</mapper>
**二级子标签分别对应于数据库的 增删查改(CRUD) **
id需要完全对应本文件对应的mapper接口中的方法名,resultType为返回类型 且只有select标签有
<select id="getStudentByName" resultType="student">
</select>
<insert id="addStudent">
</insert>
<delete id="deleteStudent">
</delete>
<update id="updateStudent">
</update>
重要知识点:
1.mapper接口方法中的参数传递给xml文件:
取值有两种方式**KaTeX parse error: Expected 'EOF', got '#' at position 11: {表达式}**和**#?{表达式}**,其中经常使用的…{}只是进行拼接,不能够有效的防止SQL注入。
在括号中的表达式书写,分为四种情况:
1.接口方法的参数只有一个基本类型的参数时:表达式可以取任意命名,都将会自动匹配。
2.单个引用类型的参数时,可以直接使用该类对象的属性名,mybatis将会自动注入。重点:map作为参数,可以直接以key作为键值对。
3.当有多个参数时,参数的表达式默认为arg0argN-1,param1paramN。当对应参数位置为引用数据类型时,可以直接使用对应的表达式.(例如:arg1.name,param2.name)
4.在接口方法的参数上使用@Param注解,注解中可以声明一个别名,该别名可以被xml文件自动识别到,从而进行注入(推荐)
注:在SQL语言中需要使用拼接的可以使用SQL自带的concat方法。**
如:LIKE CONCAT(’%’, #{params.name}, ‘%’)
2.主键回填
主键回填分为两种情况:一种是主键自增长的主键回填,第二种是主键由数据库随机生成(uuid)。
注意order的属性值。
1.主键自增长:
接口中的方法:
public interface ArticleMapper {
int addArticle(@Param("article") Article article);
}
map.xml文件
<mapper namespace="com.dream.mybatis.mapper.ScoreMapper">
<insert id="addScore">
<selectKey keyProperty="score.id" resultType="long" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO score(name, score)VALUES(#{score.name}, #{score.score})
</insert>
</mapper>
2.主键由数据库自动生成
<insert id="addArticle">
<selectKey keyProperty="article.id" resultType="string" order="BEFORE">
SELECT REPLACE(UUID(),'-','')
</selectKey>
INSERT INTO article(id, title, content, author)
VALUES (#{article.id}, #{article.title}, #{article.content}, #{article.author})
</insert>
3.结果映射:
<mapper namespace="com.dream.mybatis.mapper.EmployeeMapper">
<resultMap id="empMap" type="com.dream.mybatis.model.Employee">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="entryTime" column="entry_time" />
<result property="leaveTime" column="leave_time" />
</resultMap>
<select id="getAllEmployees" resultMap="empMap">
SELECT id,name,entry_time,leave_time FROM employee
</select>
</mapper>
4.级联查询
级联查询需要使用结果映射。
一对一级联查询需要使用< association>标签
<mapper namespace="com.dream.mybatis.mapper.CourseMapper">
<resultMap id="courseMap" type="course">
<id column="cno" property="id"/>
<result property="name" column="cname"/>
<association property="teacher" column="{tid=tno}" select="getTeacher" />
</resultMap>
<select id="getCourse" resultMap="courseMap">
SELECT
cno,
cname,
tno
FROM
a_course
WHERE cname = #{arg0}
</select>
<select id="getTeacher" resultType="teacher">
SELECT
tno id,
tname name
FROM
a_teacher
WHERE tno = #{tid}
</select>
</mapper>
一对多级联查询需要使用< collection>标签
<mapper namespace="com.dream.mybatis.mapper.TeacherMapper">
<resultMap id="teaMap" type="tea">
<id column="tno" property="id"/>
<result property="name" column="tname"/>
<collection property="cous" column="{tid = tno}" select="getCou"/>
</resultMap>
<select id="getAllTea" resultMap="teaMap">
SELECT
tno,
tname
FROM
a_teacher
</select>
<select id="getCou" resultType="cou">
SELECT
cno id,
cname name
FROM
a_course
WHERE tno = #{tid}
</select>
</mapper>
5.标签的应用
sql和include标签:SQL语言的重用,
<sql id="fields">
username, password,salt,sex,address
</sql>
<select id="getUserByUsername" resultType="user">
SELECT
<include refid="fields" />
FROM
`user`
WHERE
username = #{abcde}
</select>
if标签:在test中写上符合java的布尔表达式,
<if test="params.name != null and params.name != ''">
AND name LIKE CONCAT('%', #{params.name}, '%')
</if>
where标签:嵌套在if之外,能够自动添加where和忽略第一个and或者or关键字,
set标签:在updata语句中使用,也是嵌套在if之外,能够自动添加set和忽略SQL语句的后缀,如逗号,可以动态选择修改属性,
<set>
<if test="s.name != null and s.name != ''">
name = #{s.name},
</if>
<if test="s.score != null and s.score != ''">
score = #{s.score},
</if>
</set>
<where>
<if test="s.id != null and s.id != ''">
AND id = #{s.id}
</if>
</where>
trim标签:可以代替 where 标签和 set 标签
<trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim>
foreach标签:循环标签经常用于sql含有in或not in的常见
<foreach collection="" item="" open="" seperator="" close="" index="">
</foreach>
4. Mybatis缓存
- 缓存的定义
缓存就是存储在内存中的临时数据,将用户经常查询的数据放在缓存(内存)中,用户再次查询数据的时候就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,能够提高查询效率,解决了高并发系统的性能问题
- 缓存的优势
减少和数据库的交互次数,减少系统开销,提高系统效率
- 缓存使用场景
经常查询并且不经常改变的数据
- Mybatis 缓存
mybatis包含一个非常强大的查询缓存特性,可以非常方便地定制和配置缓存,缓存可以极大地提高查询效率
mybatis系统默认定义了两级缓存:一级缓存和二级缓存
4.1 全局缓存配置
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
4.2 Mapper缓存配置
<cache flushInterval="300000" readOnly="true" size="10000" eviction="LRU"/>
4.3 二级缓存失效
二级缓存缓存数据的前提是查询的 SqlSession 关闭,如果 SqlSession 没有关闭,那么数据将不会进入二级缓存,再次进行同构查询时,二级缓存由于没有数据,查询将进入数据库,造成二级缓存失效的现象。另一种情况是,当前查询的 SqlSession 已经关闭,数据也进入了二级缓存,但在下一次查询之前,如果中间发生了更新操作,该操作更新的数据在的二级缓存中存在,那么二级缓存也将失效。
5.分页插件 PageHelper
1. 如何获取PageHelper
官方网站: https://pagehelper.github.io/
最新版本Maven配置:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
2. 插件配置
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
3. 测试分页
@Test
public void paginationTest(){
SqlSession sqlSession = MybatisUtil.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> params = new HashMap<>();
params.put("sex", 1);
params.put("name", "理");
params.put("address", "千");
PageHelper.startPage(1, 5);
List<User> users = userMapper.retrieveUsers(params);
PageInfo<User> pageInfo = new PageInfo<>(users);
System.out.println("总条数:" + pageInfo.getTotal());
System.out.println("总页数:" + pageInfo.getPages());
pageInfo.getList().forEach(System.out::println);
}
6.配置数据源 Druid
Druid 是阿里巴巴开源平台上的一个项目,是性能最好的数据库连接池,如何在Mybatis中配置该数据源呢?
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
创建 DruidDataSourceFactory, 并继承 PooledDataSourceFactory,并替换数据源
public class DruidDataSourceFactory extends PooledDataSourceFactory {
public DruidDataSourceFactory() {
this.dataSource = new DruidDataSource();
}
}
<dataSource type="com.qf.mybatis.datasource.DruidDataSourceFactory">
...
</dataSource>
|