阅读笔记

image.png

记录下最近阅读到的一些读书笔记

Idea使用小结

Idea使用记录小结

主题

配置-排错

解决jdk发行版本问题

在一些maven项目开启的时候,常常会有错误出现,因为idea里面当下的项目配置是因为maven的原本的配置给覆盖了。说先有可能是setting出了问题,可以先打开project-setting(在idea里面是左上角的file-project seetting)

解决发行版本问题 强制约束maven中的jdk版本。直接在pom.xml上设置

1
2
3
4
5
6
7
8
9
10
11
12
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>

其他功能

打开UML结构图

比较新的版本的Idea是支持UML结构类图的,找到一个类或者是接口,直接右键,看图操作就可以了。

image-20200525003140655

最后的结果就是这样了。

image-20200525003252342

Vscode问题总结

  1. The compiler compliance specified is 11 but a JRE 12 is used

image-20200526114928021

leetcode入门之数组系列


前言

之前看到刷leetcode的技巧相关文章的时候,看到一个大神建议说,在一开始可以先按数组、字符串、链表、树的tag来刷,同时切记一开始先刷easy的。这样可以很大程度上将基础巩固,因为在后面的中等题以上都是会用到这些基础知识,如果有了牢固基础,相信在学习其他复杂的知识点就可以很快解决。下面是记录一些解题的技巧和好的题目。

题目

#leetcode-learn环节

下面的例题是在英文版本的leetcode中的explore环节的学习。

1、找出连续1的数组长度

image-20200603100321399

2、位数为偶数位的个数

image-20200603102137902

image-20200603102106796

3、数组的平方

image-20200603103439065

做法一

image-20200603103553978

做法二

image-20200603104524713

4、复制零并且移动数组

image-20200603221149084

image-20200603224454937

5、合并数组

image-20200604095218172

image-20200604095321571

6、删除数组中的重复数字

image-20200604164428972

image-20200604163548016

7、在升序的数组删除重复的数字。6的变式

image-20200610212514429

O(1)空间复杂度的数组复制

image-20200610213506246

#66-加一操作

image-20200523141838014

答案示例,这里的思路和清晰,这个题看似简单,但是里面的数组进位操作处理有点意思。

image-20200523142054241

#88 合并两个有序数组

image-20200524105015152

这里需要注意的是,这道题是直接在数组一上操作,不是开辟个新数组,这道题可以从后往前做,这样可以节省空间,更加高效,代码也很简洁。代码在下面

image-20200524105113799

#287-寻找重复数

题目如下,方框中是所需要注意的点

image-20200526085409344

采用快慢指针的方法,这是一个环的入口问题

#974 子数组被K整除的个数

image-20200527234100861

使用前缀和的方法-简单的讲是记录数组的前n项

有 N 个的正整数放到数组 A 里,现在要求一个新的数组 B,新数组的第 i 个数 B[i]是原数组 A 第 0 到第 i 个数的和。

#1464 数组中最大的两个数

image-20200611085650281

暴力法

image-20200611085928108

城市轨道交通与其它交通方式衔接的研究2017052397-颜华艺

spring系列-01

springhello程序

258eb28a50f8c2b5cf26bbcfa60bbffb

先写个实体类

image-20200524221506223

配置

pom.xml

导入lombok纯粹是为了省一些写代码的操作,使用注解的方式来省下时间,但是初学者还是非常不建议使用这个

image-20200524232353430

导的spring是下面这个mvc的web架构的包,可以使用

image-20200524232418174

里面的包里面有这些分支,可以使用。

image-20200524232644861

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">

<!--这里的bean是一个对象
id是变量名
class是new的对象
property相当于给对象中的属性配置一个值
由spring创建的,原来是
对象由spring注册管理等
-->
<bean id="hello" class="com.yhy.pojo.Hello">
<property name="str" value = "hello world"/>
</bean>

<!-- more bean definitions go here -->

</beans>

修改可以直接在xml文件中修改,其他的不用理了。所谓的IOC就是对象由spring创建、管理、装配。

核心

