在公司項目開發中,使用Mybatis居多。在 SpringBoot:3.SpringBoot使用Spring-data-jpa實現數據庫訪問 中,這種jpa風格的把sql語句和java代碼放到一塊兒,總感受分離的不夠完全。基於我的習慣,仍是比較喜歡把代碼和sql分開,sql語句在xml文件裏無論多複雜,寫到xml裏看起來比較簡單,不是那麼臃腫。php
主要就四個依賴:java
spring-boot-starter-test、spring-boot-starter:用於作單元測試mysql
mybatis-spring-boot-starter:Mybatis核心依賴git
mysql-connector-java:Mysql依賴,訪問數據庫github
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- 引入MySQL鏈接的依賴包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
複製代碼
在application.properties 配置相關mysql信息spring
#數據庫配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#mybatis放置xml文件的地方,咱們配置在classpath下的mapper文件夾下
mybatis.mapper-locations=classpath*:mapper/*.xml
複製代碼
經過下面的sql語句建立user表信息:包括id、name(名字)、age(年齡)。sql
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
複製代碼
建立user表的映射實體類。數據庫
package com.w3cjava.entity;
public class User {
private Long id;
private String name;
private Integer age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
複製代碼
建立User實體類的UserDao層,實現簡單的增刪改查操做。apache
package com.w3cjava.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.w3cjava.entity.User;
@Mapper
public interface UserDao{
int insert(@Param("name") String name, @Param("age") Integer age);
/** * * @author cos * @desc 經過Map<String, Object>對象來做爲傳遞參數的容器 * @param map * @return */
int insertByMap(Map<String, Object> map);
/** * * @author cos * @desc 使用對象 * @param user * @return */
int insert(User user);
void update(User user);
void delete(Long id);
/** * * @author cos * @desc 返回結果的綁定 * @return */
List<User> findAll();
/** * * @author cos * @desc 使用@Param傳參,@Param中定義的name對應了SQL中的#{name},age對應了SQL中的#{age} * @param name * @return */
User findByName(@Param("name") String name);
}
複製代碼
經過mybatis.mapper-locations=classpath*:mapper/*.xml配置,咱們將在classpath路徑的mapper文件夾下建立UserDao對應的映射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.w3cjava.dao.UserDao">
<sql id="testColumns">
a.id AS "id",
a.name AS "name",
a.age AS "age"
</sql>
<sql id="testJoins">
</sql>
<!-- 查詢全部user -->
<select id="findByName" resultType="com.w3cjava.entity.User">
select
<include refid="testColumns"/>
from user a
WHERE a.name = #{name}
</select>
<!-- 查詢全部user -->
<select id="findAll" resultType="com.w3cjava.entity.User">
select
<include refid="testColumns"/>
from user a
</select>
<insert id="insert">
INSERT INTO user(
name,
age
) VALUES (
#{name},
#{age}
)
</insert>
<insert id="insertByMap">
INSERT INTO user(
name,
age
) VALUES (
#{name,jdbcType=VARCHAR},
#{age,jdbcType=INTEGER}
)
</insert>
<update id="update">
UPDATE user SET age=#{age} WHERE name=#{name}
</update>
<delete id="delete">
DELETE FROM user WHERE id =#{id}
</delete>
</mapper>
複製代碼
建立應用主類。@EnableTransactionManagement之因此加上這個註解,是爲了後面每個單元測試時使用回顧註解,保證數據庫數據測試完成後不被污染。以便開始下一個測試。
package com.w3cjava;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/** * * @class SpringBootMybatisApplication * @version SpringBoot 2.1.9 * @author cos * @desc 整合Mybatis * */
@SpringBootApplication
@EnableTransactionManagement
public class SpringBootMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatisApplication.class, args);
}
}
複製代碼
測試基本邏輯:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringBootMybatisApplication.class})
public class UserServiceTest {
@Autowired
private UserDao userDao;
@Test
@Transactional
@Rollback
public void insert() throws Exception {
userDao.insert("AAA", 20);
}
@Test
@Transactional
@Rollback
public void findByName() throws Exception {
userDao.insert("AAA", 20);
User u = userDao.findByName("AAA");
Assert.assertEquals(20, u.getAge().intValue());
}
@Test
@Transactional
@Rollback
public void testMap() throws Exception{
Map<String, Object> map = new HashMap<>();
map.put("name", "CCC");
map.put("age", 40);
userDao.insertByMap(map);
}
@Test
@Transactional
@Rollback
public void testuserDao() throws Exception {
// insert一條數據,並select出來驗證
userDao.insert("AAA", 20);
User u = userDao.findByName("AAA");
Assert.assertEquals(20, u.getAge().intValue());
// update一條數據,並select出來驗證
u.setAge(30);
userDao.update(u);
u = userDao.findByName("AAA");
Assert.assertEquals(30, u.getAge().intValue());
// 刪除這條數據,並select驗證
userDao.delete(u.getId());
u = userDao.findByName("AAA");
Assert.assertEquals(null, u);
}
@Test
@Transactional
@Rollback
public void testSelectMapper() throws Exception {
List<User> userList = userDao.findAll();
for(User user : userList) {
Assert.assertEquals(null, user.getId());
Assert.assertNotEquals(null, user.getName());
}
}
}
複製代碼
spring-test @Rollback回滾: www.jianshu.com/p/3b245b002…
04.Spring-Boot-Mybatis 歡迎掃面下列二維碼關注「餘弦的自留地」公衆微信號