SpringBoot整合数据库相关框架
接下来我们要做的内容就是使用SpringBoot整合mybatis框架。
先声明一点,以下的代码块只是个人练习的小记录,确实有借鉴别的参考数据,全程自己敲打。并且代码是进行过个人的缩减修改放置。不要完全搬我的代码使用。
首先先提及整合jdbc的内容:
1、整合JDBC
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
#版本这里默认的是2.0.0
数据库驱动也是必不可少的一部分,当然SpringBoot不会知道或者推断出我们会使用什么数据库,这里我使用的是MySQL:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
设置连接池参数:
# 连接四大参数
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=123
# 可省略,SpringBoot自动推断
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=10
创建实体类(省略,设置get和set方法)
这里举例一个:
public class User implements Serializable {
private Long id;
// 用户名
//自动转换下换线到驼峰命名user_name -> userName
private String userName;
// 密码
private String password;
// 姓名
private String name;
// 年龄
private Integer age;
// 性别,1男性,2女性
private Integer sex;
// 出生日期
private Date birthday;
// 创建时间
private Date created;
// 更新时间
private Date updated;
// 备注
private String note;
设置Dao层:
@Repository
public class JdbcDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<User> findAll() {
return jdbcTemplate.query("select * from tb_user", new BeanPropertyRowMapper<>(User.class));
}
}
最后完成测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class JdbcDaoTest {
@Autowired
private JdbcDao jdbcDao;
@Test
public void findAll() {
List<User> list = jdbcDao.findAll();
for (User user : list) {
System.out.println(user);
}
}
}
这里我编译成功后所展示的内容如下(后续的截图不打算展示了,反正结果都是一样呵呵):
这里我是调用数据库的内容完成本次的JDBC整合,接下来我们使用mybatis整合。
2、整合mybatis
首先介绍一下springboot整合下的mybatis。因为springboot官方不会提供mybatis的启动器,所以我们这里要使用mybatis自己实现的启动器,如下:
<!--mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
这里我使用的是1.3.2版本的,当然要兼顾自己springboot的启动类版本才行。
配置上添加如下:
# mybatis 别名扫描
mybatis.type-aliases-package=com.lxs.domain
# mapper.xml文件位置,如果没有映射文件,请注释掉
mybatis.mapper-locations=classpath:mappers/*.xml
首先就是添加自己的别名进行扫描。这里可以不区分大小写,设置好该包下的实体类。同样的我也是用整合jdbc用的实体类。
设置接口:
我们在这里设置的是Dao层接口:
public interface UserDao {
public List<User> findAll();
}
然后是映射文件:
<?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.lxs.demo.dao.UserDao">
<select id="findAll" resultType="user">
select * from tb_user
</select>
</mapper>
我这里设置的xml是放置在src/main/resources下。如果是这样使用IDEA的兄弟们不用设置额外的内容在pom文件
紧接着就是使用Mapper的加载接口代理对象:
第一种方法:使用@Mapper
@Mapper public interface UserMapper { }
第二种方法:设置MapperScan,注解扫描的包。这里可以使用第二种方法最好不过。
@SpringBootApplication @MapperScan("com.xaf.dao") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
紧接着进入测试环节:
首先就是构建依赖,即前面说的测试构建依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
进行测试代码:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {
@Autowired
private UserDao userDao;
@Test
public void testFindAll() {
List<User> list = userDao.findAll();
}
}
这里我就不放置最终运行的截图了(主要是跟整合jdbc一样的内容呵呵)。
3、使用通用的mapper
使用Mybatis的时候,最大的问题在于要写大量的重复语句在xml里。原本在没有mybatis来构建java web,就在daoImpl下写一堆string方法来写一个个的MySql语句。紧接着有了mybatis下,这个编写SQL语句的任务就放在了xml文件上。
这样的优势在于统一管理SQL语句,可以不考虑一些原本要考虑的问题,但是同样的也没有摆脱高耦合所带来的问题。
比如最经典的就是当数据库表结构发生改变的时候,对应的SQL所有语句…都要更改!!
这里我查找网站的内容以个人的想法总结以下面临这个问题的解决方法:
- 通用mybatis,即(tk mybatis)
- mybatis plus,这个更加强大
使用tk-mybatis的步骤如下内容说明。
4、整合tk-mybatis
首先添加依赖
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
其次一样的,创建实体类:
这里tk-mybatis使用的注解是jpa注解!
@Table(name = "tb_user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 用户名
private String userName;
....
一个个介绍一下吧:
- 首先默认表名就是等于类名,并且字段名就是属性名。
- 这里就是User是表名也是类名,id是表中的字段也同样的是属性名。
- 表明可以使用
@Table(name = "tableName")
来进行指定 - 使用
@Column(name="fieldName")
进行指定。比如说你映射了一个xml文件进行动态的sql语句操作,这个时候在里面使用name值就相当于你调用的属性。 - 使用 @Transient 注解表示跟字段不进行映射。这里的意思就是不跟着原本的字段进行映射。比如说展示一个快递信息表,你可以不用显示收件时间或者将收件时间作为一种查询的方式就可以使用@Transient。
其次就是配置接口:
@Mapper
public interface UserMapper extends tk.mybatis.mapper.common.Mapper<User>{
public List<User> findByUser(User user);
}
这里在启动类上开启包扫描(@MapperScan)也可以,实现继承Mapper。(切记:使用tk-mybatis,引用的类都是tk-mybatis,不然会报错!)
自定义映射文件,这里我随便写一个方法:
<?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.lxs.demo.dao.UserMapper">
<select id="findByUser" resultType="user">
SELECT
*
FROM
tb_user
<where>
<if test="name != null">
name like '%${name}%'
</if>
<if test="note != null">
and note like '%${note}%'
</if>
</where>
</select>
</mapper>
我们看上面的代码,这里首先先说明一下继承Mapper的所有方法:
Select方法
List select(T record):根据实体中的属性值进行查询,查询条件使用等号
T selectByPrimaryKey(Object key):根据主键字段进行查询,方法参数必须包含完整的主键属性, 查询条件使用等号
List selectAll():查询全部结果,select(null)方法能达到同样的效果
T selectOne(T record):根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
int selectCount(T record):根据实体中的属性查询总数,查询条件使用等号
Insert方法
int insert(T record):保存一个实体,null的属性也会保存,不会使用数据库默认值
int insertSelective(T record):保存一个实体,null的属性不会保存,会使用数据库默认值
Update方法
int updateByPrimaryKey(T record):根据主键更新实体全部字段,null值会被更新
int updateByPrimaryKeySelective(T record):根据主键更新属性不为null的值
Delete方法
int delete(T record):根据实体属性作为条件进行删除,查询条件使用等号
int deleteByPrimaryKey(Object key):根据主键字段进行删除,方法参数必须包含完整的主键属性
最后实现测试。
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {
@Autowired
private UserDao userDao;
@Test
public void testFindByUser() {
/**
*查询所有的User
*/
User condition = new User();
condition.setName("a");
List<User> list = userMapper.findByUser(condition);
for (User user : list) {
System.out.println(user);
}
}
}
这里面是测试查询所有的User类。
总结
以上是我的自己的总结笔记,谢谢大家的阅读并且希望大家批评指正。