查看DeaultListableBeanFactory的结构图,idea怎么使用结构图查看是怎么样的,可以参考下这个文章。

image-20200524235137002

IOC(Inversion of Control)

The org.springframework.beans and org.springframework.context packages are the basis for Spring Framework’s IoC container. –spinng官网上的一句华

直译过来就是这里两个包是spring框架中的IOC容器的基础,在上面的maven截图中,也是可以看到spring mvc里面有这两个包,要不然也不可能使用完整的spring框架。所以想学会这个IOC,这两个包的了解是必不可少的。

IOC创建对象

默认是无参构造方法

使用有参构造有几个方法

有三种 参数名 下标 名字

mybatis03-复杂查询

mybatis-03学习复杂查询

讲到复杂查询,在mybatis中就要用到resultMap结果映射,之前用到单表简单查询,用一个resultType就可以满足了,但一旦是一些连接查询等复杂查询时候,resultMap作用就体现出来了。下面重点讲下这个MyBatis中最强大的元素。

resultMap介绍

显示resultMap的元素概念,下图是官网中的讲解图,重点讲下关联(association)和集合(collection)

image-20200518151113180

关联(association)

image-20200518212633184

关联(association)元素处理“有一个”类型的关系,同时MyBatis 有两种不同的方式加载关联:

  1. 嵌套的查询,和sql中的子查询类似
  2. 根据结果来映射

集合(collection)

实例使用resultMap的关联查询

正常的MySQL查询-连接查询,但是在mybatis怎么实现呢,接下来来讲下两种方式去实现。

image-20200518212358659

方式一 嵌套查询

StudentMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<mapper namespace="com.yhy.dao.StudentMapper">

<select id="getStudent" resultMap="StudentTeacher">
select * from student;
</select>

<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id" />
<result property="name" column="name" />

<!-- 有时需要处理一些复杂的数据查询,多表查询等,就需要用到assoction-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>

<select id="getTeacher" resultType="Teacher">
select * from teacher where id = #{id};
</select>


</mapper>

结果,这个结果就类似sql中的子查询,一个结果中嵌套另一个结果

image-20200518151811158

方式二 按照结果处理

StudentMapper.xml修改成以下的形式,其实这样的形式更加容易理解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
!--采用连接查询的方法-->
<select id="getStudent2" resultMap="StudentTeacher2">
select s.id sid,s.name sname, t.name tname
from student s , teacher t
where s.tid = t.id;
</select>

<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>

结果也一样

image-20200518212227344

JavaType–用来指定实体类中的属性

ofType–用来指定映射到List或者集合中的pojo类型,泛型中的约束类型

最后

无论使用什么的方式,保持代码的可读性和效率是很关键的。

ssm小结

ssm框架学习

记录学习

SpringMVC框架

这是表现层-相当于之前的servlet层和一些视图

Spring

重点:控制反转(IOC)和AOP(面向切面编程)

MyBatis:持久层框架

数据访问层-相当于之前web项目中dao层,数据库的交互,包括增删改查;

持久化就是将数据在持久状态和瞬时状态转化的过程。内存是断电即失。所以需要数据的持久化。

JDBC技术:Connection、PrepareStatement、ResultSet.

为什么要使用框架代替jdbc呢?

​ 因为之前的jdbc的操作总是是重复单一的,在开发的时候要执行sql语句直接操作数据库,要经过加载驱动等操作,为了高效的开发,避免繁琐的操作,框架就诞生了。框架对jdbc进行封装,mybatis只需关注sql语句直接操作数据库,封装了操作的很多细节,这样可以将更多时间精力放在sql语句的编写上。

特点:灵活容易上手,用的多,封装jdbc

第一个程序

pojo的user类

映射数据库的user表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.yhy.pojo;

/**
* @Author: yhy
* @Date: 2020/5/12
* @Time: 10:58
* 用户表的pojo层
*/
public class User {
private int id;
private String name;
private String pwd;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}


public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

}

pom.xml,

整个项目的maven管理文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.yhy.learn</groupId>
<artifactId>mybatisDemo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mybatis-01</module>
</modules>

