美文网首页
java超快速入门(六):mybatis操作数据库

java超快速入门(六):mybatis操作数据库

作者: 自我De救赎 | 来源:发表于2021-03-16 18:42 被阅读0次

在项目中引入mybatis依赖

在pom.xml中添加依赖

<!--mybatis数据库框架,底层封装了jdbc-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
</dependency>
<!--mysql驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
</dependency>

mybatis配置文件

在resource文件夹中创建一个xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--使用mybatis配置标准格式-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--配置环境(可配置多个):默认:development环境-->
    <environments default="development">
        <!--配置开发环境的参数-->
        <environment id="development">
            <!--配置事务处理方式-->
            <transactionManager type="JDBC"/>
            <!--数据源-->
            <dataSource type="POOLED">
                <!--驱动-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--链接-->
                <property name="url" value="jdbc:mysql://127.0.0.1:3306"/>
                <!--用户-->
                <property name="username" value="username"/>
                <!--密码-->
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

使用mapper

首先我们先创建一个数据表

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(45) NOT NULL,
  `password` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

接下来实现一个表的映射实体类

package com.sinbxeunha.josechan.entity;

public class User {
    public int id;
    public String username;
    public String password;

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

然后创建一个mappers包,用于存放mapper的xml文件
UserMapper.xml:

<?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.sinbxeunha.josechan.mappers.UserMapper">
    <!--定义一个select语句,方法名为selectUsers,返回参数为List<com.sinbxeunha.josechan.entity.User>对象-->
    <select id="selectUsers" resultType="com.sinbxeunha.josechan.entity.User">
    select * from user;
    </select>
    <!--定义一个insert语句,入参为User对象,使用#{attribute_name}获取对象中的属性值-->
    <insert id="save" parameterType="com.sinbxeunha.josechan.entity.User">
        insert into user(username,password) value(#{username}, #{password});
    </insert>
</mapper>

创建好mapper.xml文件后,需要把它配置到mybatis的配置文件中

<mappers>
    <mapper resource="com/sinbxeunha/josechan/mappers/UserMapper.xml"></mapper>
</mappers>

由于com/sinbxeunha/josechan/mapper目录不是maven项目的静态资源文件,mybatis没法直接读取到mapper文件,需要在pom.xml加入以下配置

<build>
    <resources>
        <!--指明该资源为静态资源,这里配置指`src/main/java`目录下的所有目录的所有xml都标记为静态资源-->
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build

使用mapper查询数据库分为四个步骤

//读取上面创建的mybatis配置文件
InputStream inputStream = JoseChan.class.getClassLoader().getResourceAsStream("Mybatis.xml");
//创建builder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//创建工厂
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();

有了SqlSession就可以执行mapper中定义的sql了

//User对象
User user = new User("用户名", "密码");
/**
  * 执行定义的insert语句,
  * 第一个参数为执行的方法,这里为即UserMapper.xml文件中定义的namespace下的save方法
  * 第二个参数是xml文件中parameterType指定的类型,这里为User对象
  */
sqlSession.insert("com.sinbxeunha.josechan.mappers.UserMapper.save", user);
/**
  * 提交事务,默认开启事务,所有增删改操作都必须提交/回滚
  * 如果希望自动提交,在获取SqlSession对象时openSession方法中传true
  * SqlSession sqlSession = sqlSessionFactory.openSession();
  */
sqlSession.commit()

将mybatis整合进spring

引入spring-mybatis依赖

<!-- mybatis-spring整合组件 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>
        <!--springboot jdbc数据库可配置化,用来简化数据源的配置,和mybatis没关,顺便做了-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>

配置数据源

//链接
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/db
//用户名
spring.datasource.username=username
//密码
spring.datasource.password=password
//数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
//使用链接池,一共有pooled|unpooled|jndi三种模式
spring.datasource.type=org.apache.ibatis.datasource.pooled.PooledDataSource

创建mybatis配置类

package com.sinbxeunha.josechan.configuration;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.transaction.TransactionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.transaction.SpringManagedTransactionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * 用于替换Mybatis.xml
 */
//声明该文件为配置文件
@Configuration
public class MybatisConfig {
    //在容器中创建SqlSessionFactory
    @Bean
    public SqlSessionFactory sqlSessionFactory(@Autowired DataSource dataSource) throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        TransactionFactory transactionFactory = new SpringManagedTransactionFactory();
        sqlSessionFactoryBean.setTransactionFactory(transactionFactory);
        return sqlSessionFactoryBean.getObject();
    }
}

创建Repository类,用于代替mapper.xml

package com.sinbxeunha.josechan.repository;

import com.sinbxeunha.josechan.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 替换UserMapper.xml
 */
//让spring自动扫描识别到该接口
@Repository
public interface UserRepository {
    //声明一个select语句
    @Select("select * from user;")
    public List<User> selectUsers();
    //声明一个insert语句
    @Insert("insert into user(username,password) value(#{username}, #{password});")
    public int save(User user);
}

设置mapper自动扫描,被扫描的接口将会在运行时动态创建接口的实现对象

//扫描repository包下的文件
@MapperScan({"com.sinbxeunha.josechan.repository"})
public class Application implements ApplicationRunner {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, new String[0]);
    }
}

接下来就可以使用mapper了,默认情况下,事务是未开启的,sql会自动提交,如果需要使用事务,使用@Transactional注解

    //当该方法抛出异常时,执行回滚sql
    @Transactional(rollbackFor={Exception.class})
    public String createUser(String username, String password) throws Throwable {
        User user = new User(username, password);
        userRepository.save(user);
        return "success";
    }

2021-03-17日更新

上面新增用户时,使用了new来创建User对象,在spring中,我们应该把对象的创建交给容器,因此接下来我们修改一下代码,使用容器来创建User对象

在需要创建对象的类中注入容器

想要通过容器创建对象,首先我们要先获得容器,我们继承ApplicationContextAware,并且实现setApplicationContext方法,容器会在创建该类时,将容器传递给该类

@Controller
@RequestMapping({"/index"})
public class IndexController implements ApplicationContextAware {
    @Autowired
    public UserRepository userRepository;

    public ApplicationContext applicationContext;

    @RequestMapping({"/createUser"})
    @ResponseBody
    //当该方法抛出异常时,执行回滚sql
    @Transactional(rollbackFor={Throwable.class})
    public String createUser(String username, String password) throws Throwable {
        User user = new User(username, password);
        userRepository.save(user);
        return "success";
    }

    /**
     * 注入容器
     * @param applicationContext
     * @throws BeansException
     */
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

将User映射实体创建到容器中

这里使用原型模式创建对象,注意,代理模式需要不使用代理,否则getter方法无法获取到set进去的属性值

package com.sinbxeunha.josechan.entity;

@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.NO)
public class User {
    public int id;
    public String username;
    public String password;

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public User() {
    }

    //getter/setter...   
}

从容器中获取User对象

接下来改造一下createUser方法

    //当该方法抛出异常时,执行回滚sql
    @Transactional(rollbackFor={Exception.class})
    public String createUser(String username, String password) throws Throwable {
        //User user = new User(username, password);
        //使用容器获得User对象
        User user = this.applicationContext.getBean(User.class);
        user.setUsername(username);
        user.setPassword(password);
        userRepository.save(user);
        return "success";
    }

相关文章

网友评论

      本文标题:java超快速入门(六):mybatis操作数据库

      本文链接:https://www.haomeiwen.com/subject/fcbqcltx.html