java超快速入門(六):mybatis操作數(shù)據(jù)庫

在項(xiàng)目中引入mybatis依賴

在pom.xml中添加依賴

<!--mybatis數(shù)據(jù)庫框架,底層封裝了jdbc-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
</dependency>
<!--mysql驅(qū)動-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
</dependency>

mybatis配置文件

在resource文件夾中創(chuàng)建一個xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--使用mybatis配置標(biāo)準(zhǔn)格式-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--配置環(huán)境(可配置多個):默認(rèn):development環(huán)境-->
    <environments default="development">
        <!--配置開發(fā)環(huán)境的參數(shù)-->
        <environment id="development">
            <!--配置事務(wù)處理方式-->
            <transactionManager type="JDBC"/>
            <!--數(shù)據(jù)源-->
            <dataSource type="POOLED">
                <!--驅(qū)動-->
                <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

首先我們先創(chuàng)建一個數(shù)據(jù)表

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;

接下來實(shí)現(xiàn)一個表的映射實(shí)體類

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;
    }
}

然后創(chuàng)建一個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,返回參數(shù)為List<com.sinbxeunha.josechan.entity.User>對象-->
    <select id="selectUsers" resultType="com.sinbxeunha.josechan.entity.User">
    select * from user;
    </select>
    <!--定義一個insert語句挑辆,入?yún)閁ser對象是复,使用#{attribute_name}獲取對象中的屬性值-->
    <insert id="save" parameterType="com.sinbxeunha.josechan.entity.User">
        insert into user(username,password) value(#{username}, #{password});
    </insert>
</mapper>

創(chuàng)建好mapper.xml文件后扭弧,需要把它配置到mybatis的配置文件中

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

由于com/sinbxeunha/josechan/mapper目錄不是maven項(xiàng)目的靜態(tài)資源文件,mybatis沒法直接讀取到mapper文件捐凭,需要在pom.xml加入以下配置

<build>
    <resources>
        <!--指明該資源為靜態(tài)資源拨扶,這里配置指`src/main/java`目錄下的所有目錄的所有xml都標(biāo)記為靜態(tài)資源-->
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build

使用mapper查詢數(shù)據(jù)庫分為四個步驟

//讀取上面創(chuàng)建的mybatis配置文件
InputStream inputStream = JoseChan.class.getClassLoader().getResourceAsStream("Mybatis.xml");
//創(chuàng)建builder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//創(chuàng)建工廠
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//創(chuàng)建SqlSession對象
SqlSession sqlSession = sqlSessionFactory.openSession();

有了SqlSession就可以執(zhí)行mapper中定義的sql了

//User對象
User user = new User("用戶名", "密碼");
/**
  * 執(zhí)行定義的insert語句,
  * 第一個參數(shù)為執(zhí)行的方法茁肠,這里為即UserMapper.xml文件中定義的namespace下的save方法
  * 第二個參數(shù)是xml文件中parameterType指定的類型患民,這里為User對象
  */
sqlSession.insert("com.sinbxeunha.josechan.mappers.UserMapper.save", user);
/**
  * 提交事務(wù),默認(rèn)開啟事務(wù)垦梆,所有增刪改操作都必須提交/回滾
  * 如果希望自動提交匹颤,在獲取SqlSession對象時openSession方法中傳true
  * SqlSession sqlSession = sqlSessionFactory.openSession();
  */
sqlSession.commit()

將mybatis整合進(jìn)spring

引入spring-mybatis依賴

<!-- mybatis-spring整合組件 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>
        <!--springboot jdbc數(shù)據(jù)庫可配置化,用來簡化數(shù)據(jù)源的配置托猩,和mybatis沒關(guān)印蓖,順便做了-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>

配置數(shù)據(jù)源

//鏈接
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/db
//用戶名
spring.datasource.username=username
//密碼
spring.datasource.password=password
//數(shù)據(jù)庫驅(qū)動
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
//使用鏈接池,一共有pooled|unpooled|jndi三種模式
spring.datasource.type=org.apache.ibatis.datasource.pooled.PooledDataSource

創(chuàng)建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 {
    //在容器中創(chuàng)建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();
    }
}

創(chuàng)建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);
}

設(shè)置mapper自動掃描赦肃,被掃描的接口將會在運(yùn)行時動態(tài)創(chuàng)建接口的實(shí)現(xiàn)對象

//掃描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了,默認(rèn)情況下公浪,事務(wù)是未開啟的他宛,sql會自動提交,如果需要使用事務(wù)欠气,使用@Transactional注解

    //當(dāng)該方法拋出異常時厅各,執(zhí)行回滾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來創(chuàng)建User對象晃琳,在spring中讯检,我們應(yīng)該把對象的創(chuàng)建交給容器琐鲁,因此接下來我們修改一下代碼卫旱,使用容器來創(chuàng)建User對象

在需要創(chuàng)建對象的類中注入容器

想要通過容器創(chuàng)建對象,首先我們要先獲得容器围段,我們繼承ApplicationContextAware顾翼,并且實(shí)現(xiàn)setApplicationContext方法,容器會在創(chuàng)建該類時奈泪,將容器傳遞給該類

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

    public ApplicationContext applicationContext;

    @RequestMapping({"/createUser"})
    @ResponseBody
    //當(dāng)該方法拋出異常時适贸,執(zhí)行回滾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映射實(shí)體創(chuàng)建到容器中

這里使用原型模式創(chuàng)建對象灸芳,注意,代理模式需要不使用代理拜姿,否則getter方法無法獲取到set進(jìn)去的屬性值

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方法

    //當(dāng)該方法拋出異常時烙样,執(zhí)行回滾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";
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蕊肥,隨后出現(xiàn)的幾起案子谒获,更是在濱河造成了極大的恐慌,老刑警劉巖壁却,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件批狱,死亡現(xiàn)場離奇詭異,居然都是意外死亡展东,警方通過查閱死者的電腦和手機(jī)赔硫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盐肃,“玉大人爪膊,你說我怎么就攤上這事≡彝酰” “怎么了惊完?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長处硬。 經(jīng)常有香客問我小槐,道長,這世上最難降的妖魔是什么荷辕? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任凿跳,我火速辦了婚禮,結(jié)果婚禮上疮方,老公的妹妹穿的比我還像新娘控嗜。我一直安慰自己,他們只是感情好骡显,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布疆栏。 她就那樣靜靜地躺著,像睡著了一般惫谤。 火紅的嫁衣襯著肌膚如雪壁顶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天溜歪,我揣著相機(jī)與錄音若专,去河邊找鬼。 笑死蝴猪,一個胖子當(dāng)著我的面吹牛调衰,可吹牛的內(nèi)容都是我干的膊爪。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼嚎莉,長吁一口氣:“原來是場噩夢啊……” “哼米酬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趋箩,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤淮逻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阁簸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爬早,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年启妹,在試婚紗的時候發(fā)現(xiàn)自己被綠了筛严。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡饶米,死狀恐怖桨啃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情檬输,我是刑警寧澤照瘾,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站丧慈,受9級特大地震影響析命,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逃默,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一鹃愤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧完域,春花似錦软吐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肠仪,卻和暖如春肖抱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藤韵。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工虐沥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熊经,地道東北人泽艘。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓欲险,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匹涮。 傳聞我的和親對象是個殘疾皇子天试,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容