註解版
相關配置
mybatis.type-aliases-package=com.neo.model
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnico
de=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
傳參⽅式
直接使⽤
@Delete("DELETE FROM users WHERE id =#{id}")
void delete(Long id);
使⽤ @Param
@Select("SELECT * FROM users WHERE user_sex = #{user_sex}")
List<User> getListByUserSex(@Param("user_sex") String userSex);
使⽤ Map
@Select("SELECT * FROM users WHERE username=#{username} AND user_sex = #{user_sex}
")
List<User> getListByNameAndSex(Map<String, Object> map);
使⽤時將參數依次加⼊到 Map 中即可:
Map param= new HashMap();
param.put("username","aa");
param.put("user_sex","MAN");
List<User> users = userMapper.getListByNameAndSex(param);
使⽤對象
@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passW
ord}, #{userSex})")
void insert(User user);
註解介紹
@Select 註解
@Select("SELECT * FROM users WHERE user_sex = #{user_sex}")
List<User> getListByUserSex(@Param("user_sex") String userSex);
@Insert 註解
@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passW
ord}, #{userSex})")
void insert(User user);
@Update 註解
@Update("UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{i
d}")
void update(UserEntity user);
@Delete 註解
@Delete("DELETE FROM users WHERE id =#{id}")
void delete(Long id);
@Results 和 @Result 註解
@Select("SELECT * FROM users")
@Results({
@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.cla
ss),
@Result(property = "nickName", column = "nick_name")
})
List<UserEntity> getAll();
注意,使⽤ # 符號和 $ 符號的不同:
// This example creates a prepared statement, something like select * from teacher
where name = ?;
@Select("Select * from teacher where name = #{name}")
Teacher selectTeachForGivenName(@Param("name") String name);
// This example creates n inlined statement, something like select * from teacher
where name = 'someName';
@Select("Select * from teacher where name = '${name}'")
Teacher selectTeachForGivenName(@Param("name") String name);
動態 SQL
使⽤註解來實現
@Update("<script>
update users
<set>
<if test="userName != null">userName=#{userName},</if>
<if test="nickName != null">nick_name=#{nickName},</if>
</set>
where id=#{id}
</script>")
void update(User user);
使⽤ SQL 構建類來⽀持
public class UserSql {
public String getList(UserParam userParam) {
StringBuffer sql = new StringBuffer("select id, userName, passWord, user_s
ex as userSex, nick_name as nickName");
sql.append(" from users where 1=1 ");
if (userParam != null) {
if (StringUtils.isNotBlank(userParam.getUserName())) {
sql.append(" and userName = #{userName}");
}
if (StringUtils.isNotBlank(userParam.getUserSex())) {
sql.append(" and user_sex = #{userSex}");
}
}
sql.append(" order by id desc");
sql.append(" limit " + userParam.getBeginLine() + "," + userParam.getPageS
ize());
log.info("getList sql is :" +sql.toString());
return sql.toString();
}
}
@SelectProvider(type = UserSql.class, method = "getList")
List<UserEntity> getList(UserParam userParam);
- type:動態⽣成 SQL 的類
- method:類中具體的⽅法名
結構化 SQL
public String getCount(UserParam userParam) {
String sql= new SQL(){{
SELECT("count(1)");
FROM("users");
if (StringUtils.isNotBlank(userParam.getUserName())) {
WHERE("userName = #{userName}");
}
if (StringUtils.isNotBlank(userParam.getUserSex())) {
WHERE("user_sex = #{userSex}");
}
//從這個 toString 可以看出,其內部使⽤⾼效的 StringBuilder 實現 SQL 拼接
}}.toString();
log.info("getCount sql is :" +sql);
return sql;
}
多數據源使⽤
⾸先配置多數據源:
mybatis.type-aliases-package=com.neo.model
spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=
UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.test1.username=root
spring.datasource.test1.password=root
spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=
UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.test2.username=root
spring.datasource.test2.password=root
spring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver
分別構建兩個不同的數據源。
DataSource1 配置:
@Configuration
@MapperScan(basePackages = "com.neo.mapper.test1", sqlSessionTemplateRef = "test1
SqlSessionTemplate")
public class DataSource1Config {
@Bean(name = "test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")
@Primary
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test1SqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") D
ataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean(name = "test1TransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("test1Da
taSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "test1SqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFa
ctory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
測試
分別注⼊兩個不同的 Mapper,想操作哪個數據源就使⽤哪個數據源的 Mapper 進⾏操作處理。
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private User1Mapper user1Mapper;
@Autowired
private User2Mapper user2Mapper;
@Test
public void testInsert() throws Exception {
user1Mapper.insert(new User("aa111", "a123456", UserSexEnum.MAN));
user1Mapper.insert(new User("bb111", "b123456", UserSexEnum.WOMAN));
user2Mapper.insert(new User("cc222", "b123456", UserSexEnum.MAN));
}
}