MyBatis系列第2篇:入门篇,带你感受一下mybatis独特的魅力!

pom

chat01

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

<mybatis.version>3.5.3</mybatis.version>

<mysql.version>5.1.47</mysql.version>

<lombok.version>1.18.10</lombok.version>

org.mybatis

mybatis

${mybatis.version}

mysql

mysql-connector-java

${mysql.version}

org.projectlombok

lombok

${lombok.version}

provided

junit

junit

4.12

test

ch.qos.logback

logback-classic

1.2.3

chat01/pom.xml内容如下:

<?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”>

mybatis-series

com.javacode2018

1.0-SNAPSHOT

4.0.0

chat01

org.mybatis

mybatis

mysql

mysql-connector-java

org.projectlombok

lombok

junit

junit

ch.qos.logback

logback-classic

上面我们引入了mybatis需要的包、mysql jdbc驱动、lombok、单元测试需要的junit包、日志输出需要的logback包。

这里lombok可能大家没有用过,这个东西可以自动帮我们生成javabean的一些代码,比如get、set方法,可以节省开发编写代码的量,这个以后有空了写一篇文章来介绍。

配置logback

mybatis在运行过程中会输出一些日志,比如sql信息、sql的参数信息、执行的结果等信息,mybatis中会通过logback输出出来。

chat01/src/main/resources目录中新建文件logback.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

