先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
在mybatis中一般我们将一个表的所有sql操作写在一个mapper xml中,一般命名为XXXMapper.xml
格式。
创建文件chat02/src/main/resource/mapper/UserMapper.xml
,内容如下:
mapper xml
根元素为mapper
,这个元素有个namespace
属性,系统中会有很多表,每个表对应一个Mapper xml
,为了防止mapper文件重复,我们需要给每个mapper xml文件需要指定一个namespace,通过这个可以区分每个mapper xml文件,上面我们指定为com.javacode2018.chat02.UserMapper
。
一会对t_user
表的所有操作相关的sql,我们都会写在上面这个xml中。
mybatis全局配置文件中引入Mapper xml文件
UserMapper.xml我们写好了,如何让mybatis知道这个文件呢,此时我们需要在mybatis-config.xml
全局配置文件中引入UserMapper.xml
,在mybatis-config.xml
加入下面配置:
mappers元素
下面有多个mapper
元素,通过mapper元素
的resource属性
可以引入Mapper xml文件,resource
是相对于classes的路径。
上面说的都是一些配置文件,配置文件都ok了,下面我们就需要将mybatis跑起来了,此时需要使用到mybatis中的一些java对象了。
构建SqlSessionFactory对象
//指定mybatis全局配置文件
String resource = “mybatis-config.xml”;
//读取全局配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//构建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory是一个接口,是一个重量级的对象,SqlSessionFactoryBuilder通过读取全局配置文件来创建一个SqlSessionFactory
,创建这个对象是比较耗时的,主要耗时在对mybatis全局配置文件的解析上面,全局配置文件中包含很多内容,SqlSessionFactoryBuilder通过解析这些内容,创建了一个复杂的SqlSessionFactory
对象,这个对象的生命周期一般和应用的生命周期是一样的,随着应用的启动而创建,随着应用的停止而结束,所以一般是一个全局对象,一般情况下一个db对应一个SqlSessionFactory对象。
构建SqlSession对象
SqlSession相当于jdbc中的Connection对象,相当于数据库的一个连接,可以用SqlSession来对db进行操作:如执行sql、提交事务、关闭连接等等,需要通过SqlSessionFactory
来创建SqlSession
对象,SqlSessionFactory
中常用的有2个方法来创建SqlSession对象
,如下:
//创建一个SqlSession,默认不会自动提交事务
SqlSession openSession();
//创建一个SqlSession,autoCommit:指定是否自动提交事务
SqlSession openSession(boolean autoCommit);
SqlSession接口中很多方法,直接用来操作db,方法清单如下,大家眼熟一下:
T selectOne(String statement);
T selectOne(String statement, Object parameter);
List selectList(String statement);
List selectList(String statement, Object parameter);
List selectList(String statement, Object parameter, RowBounds rowBounds);
<K, V> Map<K, V> selectMap(String statement, String mapKey);
<K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey);
<K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);
Cursor selectCursor(String statement);
Cursor selectCursor(String statement, Object parameter);
Cursor selectCursor(String statement, Object parameter, RowBounds rowBounds);
void select(String statement, Object parameter, ResultHandler handler);
void select(String statement, ResultHandler handler);
void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);
int insert(String statement);
int insert(String statement, Object parameter);
int update(String statement);
int update(String statement, Object parameter);
int delete(String statement);
int delete(String statement, Object parameter);
void commit();
void commit(boolean force);
void rollback();
void rollback(boolean force);
List flushStatements();
void close();
void clearCache();
Configuration getConfiguration();
T getMapper(Class type);
Connection getConnection();
上面以select
开头的可以对db进行查询操作,insert
相关的可以对db进行插入操作,update相关的可以对db进行更新操作。
引入lombok支持(非必须)
声明一下:lombok不是mybatis必须的,为了简化代码而使用的,以后我们会经常使用。
Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。
Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。
lombok的使用步骤
- 先在idea中安装lombok插件
打开idea,点击File->Settings->plugins
,然后搜索Lombok Plugin
,点击安装就可以了。
- maven中引入lombok支持
org.projectlombok
lombok
1.18.10
provided
- 代码中使用lombok相关功能
引入logback(非必须)
声明一下:日志框架mybatis中也不是必须的,不用配置也可以正常运行。
为了方便查看mybatis运行过程中产生的日志,比如:执行的sql、sql的参数、sql的执行结果等等调试信息,我们需要引入日志框架的支持,logback是一个很好的日志框架,此处我们就使用这个
mybatis中集成logback步骤
- maven中引入logback支持
ch.qos.logback
logback-classic
1.2.3
- src/main/resources中创建
logback.xml
文件:
%d{mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
logback.xml具体的写法不是本文讨论的范围,有兴趣的朋友可以去研究一下logback具体的用法。
上面xml中配置了
com.javacode2018
包中所有的类,使用logback输出日志的时候,debug级别及以上级别的日志会输出到控制台,方便我们查看。
写一个测试用例
在chat02/src/test
下创建一个类:
com.javacode2018.chat02.UserTest
内容如下:
package com.javacode2018.chat02;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
@Slf4j
public class UserTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void before() throws IOException {
//指定mybatis全局配置文件
String resource = “mybatis-config.xml”;
//读取全局配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//构建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
this.sqlSessionFactory = sqlSessionFactory;
}
@Test
public void sqlSession() {
SqlSession sqlSession = this.sqlSessionFactory.openSession();
log.info(“{}”, sqlSession);
}
}
上面代码中有个@Slf4j
注解,这个是lombok提供的,可以在这个类中生成下面代码:
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserTest.class);
运行一下上面的用例:sqlSession
方法,输出如下:
45:51.289 [main] INFO com.javacode2018.chat02.UserTest - org.apache.ibatis.session.defaults.DefaultSqlSession@1f021e6c
使用SqlSesion执行sql操作
SqlSession常见的用法
SqlSession相当于一个连接,可以使用这个对象对db执行增删改查操作,操作完毕之后需要关闭,使用步骤:
1.获取SqlSession对象:通过该sqlSessionFactory.openSession方法获取SqlSession对象
2.对db进行操作:使用SqlSession对象进行db操作
3.关闭SqlSession对象:sqlSession.close();
常见的使用方式如下:
//获取SqlSession
SqlSession sqlSession = this.sqlSessionFactory.openSession();
try {
//执行业务操作,如:增删改查
} finally {
//关闭SqlSession
sqlSession.close();
}
上面我们将SqlSession的关闭放在finally
块中,确保close()一定会执行。更简单的方式是使用java中的try()
的方式,如下:
try (SqlSession sqlSession = this.sqlSessionFactory.openSession()😉 {
//执行业务操作,如:增删改查
}
新增操作
需求:传入UserModel
对象,然后将这个对象的数据插入到t_user
表中。
创建一个UserModel
新建一个com.javacode2018.chat02.UserModel
类,代码如下:
package com.javacode2018.chat02;
import lombok.*;
/**
* 公众号:路人甲Java,工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class UserModel {
private Long id;
private String name;
private Integer age;
private Double salary;
private Integer sex;
}
这个类的字段和t_user
表对应。
UserMapper.xml中定义插入操作
我们说过了,对t_user
表的所有sql操作,我们都放在UserMapper.xml
中,我们在UserMapper.xml
中加入下面配置,使用insert元素
定义插入操作:
insert
元素用来定义了一个对db的insert操作
id:是这个操作的一个标识,一会通过mybatis执行操作的时候会通过这个namespace和id引用到这个insert操作,
parameterType:用来指定这个insert操作接受的参数的类型,可以是:各种javabean、map、list、collection类型的java对象,我们这个插入接受的是UserModel
对象。
insert元素内部定义了具体的sql,可以看到是一个insert的sql,向t_user表插入数据。
需要插入的值从UserModel对象中获取,取UserModel
对象的的字段,使用**#{字段}**这种格式可以获取到UserModel中字段的值。
调用SqlSession.insert方法执行插入操作
t_user插入的sql我们已经在UserMapper中写好,此时我们怎么调用呢?
需要调用SqlSession.insert
方法:
int insert(String statement, Object parameter)
这个方法有2个参数:
statement:表示那个操作,值为Mapper xml的namespace.具体操作的id
,如需要调用UserMapper.xml
中的insertUser
操作,这个值就是:
com.javacode2018.chat02.UserMapper.insertUser
parameter:insert操作的参数,和Mapper xml中的insert中的parameterType
指定的类型一致。
返回值为插入的行数。
UserTest
类中新增一个测试用例:
@Test
public void insertUser() {
try (SqlSession sqlSession = this.sqlSessionFactory.openSession(false)😉 {
//创建UserModel对象
UserModel userModel = UserModel.builder().id(2L).name(“javacode2018”).age(30).salary(50000D).sex(1).build();
//执行插入操作
int result = sqlSession.insert(“com.javacode2018.chat02.UserMapper.insertUser”, userModel);
log.info(“插入影响行数:{}”, result);
//提交事务
sqlSession.commit();
}
}
运行输出如下:
01:46.683 [main] DEBUG c.j.chat02.UserMapper.insertUser - ==> Preparing: INSERT INTO t_user (id,name,age,salary,sex) VALUES (?,?,?,?,?)
01:46.745 [main] DEBUG c.j.chat02.UserMapper.insertUser - ==> Parameters: 2(Long), javacode2018(String), 30(Integer), 50000.0(Double), 1(Integer)
01:46.751 [main] DEBUG c.j.chat02.UserMapper.insertUser - <== Updates: 1
01:46.751 [main] INFO com.javacode2018.chat02.UserTest - 影响行数:1
输出中打印了详细的sql语句,以及sql的参数信息,可以看到Mapper xml中的
#{}
被替换为了?
,这个使用到了jdbc中的PreparedStatement
来对参数设置值。
输出中的第二行详细列出了参数的值以及每个值的类型。
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
INFO com.javacode2018.chat02.UserTest - 影响行数:1
输出中打印了详细的sql语句,以及sql的参数信息,可以看到Mapper xml中的
#{}
被替换为了?
,这个使用到了jdbc中的PreparedStatement
来对参数设置值。
输出中的第二行详细列出了参数的值以及每个值的类型。
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
[外链图片转存中…(img-k7cPeWF4-1713640184539)]
[外链图片转存中…(img-yszvtiR7-1713640184540)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-voj5aNB5-1713640184540)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!