<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>

</dependencies>

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>

<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>



</project>

工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.yhy.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
* @Author: yhy
* @Date: 2020/5/12
* @Time: 11:45
* 工具类
* 获取sqlsession工厂
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 利用mybatis在一开始就获得了sqlsessionfactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}

}
// 有了工厂就可以获得实例来使用,sqlsession就可以面向数据库操作jdbc
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}



}

dao的接口实现xml

用这个文件代替了之前dao层中的接口实现类,之前的话需要编写jdbc的全部,查询编写sql,获取结果集,遍历结果集,关闭连接。现在的话就是简化了步骤。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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">
<!--namespace=绑定一个对应的Dao/Mapper接口 原本是写接口,但是现在不用怎么做-->
<mapper namespace="com.yhy.dao.UserDao">

<!--select查询语句-->
<select id="getUserList" resultType="com.yhy.pojo.User">
select * from mybatis.user
</select>

</mapper>

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.yhy.dao;

import com.yhy.pojo.User;
import com.yhy.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
* @Author: yhy
* @Date: 2020/5/12
* @Time: 12:15
*/
public class UserDaoTest {
//借调工具类来使用测试
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();

UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();

for (User u: userList){
System.out.println(u);

}

sqlSession.close();


}


}

mybatis-config.xml

这个是关键的配置文件,决定了连接的对象以及设定了作用域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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>
<typeAliases>
<package name="com.yhy.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
//事务管理
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
//作用域,删掉就是全局
//这里的配置可以是直接放在resource文件下,就直接写上xml名称就行,放在dao层的话就需要写全路径
<mappers>
<mapper resource="com/yhy/dao/UserMapper.xml"/>
</mappers>
</configuration>

演示两种mappers作用效果

  • 1.将UserMapper.xml放在dao层下,跟着userdao

配置就和我上面写的一样。最后效果如下,但是前提是你得在你项目的pom.xml设置好有效的作用域,要不然就疯狂报错,说找不到这个UserMapper.xml文件。

image-20200512143352609

pom.xml需要配置如下,这里是配置能够得读取到src下的有效配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>

<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
  • 2.是直接将UserMapper.xml放在src下的resource文件下,和总的mybatis-config.xml配置文件放置在一起。这样在mybatis-config.xml里面就直接如下这样写文件名就行了。
1
<mapper resource="UserMapper.xml"/>

image-20200512143952637

最后效果和第一种方法是一样的,都能够读取到数据。

  • 个人觉得这两种方法来说,第一种可以对项目的整体设计管理更加方便一点,就像接口和实现类都是靠近的,方便进一步的审查和优化,第二种在做小的demo的时候是很方便的,但是一旦多个配置文件时候就可以有点难找。

记录错误

  1. maven创建项目一开始经常会有的错误,就是设定的jdk版本问题,一开始我都是手动去修改project的setting,比较麻烦。默认的版本一般是jdk1.4或者是jdk1.5,但大家往往不是这个版本,所以会报错不支持发行版本5什么的。

解决:现在记录下,永久得起配置好。到自己maven下载文件夹下找到配置文件,并在里面修改settings.xml

image-20200512151703715

image-20200512151630090

修改:如下,我的是jdk11。所以可以根据自己的版本来修改。

image-20200512151902737

初步学习

解决idea错误

记录解决Intellij IDEA Tomcat启动项目加载页面的时候报错:java.lang.ClassNotFoundException-mysql数据库驱动问题

一个javaweb项目,在编写登录页面跳转的时候,因为借助了mysql中的数据,所以调用了数据库驱动。

下面的是一开始的错误,登录无法跳转界面,通过debug,里面传到user是null对象,无法走到正确页面。

image-20200504164413808

image-20200504163919368

一开始我以为测试正确就可以使用mysql数据库的驱动,后面才知道是不一样的。

image-20200504164336536

解决

首先是File-project structure-Artifacts,这里是为了解决这是由于pom.xml中下载的jar包未被部署,也就是我的问题所在。

image-20200504164706845