%d{mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

创建mybatis相关文件
user.xml

chat01/src/main/resources目录中新建user.xml,内容如下:

<?xml version="1.0" encoding="UTF-8" ?> <![CDATA[ INSERT INTO `t_user` ]]> <![CDATA[ `id`, ]]> <![CDATA[ `name`, ]]> <![CDATA[ `age`, ]]> <![CDATA[ `salary`, ]]> <![CDATA[ VALUES ]]> <![CDATA[ #{id}, ]]> <![CDATA[ #{name}, ]]> <![CDATA[ #{age}, ]]> <![CDATA[ #{salary}, ]]> <![CDATA[ INSERT INTO `t_user` (`id`, `name`, `age`, `salary`) VALUES ]]>

(#{item.id}, #{item.name}, #{item.age}, #{item.salary})

<![CDATA[ UPDATE `t_user` ]]> <![CDATA[ `name` = #{name}, ]]> <![CDATA[ `age` = #{age}, ]]> <![CDATA[ `salary` = #{salary}, ]]> <![CDATA[ AND `id` = #{id} ]]> <![CDATA[ UPDATE `t_user` ]]> <![CDATA[ `name` = #{name}, ]]> <![CDATA[ `age` = #{age}, ]]> <![CDATA[ `salary` = #{salary}, ]]> <![CDATA[ AND `id` = #{id} ]]> <![CDATA[ DELETE FROM `t_user` ]]> <![CDATA[ AND `id` = #{id} ]]> <![CDATA[ SELECT ]]> <![CDATA[ ${item} ]]> <![CDATA[ `id`, `name`, `age`, `salary` ]]> <![CDATA[ FROM `t_user` a ]]> <![CDATA[ AND a.`id` = #{id} ]]> <![CDATA[ AND a.`id` IN ]]> <![CDATA[ #{item} ]]> <![CDATA[ AND a.`name` = #{name} ]]> <![CDATA[ AND a.`age` = #{age} ]]> <![CDATA[ AND a.`salary` = #{salary} ]]> <![CDATA[ AND a.`name` like '%${nameLike}%' ]]> <![CDATA[ AND a.`salary` >= #{salaryGte} ]]> <![CDATA[ order by ${sort} ]]> <![CDATA[ LIMIT #{skip},#{pageSize} ]]>
mybatis-config.xml

chat01/src/main/resources目录中新建mybatis-config.xml,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
UserMapper接口

package com.javacode2018.mybatis.chat01;

import java.util.List;

import java.util.Map;

/**

* 公众号:路人甲Java,工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!

*/

public interface UserMapper {

/**

* 插入用户信息

* @param userModel

* @return

*/

void insert(UserModel userModel);

/**

* 批量插入用户信息

* @param userModelList

*/

void insertBatch(List userModelList);

/**

* 更新用户信息

* @param userModel

* @return

*/

int update(UserModel userModel);

/**

* 通过map来更新用户记录

* @param map

* @return

*/

int updateByMap(Map<String, Object> map);

/**

* 通过map来删除用户记录

* @param map

* @return

*/

int delete(Map<String, Object> map);

/**

* 查询用户列表

* @param map

* @return

*/

List getModelList(Map<String, Object> map);

}

UserModel类

package com.javacode2018.mybatis.chat01;

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;

}

这个类上面的注解都是都是lombok中的,通过这些注解,lombok可以帮助我们自动生成上面4个字段的get方法、set方法、无参构造方法、有参有参构造方法、builder模式构建对象的代码、重写toString方法,这些都在代码编译为字节码之前会写进去,通过lombok代码是不是精简了很多,最后生成的代码大家可以反编译一下UserModel.class去看一下,感受一下,此处我们就不贴出来了。

UserUtil类

package com.javacode2018.mybatis.chat01;

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 java.io.IOException;

/**

* 公众号:路人甲Java,工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!

*/

@Slf4j

public class UserUtil {

private static SqlSessionFactory sqlSessionFactory = build();

public static SqlSessionFactory build() {

try {

return new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(“mybatis-config.xml”));

} catch (IOException e) {

log.error(e.getMessage(), e);

throw new RuntimeException(e);

}

}

@FunctionalInterface

public interface SessionCall {

O call(SqlSession session) throws Exception;

}

@FunctionalInterface

public interface MapperCall<T, O> {

O call(T mapper) throws Exception;

}

public static <T, O> O callMapper(Class tClass, MapperCall<T, O> mapper) throws Exception {

return call(session -> mapper.call(session.getMapper(tClass)));

}

public static  O call(SessionCall sessionCall) throws Exception {

try (SqlSession session = sqlSessionFactory.openSession(true)😉 {

return sessionCall.call(session);

}

}

}

创建单元测试类UserMapperTest

chat01\src\test\java\com\javacode2018\mybatis\chat01中创建UserMapperTest,代码如下:

package com.javacode2018.mybatis.chat01;

import lombok.extern.slf4j.Slf4j;

import org.junit.Test;

import java.util.*;

import java.util.stream.Collectors;

/**

* 公众号:路人甲Java,工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!

*/

@Slf4j

public class UserMapperTest {

//动态插入

@Test

public void insert() throws Exception {

UserModel userModel1 = UserModel.builder().name(“路人甲Java”).build();

UserUtil.callMapper(UserMapper.class, mapper -> {

mapper.insert(userModel1);

return null;

});

log.info(“插入结果:{}”, this.getModelById(userModel1.getId()));

log.info(“---------------------”);

UserModel userModel2 = UserModel.builder().name(“路人”).age(30).salary(50000.00).build();

UserUtil.callMapper(UserMapper.class, mapper -> {

mapper.insert(userModel2);

return null;

});

log.info(“插入结果:{}”, this.getModelById(userModel2.getId()));

}

//批量插入

@Test

public void insertBatch() throws Exception {

List userModelList = new ArrayList<>();

for (int i = 1; i <= 5; i++) {

userModelList.add(UserModel.builder().name(“路人甲Java-” + i).age(30 + i).salary(10000.00 * i).build());

userModelList.add(UserModel.builder().name(“javacode2018-” + i).age(30 + i).salary(10000.00 * i).build());

}

UserUtil.callMapper(UserMapper.class, mapper -> {

mapper.insertBatch(userModelList);

return null;

});

List userModelList1 = UserUtil.callMapper(UserMapper.class, mapper -> mapper.getModelList(null));

log.info(“结果:{}”, userModelList1);

}

//根据用户id删除数据

@Test

public void delete() throws Exception {

Map<String, Object> map = new HashMap<>();

//需要删除的用户id

map.put(“id”, 1);

Integer count = UserUtil.callMapper(UserMapper.class, mapper -> mapper.delete(map));

log.info(“删除行数:{}”, count);

}

//动态更新

@Test

public void update() throws Exception {

//将userId=2的name修改为:路人

Long userId1 = 2L;

Integer count = UserUtil.callMapper(UserMapper.class, mapper -> mapper.update(UserModel.builder().id(userId1).name(“ready”).build()));

log.info(“更新行数:{}”, count);

log.info(“---------------------”);

//将userId=3的name修改为:路人,薪水为:1000.88

Long userId2 = 3L;

count = UserUtil.callMapper(UserMapper.class, mapper -> mapper.update(UserModel.builder().id(userId2).name(“ready”).salary(1000.88D).build()));

log.info(“更新行数:{}”, count);

}

//按用户id查询

public UserModel getModelById(Long userId) throws Exception {

//查询指定id的数据

Map<String, Object> map = new HashMap<>();

map.put(“id”, userId);

return UserUtil.callMapper(UserMapper.class, mapper -> {

List userModelList = mapper.getModelList(map);

if (userModelList.size() == 1) {

return userModelList.get(0);

}

return null;

});

}

//查询所有数据

@Test

public void getModelList1() throws Exception {

List userModelList = UserUtil.callMapper(UserMapper.class, mapper -> mapper.getModelList(null));

log.info(“结果:{}”, userModelList);

}

//查询多个用户id对应的数据

@Test

public void getModelListByIds() throws Exception {

List idList = Arrays.asList(2, 3, 4).stream().collect(Collectors.toList());

Map<String, Object> map = new HashMap<>();

map.put(“idList”, idList);

List userModelList = UserUtil.callMapper(UserMapper.class, mapper -> mapper.getModelList(map));

log.info(“结果:{}”, userModelList);

}

//多条件 & 指定返回的列

@Test

public void getModelList2() throws Exception {

//查询姓名中包含路人甲java以及薪资大于3万的用户id、姓名

Map<String, Object> map = new HashMap<>();

map.put(“nameLike”, “路人甲java”);

map.put(“salaryGte”, 30000.00D);

//需要返回的列

List tableColumnList = new ArrayList<>();

tableColumnList.add(“id”);

tableColumnList.add(“name”);

map.put(“tableColumnList”, tableColumnList);

List userModelList = UserUtil.callMapper(UserMapper.class, mapper -> mapper.getModelList(map));

log.info(“结果:{}”, userModelList);

}

//条件过滤 & 排序 & 分页查询数据 & 只返回用户id、salary

@Test

public void getPage() throws Exception {

//查询姓名中包含路人甲java以及薪资大于3万的用户id,按照薪资倒叙,每页5条取第1页

Map<String, Object> map = new HashMap<>();

map.put(“nameLike”, “路人甲java”);

map.put(“salaryGte”, 30000.00D);

//加入排序参数

map.put(“sort”, “salary desc”);

//加入分页参数

int page = 1;

int pageSize = 5;

map.put(“skip”, (page - 1) * pageSize);

map.put(“pageSize”, pageSize);

//加入需要返回的列

List tableColumnList = new ArrayList<>();

tableColumnList.add(“id”);

tableColumnList.add(“salary”);

map.put(“tableColumnList”, tableColumnList);

List userModelList = UserUtil.callMapper(UserMapper.class, mapper -> mapper.getModelList(map));

log.info(“结果:{}”, userModelList);

}

}

项目最终结构如下

用例:动态插入

运行UserMapperTest#insert,输出如下:

37:58.556 [main] DEBUG c.j.mybatis.chat01.UserMapper.insert - ==>  Preparing: INSERT INTO t_user ( name ) VALUES ( ? )

37:58.605 [main] DEBUG c.j.mybatis.chat01.UserMapper.insert - ==> Parameters: 路人甲Java(String)

37:58.613 [main] DEBUG c.j.mybatis.chat01.UserMapper.insert - <==    Updates: 1

37:58.641 [main] DEBUG c.j.m.chat01.UserMapper.getModelList - ==>  Preparing: SELECT idnameagesalary FROM t_user a WHERE a.id = ?

37:58.641 [main] DEBUG c.j.m.chat01.UserMapper.getModelList - ==> Parameters: 1(Long)

37:58.663 [main] DEBUG c.j.m.chat01.UserMapper.getModelList - <==      Total: 1

37:58.664 [main] INFO  c.j.mybatis.chat01.UserMapperTest - 插入结果:UserModel(id=1, name=路人甲Java, age=1, salary=0.0)

37:58.667 [main] INFO  c.j.mybatis.chat01.UserMapperTest - ---------------------

37:58.668 [main] DEBUG c.j.mybatis.chat01.UserMapper.insert - ==>  Preparing: INSERT INTO t_user ( nameagesalary ) VALUES ( ?, ?, ? )

37:58.675 [main] DEBUG c.j.mybatis.chat01.UserMapper.insert - ==> Parameters: 路人(String), 30(Integer), 50000.0(Double)

37:58.679 [main] DEBUG c.j.mybatis.chat01.UserMapper.insert - <==    Updates: 1

37:58.681 [main] DEBUG c.j.m.chat01.UserMapper.getModelList - ==>  Preparing: SELECT idnameagesalary FROM t_user a WHERE a.id = ?

37:58.681 [main] DEBUG c.j.m.chat01.UserMapper.getModelList - ==> Parameters: 2(Long)

37:58.683 [main] DEBUG c.j.m.chat01.UserMapper.getModelList - <==      Total: 1

37:58.683 [main] INFO  c.j.mybatis.chat01.UserMapperTest - 插入结果:UserModel(id=2, name=路人, age=30, salary=50000.0)

UserMapperTest#insert这个方法主要有4步操作:

步骤1:插入一条用户记录,用户记录只有name字段有值

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

学习视频:

大厂面试真题:

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

m.chat01.UserMapper.getModelList - ==> Parameters: 2(Long)

37:58.683 [main] DEBUG c.j.m.chat01.UserMapper.getModelList - <==      Total: 1

37:58.683 [main] INFO  c.j.mybatis.chat01.UserMapperTest - 插入结果:UserModel(id=2, name=路人, age=30, salary=50000.0)

UserMapperTest#insert这个方法主要有4步操作:

步骤1:插入一条用户记录,用户记录只有name字段有值

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-wUynZXFu-1712801053367)]
[外链图片转存中…(img-CFGMzD2i-1712801053367)]
[外链图片转存中…(img-fjQIlGq3-1712801053368)]
[外链图片转存中…(img-AwruS3IJ-1712801053368)]
[外链图片转存中…(img-H31hUxIk-1712801053368)]
[外链图片转存中…(img-btyu0cU0-1712801053368)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-NGQKzBOp-1712801053369)]

最后

学习视频:

[外链图片转存中…(img-zcNufHyv-1712801053369)]

大厂面试真题:

[外链图片转存中…(img-K8t9cbZn-1712801053369)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-22Ft6NX0-1712801053369)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值