第一天0206
新学了个filter函数
介绍:
这是一个数据查找的js函数,和findIndex类似,在数组中返回满足指定条件的数据
用法:
1 | var ages = [32, 33, 16, 40]; |
- filter 函数中的参数是一个回调函数,回调参数为遍历的每一项,类似forEach
filter函数不要写成 filte(踩坑)
第二天0207
Linux基础命令
ls 查看当前目录下的所有文件,dir 表面上和ls差不多,其实dir是dos的命令,ls是linux自带的
cd 切换目录,cd / 快速回到根目录,cd .. 返回上级目录,cd ~ 切换到home目录, cd - 返回上次目录 cd www 表示切换到www目录下
pwd 查看当前的路径
clear 清空
**mkdir **创建文件夹
rmdir 删除文件夹
rm 删除命令(目录或文件/夹)
ping www.baidu.com 可以去测试网络连接
touch Text.txt 在当前目录下新建Text.txt文件
vi/vim Text.txt编译这个文件,进入一般模式
按下i可以进入输入模式,写完后按下Esc回到一般模式
在一般模式下输入**:wq可以保存并退出,不要写:q!**不保存直接离开好像,还不询问的
cat Text.txt 检查这个文件的内容
-f 忽略不存在的文件,不会出现警告(强制)
-r 递归删除目录
-i 互动,删除询问是否删除
-b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
-n: 不要覆盖任何已存在的文件或目录。
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
rm -rf / 直接递归删除完不询问,等死那种
mv 移动文件或目录,或重命名
移1: mv text.txt Text 将text文件移动到Text目录下
移2: mv Text/ Texts 将Text目录放入Texts目录下,如果Texts目录不存在会将Text改名为Texts
移3: $ mv /user/xxx.qq.com/ .* 将/user/xxx.qq.com目录下的所有文件和目录移到当前目录下
**重: ** mv aaa bbb 将aaa重命名为bbb
docker
版本要求,需要centos内核版本高于3.10
uname -r 查看操作系统的发行版号
uname -a 显示系统名、节点名称、操作系统的发行版号、内核版本等等。
搭建环境
$ yum install -y yum-utils 安装yum
$ sudo yum -y install docker-ce docker-ce-cli containerd.io 下载最新版本docker
$ docker version 验证docker版本
$ sudo systemctl start docker 启动docker
$ systemctl restart docker.service 启动不了就重启
(也不知道为什么要在开头加个$我也没试过,后面我就不写$开头了)
docker run hello-docker 启动名叫hello-docker的容器
docker images 查看本地docker镜像
docker ps [OPTIONS] 显示运行中的容器(OPTIONS那不填的话)
OPTIONS: 可选指令
-a 显示所有的容器,包括未运行
还有别的命令,看起来不常用到就不写了比如-f –format -i什么的
docker rm 可以删除容器/镜像
docker的 -i -t -d
-i 以交互模式运行容器,通常和-t同时使用
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-d 后台运行容器,并返回容器id
-it 组合起来,就当是就绪吧,跑容器的时候会用到好像
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口 (比如mysql容器端口默认是3306,那后面就可以填3306,至于前面的宿主机端口是让个人电脑连接的时候要填的那个端口)
-P: 随机端口映射,容器内部端口随机映射到主机的端口,即随机的是宿主机的端口,
–name 为容器指定一个名称,如: –name=”mysql-01”
–dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
OPTIONS可以写 - 或者 –
在这里常用的有**-d -it -p –name -P –dns **等
COMMAND 好像是写命令的比如/bin/bash,暂未知
实例:
1 | docker run --name mynginx -d nginx:latest |
1 | docker run -P -d nginx:latest |
1 | docker run -p 80:80 -v /data:/data -d nginx:latest |
第三天0208
spring基础
resources下的beans.xml文件就可以看做是spring的容器
被spring托管后会出现小叶子的绿色标志
1 | <?xml version="1.0" encoding="UTF-8"?> |
其实property除了name属性,还有个ref属性,甚至可以这样p:ref=”xxx”
这个ref就是指向已经被导入引用的bean标签的id
pojo类的代码
1 | package com.wzkang.pojo.demo; |
测试类的代码
1 | public class MyTest { |
关于autowire 自动装配功能
没错,是小写的作用在bean标签上的autowire不是注解那个大写@Autowired
这个属性有2个值
autowire=”byType”
autowire=”byName”
autowire主体使用起来就有点像ref那样,自动找到并装配,然后完成工作
先讲byType
1 | <bean class="com.wzkang.pojo.Dog" p:name="ErHa" /> |
Hello.java的内部代码
1 | package com.wzkang.pojo; |
Dog.java的内部代码
1 | package com.wzkang.pojo; |
1 | import com.wzkang.pojo.Hello; |
最后关于byName一看就知道是和名字有关的,没错同样需要class引用Dog类,然后写个name是dog就行,千万不能是Dog、doG、dOg、doge这样,因为spring自动把set后面的大写字母给转换成小写了,讲了很多遍了。
关于@Autowired注解
其实和bean标签上的autowired差不多啦
只是写在代码类上而已,应该吧
拿之前的代码来做演示
Hello.java的内部代码
1 | package com.wzkang.pojo; |
关于@Qualifier注解
这个注解主要是帮助Autowired注解在复杂的问题上做出选择
使用@Qualifier(value = “xxx”)来具体指向目标
先看beans.xml的代码
1 | <bean id="dog1" class="com.wzkang.pojo.Dog" p:name="ErHa" /> |
Hello.java的内部代码
1 | package com.wzkang.pojo; |
关于@Component注解
扫描组件嘛,说明这个类被spring管理了,前提是spring要开放扫描
用法:在要被spring托管的那个类的上方写上就行
先看beans.xml那
1 | <context:component-scan base-package="com.wzkang.pojo"/> |
Hello.java内部代码
1 | package com.wzkang.pojo; |
就连Dog类都用@Component被spring管理了
至于值是怎么插入进去的呢?
1 |
|
关于@Component注解下的几个衍生注解
dao [@Repository]
service [@Service]
controller [@Controller]
其作用和@Component是一样的
只是代表放在这些这些类的这些地方而已
比如上面那个Dog类或许就应该用@Repository而不是@Component呢?
关于@Nullable注解
被该字段标记的属性可以为空,简单粗暴。
关于@Scope注解
也就是作用域
属性有singleton(默认,单例)和prototype(原型)
1 |
|
直接看下面这个简单明了
1 |
|
说白了,默认(单例)模式下,一个人就是一个人,哪怕它又被new了一次,
他这个人也还是这个人,在原型模式下这个人才会变。
第四天0209
spring动态代理
在不改变程序逻辑的情况下增加功能,平常就直接在那个程序方法上直接加代码,这样可读性差,
也要重新编译,所以不这样搞。
下面看多余的代码
SomeService.java:
1 | public interface SomeService {//接口负责提供方法 |
SomeServiceImpl.java:
1 | public class SomeServiceImpl implements SomeService{ |
怎么优化?
写个工具类
比如util包下的ServiceTools.java
看代码:
1 | public class ServiceTools { |
但是这样优化了也不够好,因为还是有方法调用
1 | public class SomeServiceImpl implements SomeService{ |
我们最终的目标是不修改service类的代码,也能够增添功能
动态代理:可以在程序执行过程中,创建代理对象。
通过代理对象执行方法,给目标类增加额外的功能(功能增强)
jdk动态代理实现步骤:
1.创建目标类,SomeServiceImpl目标类,要给它的doSome和doOther增加功能。
1 | public class SomeServiceImpl implements SomeService{ |
2.创建InvocationHandler接口的实现类,在这个类实现给目标方法增加功能。
*重点
1 | public class MyIncationHandler implements InvocationHandler { |
3.使用jdk中,类Proxy,创建代理对象。实现创建对象的能力。
1 |
|
运行结果:
调用了MyIncationHandler中的invoke方法
非业务方法,方法的执行时间:Thu Feb 10 18:50:31 CST 2022
执行业务方法doSome
方法执行完毕后,提交事务
调用了MyIncationHandler中的invoke方法
非业务方法,方法的执行时间:Thu Feb 10 18:50:31 CST 2022
执行业务方法doOther
方法执行完毕后,提交事务
其实就只是在业务方法的之前之后增添新功能罢了,讲了很多遍。
第五天02010
mybatis基础
搭建数据库
CREATE TABLE user (
id int NOT NULL AUTO_INCREMENT,
name varchar(30) DEFAULT NULL,
pwd varchar(30) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3;
INSERT INTO user (id,name,pwd) VALUES
(1,‘张三’,123456),
(2,‘李四’,654321),
(3,‘王五’,123321)
新建项目
创建个普通的maven项目,jdk最好还是1.8版本,很多公司还在用
不勾选√,直接next
Groupld:com.wzkang
Artifactld:Mybatis-Study
next
Project name 把-加上
下面选择项目存放路径
finish
接下来左上角File–Settings–Build,Excution.Deployment–Build Tools–Maven
如果是Bundled (Maven 3)的话就改成自己的,不然的话就存放到c盘了,这个maven是java自带的
接下来这里我删除了src目录
Mybatis-Study.iml内部代码
导入maven依赖
1 |
|
接下来new一个module
新建模块,不勾选直接next
Aritfactld:mybatis-01
next 记得加-
finish
弄完这些可以看到idea右边的Maven都好了
在src-main-resources下新建个mybatis-config.xml文件
其代码如下:
1 |
|
配合mysql使用,这里用idea连接数据库
idea右边有个DataBase点进去+号
DataBase Source-MySQL
Host:47.101.139.146 数据库地址
Port:3307 数据库端口号
User: 数据库用户名
Password: 数据库密码
Database: 数据库名字
Url:jdbc:mysql://47.101.139.146:3307/BSAN
jdbc:mysql//是mysql特有的,如果是oracle的话是别的写法
然后就是地址:端口/数据库名字缝合
然后就连上数据库了
编写mybatis工具类
在java包下规范new文件
com.wzkang.dao(都是package)
再来个和dao同级目录的utils工具类
在此目录下new一个MybatisUtils.java
看代码:
1 | package com.wzkang.utils; |
然后编写代码
实体类
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
50package com.pojo;
//先创建pojo实体类存放的package
public class User {
//然后依据数据库的内容写属性
private int id;
private String name;
private String pwd;
//最后就是有参无参,setget,tostring
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = 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;
}
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}原本接下来按照jdbc是要写重复代码
但是mybatis的特点是避免了几乎所有的jdbc代码和手动设置参数以及获取结果集
所以下面的这个类就删了吧
1
2
3
4
5
6
7
8
9
10
11package com.wzkang.dao;
import com.pojo.User;
import java.util.List;
public class UserDaoImpl implements UserDao{
public List<User> getUserList() {
return null;
}
}Dao接口
1
2
3
4
5
6
7
8
9package com.wzkang.dao;
import com.wzkang.pojo.User;
import java.util.List;
public interface UserDao {
List<User> getUserList();
}接口实现类由原来的UserDaoImpl转变为一个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
<!--
上面头文件不管他
这个文件的名字和存放地点好像是不做要求的
-->
<!--
namespace绑定一个对应的Dao接口现在也可以叫做Mapper接口
不然怎么产生交集发生关系?就是通过这个namepace来唯一定位
这样才可以让名称空间绑定那个UserDao接口
-->
<mapper namespace="com.wzkang.dao.UserDao">
<!--玩xml一个<就可以看出所有东西了-->
<select id="getUserList" resultType="com.wzkang.pojo.User">
<!--
select就是查询的sql语句嘛,id是UserDao接口内的方法名字
这个查询是有结果集的,所以在标签后面用resultType(类型),或者resultMap(集合)
目前就先记这2个,至于属性值要写全限定名,初学者先写集合内的泛型,不搞什么集合先
-->
select * from BSAN.user//加个屁;号 踩坑了
</select>
//select标签内不可以有注解,不然好像也会报错!!!!!
</mapper>接下来测试
对想要测试的方法ctrl+shift+t可以快捷生成Test测试类,直接Enter就是规范的。
最好是规范建立,在哪个地方用就建在test/java包下的哪个包下面。
UserDaoTest.java内部代码
1 | package com.wzkang.dao; |
运行结果:
User{id=1, name=’张三’, pwd=’123456’}
User{id=2, name=’李四’, pwd=’654321’}
User{id=3, name=’王五’, pwd=’123321’}
第六天02011
mybatis继承昨天的学习成果完成增删改查
关于报错问题
主要是target文件夹的test-classes-com-wzkang-dao文件夹下(好奇怪,不应该是target-classes-com-wzkang-dao这个文件夹下吗,怎么好像放哪里都行啊这个配置文件)
没有UserMapper.xml,它并不会自动将上面写好的xml配置文件复制下来,在这里需要手动复制才可以
如何解决Maven的问题?复制太麻烦了吧?
Maven特性约定大于配置,所以我们要配置resouces,防止资源导出失败的问题
这里把代码添加在了pom.xml文件中
1 | <build> |
总结一下:
需要一个工具类,获取SqlSession对象,怎么获取呢?
需要获取SqlSessionFactory对象,用他的openSession()方法获取SqlSession对象,怎么获取呢?
需要实例化更父级的类 xxx = new SqlSessionFactoryBuider().build(inputstream)通过这个方法传入一个流才行
inputstream = Resources.getResourceAsStream(resource)//用这个类里面的静态方法传入xml配置文件
resource = “mybatis-config.xml”
这是最基础也最要的步骤了,制作一个工具类专门获取SqlSession对象。
制作完这个再回头编写mybatis-config.xml文件。
主要就是连接数据库的基本操作。
什么注册驱动,url,username,password,然后最重要的就是在配置文件中注册 mapper了。
接下来就去写pojo的实体类吧比如User的有参无参等。
再接下来就可以去写接口了,然后写与接口有交情的UserMapper.xml。
最后写Test测试。
非要加的话可以加maven的配置。
再补上,那个什么close啊以及什么openSession之类的说是要try-catch-final这样,只是说而已。
添加个根据id找用户的功能
1 | public interface UserDao { |
下一步是要去配置文件配置刚刚写的方法
1 | <select id="getUserById" resultType="com.wzkang.pojo.User" parameterType="int"> |
添加个插入用户的功能
1 | public interface UserDao { |
同理
1 | <insert id="addUser" parameterType="com.wzkang.pojo.User">//接收参数类型是User用户类 |
测试下:
1 | SqlSession sqlsession = MybatisUtils.getSqlSession(); |
一开始遇到了ExceptionInInitializerError报错,也不知道哪里出问题了,只知道删掉insert标签那边就可以恢复正常,一口气加上去又不行,会报错,但是只要我写一点点代码再跑一下,慢慢来又不会报错,真是玄学。
添加个修改功能
1 | public interface UserDao { |
UserMapper.xml看看
1 | <update id="updateUser" parameterType="com.wzkang.pojo.User"> |
最后
1 |
|
接下来是删除功能
1 | public interface UserDao { |
1 | <delete id="deleteUser" parameterType="int"> |
1 |
|
没啥好讲的。
第七天02012
mybatis-万能的map
当要传递的字段或者参数过多的时候可以考虑用map传。
1 | int addUser2(Map<String ,Object> map); |
1 | <insert id="addUser2" parameterType="map"> |
1 |
|
当然,也可以反向用map,比如
1 | User getUserById2(Map<String,Object> map); |
再讲个细节,如果输入类型是基本类型的话可以省略不写
1 | parameterType="int">//比如把这个 删了 |
1 | <select id="getUserById" resultType="com.wzkang.pojo.User" parameterType="int"> |
还有就是为什么我的是BSAN.user?
因为我用idea连接了数据库,否则的话把名字删了,直接写表名就行
关于模糊查询的问题
正常能想到的写法是这样的
1 | User getUserLike(String value); |
1 | <select id="getUserLike" resultType="com.wzkang.pojo.User"> |
1 |
|
来看另一种写法
1 | <select id="getUserLike" resultType="com.wzkang.pojo.User"> |
1 |
|
还有种写法会发生sql注入的问题
1 | <select id="getUserLike" resultType="com.wzkang.pojo.User"> |
1 | public void getUserLike(){ |
新的轮回,第一天2/22
mybatis-配置之属性优化
新建了个大的包,叫做mybatis-02
主体上把mybatis-01上的大部分内容抄了过来,但是删减了很多东西,使之成为纯净的。
回到之前的mybatis-config.xml文件
1 |
|
先来看
那个
1 | <environments default="development"> |
这个default就是选择要选择那套环境的id
1 | <transactionManager type="JDBC"/> |
选择JDBC——这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
而MANAGED几乎不做什么,它从来不提价或回滚一个连接,而是让容器来管理事务的整个生命周期,默认情况下它会管理连接,但是一些容器并不希望这样,因此需要将closeConnection属性设置为false来组织它默认的关闭行为。例如:
1 | <transactionManager type="MANAGED"/> |
但是如果用spring+mybatis就没必要搞这个。面试的时候不要只说JDBC一种就行。
下面来看数据源(dataSoure)
1 | <dataSource type="POOLED"> |
有三种的数据源类型
type=”[UNPOOLED|POOLED|JNDI]”
翻译:【没有连接池|池子|正常连接】
先来看池的概念:用完可以回收
UNPOOLED:每次被请求时打开和关闭连接,虽然有点慢,但是对性能方面没有较高要求。
默认是POOLED,用完不会关掉,下个连进来还可以用。
只要了解概念,会搞多套环境就行。
接下来是properties文件
我在resources文件夹下新建了个db.properties文件
1 | driver=com.mysql.jdbc.Driver |
主要就是编写数据库的文件
内容就是注册驱动啊,数据库地址啊,数据库账号和密码啊什么的。
重点的是引入,怎么引入呢?
有个重点,xml还是有点严格的,需要遵守规矩,其标签需要按如下顺序放:
properties——settings——typeAliases——typeHandlers——objectFactor——objectWrapperFactor——reflectorFactory——plugins——environments——databaseldProvider——mappers\
比如这样:
1 | <configuration> |
这样就引入了外部文件
resources翻译:资源
做完这步就可以便捷的导入资源了
1 | <property name="driver" value="${driver}"/> |
看,还是${}占位,一样的东西。
当然还可以这样玩:
1 | <properties resource="db.properties"> |
下面照样用。
既然如此,衍生出个没事找事的主意,既在外部文件写上密码,又在内部propertie覆写密码
出现什么问题呢?
当然是以外部properties的导入源为准,外面对就对,外面错就错。
1 | <typeAliases> |
两种方式,一种是typeAlias,给一个实体类取别名,别人用的时候用小名就行。
另一种方式是package,扫描包,它的默认别名就是这个类的类名的首字母小写,当然用大写也可以,但是还是要规范。
在实体类较少的时候,使用第一种方式;
如果实体类十分多,建议用第二种。
区别:第一种可以DIY别名,第二种则·不行·
当然用@Alias注解可以改别名
实例:
1 |
|
在实体类头上用mybatis包下的Alias注解
其默认value是hello,就是小名了。
注意:只有让userMapper.xml,也就是有用到hello的地方,不管别的sql语句有没有用到hello这个小名,都要用上hello,不能写之前的package的默认小名。否则报错
别名可以取_int之类的,带 _ 的都是八大基本类型,也就是映射类型就是int
不带_直接写int的话,映射类型就是Integer。
设置settings
MyBatis中极为重要的调整设置,它们会改变MyBatis的运行时行为。
就说几个可能遇见的
cacheEnabled:开启缓存。
lazyLoadingEnabled:懒加载。 //效率提高?
useGeneratedKeys:允许JDBC支持自动生成主键,需要驱动支持。如果为true,则强制使用自动生成主键,尽管一些驱动不能支持但任可正常工作。(比如Derby)//不知道啥时Derby
mapUnderscoreToCamelCase:是否开启自动驼峰命名规则(camel|case)映射,即从经典数据库列名A_COLUMN到经典Java属性名aColumn的类似映射。//大部分看不懂,总之数据库中不区分大小写,Oracle全都会转化成大写,总之最后这玩意儿好像是这样的 lastName—>last_Name ??真的吗?不知道啊
logImpl:指定MyBatis所用日志的具体实现,未指定时将自动查找。//目前为止先记住这一个 ???
映射器mappers
每一个Mapper.XML都需要在Mybatis核心配置文件中注册。
1 | <mappers> |
用class注册
1 | <mappers> |
踩坑点:
1.接口和他的Mapper配置文件必须同名!
2.接口和他的Mapper配置文件必须在同一个包下!
第二天2/23
mybatis-生命周期-作用域(scope)
mybatis-config.xml配置文件
↓
开始—>SqlSessionFactoryBuilder—>SqlSessionFactory—>SqlSession—>SQL Mapper—>结束
奇思妙想记忆:在什么都没有的荒漠星球上,利用SqlSessionFactoryBuilder(工厂的建造者,FactoryBuilder是这么翻译的)构造一个基地,但是肯定需要水流的,基建嘛(暗示需要InputStream,从Resources.getResourceAsStream(“ mybatis-config.xml”)来,对应上图),工厂地基搭建好后就只剩下SqlSessionFactory了(工厂的具体显现),然后是利用他的openSession方法创建很多SqlSession请求(服务员),最后迎接顾客(暗示UserDao.class接口,也就是Mapper,从这调方法),因为顾客知识渊博,从中牟利。
SqlSessionFactoryBuilder一旦创建完工厂就不用它了,丢弃不要,所以是局部的。
* SqlSessionFactory一旦创建完就没有理由丢弃它或重新创建另一个实例,可以想象为数据库连接池。
SqlSession可以想象为连接到连接池的请求,因为不是线程安全的,所以需要用完关闭,否则资源被占用!
发行版本乱改的问题
1 | <properties> |
搞了一个小时的复制mybatis–03项目,基本就是各种错误,不要一口气复制多了,会导致鸠占鹊巢现象,很麻烦,我现在maven都多个root看的强迫症犯了,好在不影响使用,没办法明天再学,已经12.30了。
踩坑经历:改了目录名字以后,mappers里也要改!
第三天2/24
mybatis接档知识错误排查与ResultMap初用
首先是数据库字段与代码字段不匹配问题
如:
数据库的密码叫做pwd,程序的User用户类的密码叫做password,那么sql语句的*号就会以数据库的字段为主,pwd的字段不匹配导致运行结果为null,解决方案,利用pwl as password 可以暴力解决,也就是起别名就能解决方法了。
但是这样做没有意义,让我们看看下面的解决方法。
引入一个很重要的概念
ResultMap结果集
这玩意儿是mybatis中最重要最强大的元素。
现在先来看简单映射来解决字段不匹配问题
直接看代码
1 | //先回顾下resultType返回类型,parameterType是输入类型 |
这样搞password字段不匹配问题就解决了。
但是真正复杂的是后面。
第四天2/24
settings设置的使用
首先明确表明,这个标签在mybatis-config.xml里使用,上下有级标签有先后顺序,如下
1 | </properties> |
name:属性可以有很多,前面几天刚开始了解的时候是有讲的,这里先讲下日志的使用,填logImpl,需要注意大小驼峰法命名,区分大小写,不要无辜增删空格,否则会报错,因为约定大于配置。
value:这里对logImpl可以是:
SLF4J|LOG4J|LOG4J2|JDK_LOGGING|COMMONS_LOGGING|STDOUT_LOGGING|NO_LOGGING
默认值官方是没有设定的。
看着参数很多,这里加粗的需要掌握,别的先了解。
在mybatis中具体使用哪个日志实现,在设置中设定!
STDOUT_LOGGING是标准日志输出
ERROR警告:
1 | log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory). |
来看使用标准日志输出的运行结果 :
1 | Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. |
接下来我们看LOG4J
首先需要pom.xml导入maven依赖
1 | <dependencies> |
1 | <setting name="logImpl" value="LOG4J"/> |
然后设置使用LOG4J,注意不要打错和多余空格之类。
最后在resources新建个log4.properties文件,复制以下内容丢进去。
1 | #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 |
最后调用deg可以实现日志功能,但我感觉真麻烦。
反正以后要搞日志就可以用log4j来实现了,写个properties给log4j,代码直接百度复制,测试类使用的代码如下:
1 | static Logger logger = Logger.getLogger(UserDaoTest1.class); |
lombok偷懒神器
首先导入Maven的依赖jar包
1 | <dependency> |
@Data
就包含了无参构造,get、set、toString、hashcode、equals
注意!用了@AllArgsConstructor以后,无参构造就变为了全参构造了!!!
@AllArgsConstructor
就是全参构造。
@NoArgsConstructorr
就是无参构造,@Data中写了全参构造(不管是哪儿来的)就要去补无参构造。
当然还有什么@toString,@equalsandhashcode,@GetterSetter,其实都可以被@Data替代,知道有这个东西就行了。
mybatis利用limit分页查询
1 | List<User> getUserByLimit(Map<String,Integer> map); |
写完接口就写Mapper的配置代码
1 | <select id="getUserByLimit" parameterType="map" resultMap="userList"> |
最后Test测试单元代码如下:
1 | SqlSession sqlsession = MybatisUtils.getSqlSession(); |
lambda匿名表达式
() -> {}
大意写法是这样没错,但这和传统函数有什么不一样的呢?
传统函数:
1 | int add (int a,int b){ |
第五天2/25
lambda继续深造
1 | public class MyTest { |
简化:
1 | Itfc itfc1 = a -> a + 2; |
这里只探讨接口里只有一种方法的情况,有多种会报错,暂不知如何解决。
其他几种情况:
1 | interface Itfc{ |
::的引用
xxx:xxx说白了就是引用前面那个对象的方法
1 | interface Itfc{ |
由此可见,::引用出来必须要赋一个对象,这个对象一定是高度匹配的某一接口类,而且这个接口里只能有一个方法。
::new的使用
就是引用某个类的构造方法而已
1 | interface DogService1 { |
下一个实例:根据年龄排序
1 |
|
@FunctionInterface注解
1 |
|
不知道没啥用
mybatis-回到主题-注解开发
一上来把UserDaoDMapper.xml删了,还把mybatis-config.xml里的mapper配置引入也删了,这就是注解吗。。
1 | //查询所有用户 |
这样一来就没有了Mapper.xml配置文件了
那么直接让mybatis-config.xml绑定接口,本来是绑定Mapper嘛,现在换个人绑
1 | <mappers> |
缺陷:password=null,字段又不匹配了
项目实际开发,公司可能不让用注解的,其次不好维护。