一开始我的左边是没有lib文件夹的,右边的依赖也没有加过来,所以要将右边的全部移动过来就可以解决了。

image-20200504164943384

最后成功登录

image-20200504165012470

最后

希望自己能够从错误中不断学习,也很感谢那个大哥花时间帮我,感谢!!

参考1

参考2

参考3

mybatis02-分页

mybatis学习系列第二篇

分页

在网页中常常用到,在查询数据库内容并想将其输出的时候,因为有时有多组数据,一页展示过于突兀,所以会用到分页操作。

sqllimit来分页。

首先是UserMapper.xml

1
2
3
4
5
6
7
<!-- 实现分页的接口 -->

<select id="getUserByLimit" parameterType="map" resultType="User">

select * from mybatis.user limit #{startIndex},#{pageSize};

</select>

然后是UserMapper.java

1
2
// 实现分页查询操作
List<User> getUserByLimit(Map<String,Integer> map);

再到测试类中的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void getUserByLimit() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);

Map<String,Integer> map = new HashMap<>();
//通过map来传参来实现数据的交互绑定
map.put("startIndex", 1);
map.put("pageSize", 2);

List<User> userlist = mapper.getUserByLimit(map);
for (User user : userlist) {
System.out.println(user);

}

sqlSession.close();

}

还可以使用RowBounds来实现分页

UserMapper.java

1
2
// 实现分页的方法二
List<User> getUserByLimit2();

UserMapper.xml

1
2
3
4
<!-- 实现分页的方法二 -->
<select id="getUserByLimit2" resultType="User">
select * from mybatis.user ;
</select>

RowBounds构造方法,和limit相似。

image-20200517090058269

test代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

public void getUserByLimit2() {
SqlSession sqlSession = MybatisUtils.getSqlSession();


RowBounds rowBounds = new RowBounds(1,2);
// 使用java代码来实现分页操作
List<User> selectList = sqlSession.selectList("com.yhy.dao.UserDao.getUserByLimit2", null, rowBounds);

for (User user : selectList) {
System.out.println(user);
}

sqlSession.close();

}

输出结果

image-20200517090333835

pageHelper分页插件

了解

注解开发

本质是使用反射,还有动态代理模式

在工具类MybatisUtils中,打开自动提交事务,这样在后续的编写代码中就不要在使用commit

image-20200517150310456

1
2
3
4
5
//    有了工厂就可以获得实例来使用,sqlsession就可以面向数据库操作jdbc
// 打开自动提交事务
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}

注解开发流程-实例

整体文件结构

image-20200517195217954

使用注解开发的时候,接口里面定义的方法就是使用注解的地方,实例如下

1
2
3
4
//使用注解的方法,之前是需要写xml文件进行配置,这里就直接使用注解的方法
//这个方法是查询所有用户信息
@Select("select * from user")
List<User> getUsers();

在主配置文件中,也是关键所在,绑定的有所不同。将文件资源标签改为class,并将所在的类位置标出。

image-20200517200001711

测试类-使用的步骤和之前的没有使用注解的方法一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void test() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);

List<User> users = mapper.getUsers();
for (User user : users) {
System.out.println(user);
}

sqlSession.close();

}

总的来说,注解是分散的数据配置,而xml是集中的数据配置。

使用注解可以很多程度来简化工作,省去了很多配置文件的编写,但有时注解过于分散不利于管理和维护,在一些通用配置上,像数据库连接等,还是比较建议xml文件进行配置,因为XML方式比注解的可扩展性和复杂性维护上好的多。所以注解有利有弊,看什么场景去使用,用对了就是事半功倍的效果!

了解Lombok

Lombok是一个java开发插件,目的是简化代码,方便开发,通过注解省去了一些pojo中的getset方法和构造方法,还有一些其他的tostringequals等。有些介绍可以参考官网中的文档,当然对于这款插件,欢呼声和骂声一直都充斥在各个平台,各种分析文章网上也有很多,我就不再去记录太多了。但任何事情都有其两面性,理性看待,喜欢觉得有用大家就用,不喜欢就当了解一些也不为过。下面是记录使用的一些图片代码。

