在項(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";
}