與mybatis的初次會面
接觸springboot也不過月餘,由於工作需要,jdbctemplate冗雜的sql拼接已經不再符合接下來的深入學習。我迫切地意識到,倘若不用
spring-data-jpa操縱數據庫,那就用mybatis吧。作爲當前最流行的持久層框架之一,不學習它的方法,相當於與時代脫軌了。
首先,得知道集成mybatis的方法有哪些。其實大致也就兩種:1、基於註解;2、基於xml配置文件。
不管使用哪種方法,引入mybatis的pom依賴都是必不可少的步驟。
a.在pom文件中添加mybatis-spring-boot-starter依賴以及mysql數據庫驅動依賴:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
b. 然後,在數據庫中新建一張user表:
c.在application.properties中添加mysql數據源:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
使用基於註解的方式
1.表建好後,在domain文件夾下新建一個User實體類,實體類的屬性與數據庫屬性名稱與數據類型一一對應。
public class User {
private Long id;
private String name;
private Integer age;
//省略get和set方法
}
2.在mapper文件夾下創建UserMapper接口:
import com.liqiaoqi.domain.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
@Mapper
//該註解是解決IDEA mapper注入時顯示could not autowire的問題
@Component(value = "userMapper")
public interface UserMapper {
@Select("SELECT * FROM user WHERE name = #{name}")
User findByName(@Param("name") String name);
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Integer age);
}
注意:@Mapper註解必須加上。如果Mapper接口很多,可以直接在Application類前添加@MapperScan("mapper所在包名")註解。
@Component註解也可以不加,前提是在用@Autowired註解注入mapper時不提示“could not autowired”錯誤。
3.在service文件夾下添加UserService類:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public String findByName(){
userMapper.insert("pinky",20);
User u = userMapper.findByName("pinky");
return u.getName();
}
}
4.然後在controller文件夾下添加UserController類:
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/test")
public String findByName(){
return userService.findByName();
}
}
然後運行項目訪問路徑查看即可。
使用xml配置文件的方式
與基於註解方法不同,使用xml配置文件方法時,sql語句不在mapper接口中定義,而是剝離出來,在xml文件中單獨定義。
這樣做的好處是能夠使得sql語句更爲靈活也更利於維護。
但兩種集成方法大致是一樣的,主要有以下區別:
1.UserMapper中不寫@Select註解。
import com.liqiaoqi.domain.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
@Mapper
//該註解是解決IDEA mapper注入時顯示could not autowire的問題
@Component(value = "userMapper")
public interface UserMapper {
User findByName(@Param("name") String name);
int insert(@Param("name") String name, @Param("age") Integer age);
}
2.在application.properties文件中添加mybatis的配置信息:
mybatis.config-locations=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.typeAliasesPackage=com.liqiaoqi.domain
3.添加UserMapper.xml。實現UserMapper映射的方法(即sql語句)將全部定義在該文件中。
<?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.liqiaoqi.mapper.UserMapper" >
<resultMap id="UserResultMap" type="com.liqiaoqi.domain.User">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
</resultMap>
<insert id="insert">
INSERT INTO
user
(name,age)
VALUES
(#{name},#{age})
</insert>
<select id="findByName" resultType="com.liqiaoqi.domain.User" >
SELECT *
FROM user
WHERE name = #{name}
</select>
</mapper>
除以上三點與基於註解方法稍有不同外,其餘部分全部不作改變。兩種方法結果相同。
以下是項目的完整結構:
以上源碼:示例代碼
參考資料