1、插件下载–setting里面的插件

image-20200518102201415

2、maven导包,在官网找到信息进行导包,选择自己所需要的版本进行使用

image-20200518103524190

我选择了最新的版本,有错再去解决

1
2
3
4
5
6
7
8
9
10
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>

</dependencies>

3、使用实例

在插件管理查看信息里面就可以看到Lombok的一些介绍吗,下面是一些注解的介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Getter and @Setter //生成get和set方法
@FieldNameConstants
@ToString //tostring方法
@EqualsAndHashCode //equals和hashcode方法的生成
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor //全参构造和无参构造和一个自定义构造
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data //这个最常见了,加一个可以默认生成了一系列的方法,可以见下图使用
@Builder
@SuperBuilder
@Singular
@Delegate
@Value
@Accessors
@Wither
@With
@SneakyThrows
@val
@var
experimental @var
@UtilityClass
Lombok config system
Code inspections
Refactoring actions (lombok and delombok)

将变量定义留着,其他方法注释掉,就可以自动生成了

image-20200518104820601

默认是生成了无参的构造器,加入AllArgsConstructor就可以了

image-20200518105023599

最后留下的代码就剩得这么干净。自己看的确实很舒服,当用的多了,不懂的人可能够呛哈哈哈。

image-20200518105157269

最后

这是第二篇mybatis文章,谢谢阅读。有错误请多多指教,谅解!跟随b站狂神的视频记录的学习笔记

mybatis03-复杂查询

MyBatis:持久层框架

前言

之前有看过和学习一些mybatis的文章和内容,但是没有去写过文章记录下,现在借鉴b站的狂神视频和官方文档看来重新撸一遍入门。有错误请多指教。

内容

数据访问层-相当于之前web项目中dao层,数据库的交互,包括增删改查;

持久化就是将数据在持久状态和瞬时状态转化的过程。内存是断电即失。所以需要数据的持久化。

JDBC技术:Connection、PrepareStatement、ResultSet.

为什么要使用框架代替jdbc呢?

​ 因为之前的jdbc的操作总是是重复单一的,在开发的时候要执行sql语句直接操作数据库,要经过加载驱动等操作,为了高效的开发,避免繁琐的操作,框架就诞生了。框架对jdbc进行封装,mybatis只需关注sql语句直接操作数据库,封装了操作的很多细节,这样可以将更多时间精力放在sql语句的编写上。

特点:灵活容易上手,用的多,封装jdbc;MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

演示使用

现在演示mybatis的一个helloworld程序,看看是怎么样去使用。

pom.xml,

整个项目的maven管理文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.yhy.learn</groupId>
<artifactId>mybatisDemo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mybatis-01</module>
</modules>

<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>

</dependencies>

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>

<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>



</project>

工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.yhy.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
* @Author: yhy
* @Date: 2020/5/12
* @Time: 11:45
* 工具类
* 获取sqlsession工厂
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 利用mybatis在一开始就获得了sqlsessionfactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}

}
// 有了工厂就可以获得实例来使用,sqlsession就可以面向数据库操作jdbc
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}



}

pojo的user类

映射数据库的user表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.yhy.pojo;

/**
* @Author: yhy
* @Date: 2020/5/12
* @Time: 10:58
* 用户表的pojo层
*/
public class User {
private int id;
private String name;
private String pwd;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}


public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

}

dao层的UserDao接口

1
2
3
4
5
6
7
8
9
package com.yhy.dao;

import com.yhy.pojo.User;

import java.util.List;

public interface UserDao {
List<User> getUserList();
}

dao的接口实现xml

用这个文件代替了之前dao层中的接口实现类,之前的话需要编写jdbc的全部,查询编写sql,获取结果集,遍历结果集,关闭连接。现在的话就是简化了步骤。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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">
<!--namespace=绑定一个对应的Dao/Mapper接口 原本是写接口,但是现在不用怎么做-->
<mapper namespace="com.yhy.dao.UserDao">

