[6]Springboot使用Mybatis访问数据库

使用java访问数据库有很多方式,其中比较流行的是mybatis与hibernate,我们项目决定使用mybatis

首先导入依赖

使用maven导入依赖,在pom文件中添加如下,由于要整合 springboot 和 mybatis 所以加入了artifactId 为 mybatis-spring-boot-starter 的依赖,由于使用了Mysql 数据库 所以加入了artifactId 为 mysql-connector-java 的依赖。

        <dependency>
            <groupId>org.mybatis.spring.bootgroupId>
            <artifactId>mybatis-spring-boot-starterartifactId>
            <version>2.1.2version>
        dependency>
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
        dependency>

修改配置文件

修改 application.yml 文件,增加数据库的连接信息

spring:
  datasource:
    url: jdbc:mysql://o.mysql.rds.aliyuncs.com:3306/blogstorm?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=CST
    username: blogstorm
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver

注意:我们使用的 mysql-connector-java 8+ ,JDBC 连接到mysql-connector-java 6+以上的需要指定时区 serverTimezone=GMT%2B8。

另外我们之前使用配置 Mysql数据连接是一般是这样指定driver-class-name=com.mysql.jdbc.Driver,但是现在不可以必须为 否则控制台下面的异常:

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

上面异常的意思是:com.mysql.jdbc.Driver 被弃用了。新的驱动类是 com.mysql.cj.jdbc.Driver。驱动程序通过SPI自动注册,手动加载类通常是不必要。

如果你非要写把com.mysql.jdbc.Driver 改为com.mysql.cj.jdbc.Driver 即可。

使用方法

mybatis有两种使用方法,一种是常见的 xml映射方法,这种方法需要为每一个请求准备xml配置文件,非常繁杂。

这里我选择的是第二种方法,在java代码中使用注解方式进行映射,这样不需要编写xml文件

以用户接口为例

创建Bean

首先得有与数据表所对应的实体类,这个类一定需要是个Java Bean,里面的field需要时private的,并且都有getter和setter方法,需要有空构造方法

@Builder
@Data
public class User {
    @JsonIgnore
    private int id;
    private String name;
    private String email;

    @JsonIgnore
    private String password;

    private int roleid;

    @Tolerate
    User() {
    }
}

使用 @Data 会自动创建getter、setter等,使用 @Builder 注解方便我后面构造

同时使用 @Builder 导致空构造方法没了,这里需要手动增加一个空构造方法,并且使用 @Tolerate 注解

创建Dao层

创建 UserDao接口,需要注意使用 @Mapper 注解标记是映射接口,然后准备相应的方法,并使用 @Select 或者 @Insert等其他注解来书写sql,在编译成字节码的时候程序会自动根据接口和注解生成相应的方法

@Mapper
public interface UserDao {
    /**
     * 通过名字查询用户信息
     */
    @Select("SELECT * FROM user WHERE name = #{name}")
    User findUserByName(@Param("name") String name);

    /**
     * 查询所有用户信息
     */
    @Select("SELECT * FROM user")
    List<User> findAllUser();

    /**
     * 插入用户信息
     */
    @Insert("INSERT INTO user(name, email, password) VALUES(#{name}, #{email}, #{password})")
    void insertUser(@Param("name") String name, @Param("email") String email, @Param("password") String password);

    /**
     * 根据 id 更新用户信息
     */
    @Update("UPDATE  user SET name = #{name},age = #{age},money= #{money} WHERE id = #{id}")
    void updateUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money,
                    @Param("id") int id);

    /**
     * 根据 id 删除用户信息
     */
    @Delete("DELETE from user WHERE id = #{id}")
    void deleteUser(@Param("id") int id);


    /**
     * 查询用户的总数量,为分页查询用户作准备
     * @return
     */
    @Select("SELECT count(*) FROM user")
    int findUserCount();


    /**
     * 查询所有用户的id  分步查找,每次查找limit 防止数据库大量读取而死掉
     * @return
     */
    @Select("SELECT id FROM user LIMIT #{limit} OFFSET #{offset}")
    List<Integer> findAllUserId(@Param("limit") int limit,@Param("offset") int offset);
}

创建Service层

创建 UserService类,在里面写与用户相关操作的业务代码,需要用到数据库操作的时候就调用 Dao层方法,需要注意的是使用 @Resource 注解表示Dao是资源,这样才能自动注入方法

@Service
public class UserService {
    @Resource
    private UserDao userDao;

    /**
     * 根据名字查找用户
     */
    public User selectUserByName(String name) {
        return userDao.findUserByName(name);
    }

    /**
     * 查找所有用户
     */
    public List<User> selectAllUser() {
        return userDao.findAllUser();
    }

    /**
     * 插入一个用户
     */
    public void insertUser(User user) {
        userDao.insertUser(user.getName(), user.getEmail(), user.getPassword());
    }

    /**
     * 根据id 删除用户
     */
    public void deleteService(int id) {
        userDao.deleteUser(id);
    }

    /**
     * 模拟事务。由于加上了 @Transactional注解,如果转账中途出了意外 SnailClimb 和 Daisy 的钱都不会改变。
     */
    @Transactional
    public void changeMoney() {
        userDao.updateUser("SnailClimb", 22, 2000.0, 3);
        // 模拟转账过程中可能遇到的意外状况
        int temp = 1 / 0;
        userDao.updateUser("Daisy", 19, 4000.0, 4);
    }
}

通过这样的方法就可以使用 Springboot 加 Mybatis 来访问数据库了,使用注解的方式来解耦合无需书写繁复的xml配置文件

你可能感兴趣的:(创新实践)