<!--select查询语句-->
<select id="getUserList" resultType="com.yhy.pojo.User">
select * from mybatis.user
</select>

</mapper>

mybatis-config.xml

这个是关键的配置文件,决定了连接的对象以及设定了作用域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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>
<typeAliases>
<package name="com.yhy.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
//事务管理
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
//作用域,删掉就是全局
//这里的配置可以是直接放在resource文件下,就直接写上xml名称就行,放在dao层的话就需要写全路径
<mappers>
<mapper resource="com/yhy/dao/UserMapper.xml"/>
</mappers>
</configuration>

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.yhy.dao;

import com.yhy.pojo.User;
import com.yhy.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
* @Author: yhy
* @Date: 2020/5/12
* @Time: 12:15
*/
public class UserDaoTest {
//借调工具类来使用测试
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();

UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();

for (User u: userList){
System.out.println(u);

}

sqlSession.close();


}


}

结果如下

image-20200512143352609

演示两种mappers作用效果

  • 1.将UserMapper.xml放在dao层下,跟着userdao配置就和我上面写的一样。最后效果如下,但是前提是你得在你项目的pom.xml设置好有效的作用域,要不然就疯狂报错,说找不到这个UserMapper.xml文件。

    image-20200512162240033

pom.xml需要配置如下,这里是配置能够得读取到src下的有效配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>

<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
  • 2.是直接将UserMapper.xml放在src下的resource文件下,和总的mybatis-config.xml配置文件放置在一起。这样在mybatis-config.xml里面就直接如下这样写文件名就行了。
1
<mapper resource="UserMapper.xml"/>

image-20200512143952637

最后效果和第一种方法是一样的,都能够读取到数据。

  • 个人觉得这两种方法来说,第一种可以对项目的整体设计管理更加方便一点,就像接口和实现类都是靠近的,方便进一步的审查和优化,第二种在做小的demo的时候是很方便的,但是一旦多个配置文件时候就可以有点难找。

记录错误

  1. maven创建项目一开始经常会有的错误,就是设定的jdk版本问题,一开始我都是手动去修改project的setting,比较麻烦。默认的版本一般是jdk1.4或者是jdk1.5,但大家往往不是这个版本,所以会报错不支持发行版本5什么的。

解决:现在记录下,永久得起配置好。到自己maven下载文件夹下找到配置文件,并在里面修改settings.xml

image-20200512151703715

image-20200512151630090

修改:如下,我的是jdk11。所以可以根据自己的版本来修改。

image-20200512151902737

初步学习

测试代码中的几个关键类,三者的关系都是从上到下生成。

image-20200512155009281

SqlSessionFactoryBuilder这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例,这样也是开发的规范。

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域,同时好的开发习惯,要在使用之后,将其关闭。SqlSession就相当于jdbc中的Connection对象

namespace:表示的作用的接口范围之类的,绑定的是包名。

resultType:sql语句执行的返回值

增删改查

  1. 编写接口
  2. 写mapper.xml中的sql语句
  3. 执行语句,获得结果(注意增删改提交事务)

处理结果集映射问题

resultmap

这个处理数据库中和实体类的变量名不一样,导致结果出错。使用在主要配置文件中,为了解决列名不匹配的另外一种方式。

使用:property是实体类中的,另一个是数据库中的数据列

1
2
3
4
5
6
写在mybatis_config.xml中
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="hashed_password"/>
</resultMap>
1
2
3
4
5
<select id="selectUsers" resultMap="userResultMap">
select user_id, user_name, hashed_password
from some_table
where id = #{id}
</select>

mybatis中的日志

首先在setting中配置,在官网中有以下的选择。

image-20200514161137980

用键值对的方式去设置各种参数,下面是使用标准日志输出。

1
2
3
4
<settings> 
<!-- 配置了日志输出 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

选择了标准功能,开启日志功能之后,测试执行了一个方法,调用数据库查询某一个id的数据,输出如下

image-20200514162220813

log4j

使用步骤

  • 导包
  • 配置log4j的文件-properties
  • 实例化日志对象
  • 使用对象的方法-info debug error等