前言:群里面经常有人问有木有mybatis的案例,正好有空整合一下。我之前没有用过mybatis,但是跑过简单的增删改查,发现真的很轻量,写sql还比较不错,多表查询也比较方便,但是insert 和update有点麻烦(字段一多写sql会死人)。用了之后我还是希望用jpa,毕竟增删改查都不用自己写,关键可以直接传对象。
springboot和mybatis整合的框架mybatis-spring-boot :http://www.oschina.net/p/mybatis-spring-boot
有两种实现的方式 xml和注解,用了之后发现xml配置还是挺麻烦的。
update 2016/11/12 差不多用了半年的mybatis发现优点挺多的,在性能和写sql上比较灵活,也不用在实体上手动指定表里字段的映射,结合mybatis自动生成工具发现效率也挺快的,在mybatis配置上我也换了N种配置方式。
<!--导入mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
导入数据库驱动
spring.datasource.url =jdbc:mysql://
spring.datasource.username =root
spring.datasource.password =root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-active=1000
spring.datasource.test-on-borrow=true
spring.datasource.test-on-return=true
#重连
spring.datasource.time-between-eviction-runs-millis=1800000
spring.datasource.num-tests-per-eviction-run=3
#最小生命时间
spring.datasource.min-evictable-idle-time-millis=1800000
spring.datasource.validation-query=SELECT 1
package com.wangnian.mybatis.entity;
import java.io.Serializable;
/**
* Created by 王念 on 2016/4/28.
*/
public class User implements Serializable {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.wangnian.mybatis.annotation;
import com.wangnian.mybatis.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
/**
* Created by 王念 on 2016/4/28.
*/
@Mapper
public interface UserDao1 {
@Select("select * from user where id=#{id}")
public User selectid(@Param("id") Integer id);
@Insert("insert into user values(null,#{name})")
public boolean insertUser(@Param("name") String name);
@Select("select * from user u join user u1 where u.id=#{id}")
public List<Map> select(@Param("id") Integer id);
//XML自动注入
User selectUserById(@Param("id") Integer id);
}
<?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.wangnian.mybatis.xml.UserDao1">
<select id="selectUserById" resultType="User">
select * from user where id = #{id}
</select>
</mapper>
①种方式
1.添加一个mybatisConfig.xml
2.指定每一个的mappers位置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="com.wangnian.mybatis.entity"/>
</typeAliases>
<mappers>
<mapper resource="mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
3.在application.properties里指定mybatisConfig.xml的位置
mybatis.config-location=classPath:mybatisConfig.xml
②种方式
通过javaBean的方式配置
package com.fengchao.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
/**
* MyBatis基础配置
*
* @author wangnian
*/
@Configuration
@MapperScan("com.fengchao.dao")
//s@EnableTransactionManagement
public class MyBatisConfig {
@Autowired
private DataSource dataSource;
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactoryBean() {
SqlSessionFactoryBean sqlsession = new SqlSessionFactoryBean();
sqlsession.setDataSource(dataSource);
sqlsession.setTypeAliasesPackage("com.fengchao.model");//扫描entity包 使用别名
org.apache.ibatis.session.Configuration configuration=new org.apache.ibatis.session.Configuration();
configuration.setUseGeneratedKeys(true);//使用jdbc的getGeneratedKeys获取数据库自增主键值
configuration.setUseColumnLabel(true);//使用列别名替换列名 select user as User
configuration.setMapUnderscoreToCamelCase(true);//-自动使用驼峰命名属性映射字段 userId user_id
sqlsession.setConfiguration(configuration);
sqlsession.setFailFast(true);
//添加XML目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
sqlsession.setMapperLocations(resolver.getResources("classpath:mybatis-mapper/*.xml"));
return sqlsession.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
③种方式
直接通过application.properties中配置
#mybatis配置
#指定mapper.xml的位置
mybatis.mapper-locations=classpath:mapper/*.xml
#
mybatis.configuration.mapUnderscoreToCamelCase=true
#
mybatis.configuration.useColumnLabel=true
package com.wangnian.mybatis;
import com.wangnian.mybatis.annotation.UserDao1;
import com.wangnian.mybatis.entity.User;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.List;
import java.util.Map;
import static javafx.beans.binding.Bindings.select;
@SpringBootApplication
public class SpringbootmybatisApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(SpringbootmybatisApplication.class, args);
}
@Autowired
private UserDao1 userDao1;
@Override
public void run(String... strings) throws Exception {
//查询
User user = userDao1.selectid(1);
System.out.println(user.getName());
//插入
boolean b= userDao1.insertUser("wangnain");
System.out.println(b);
//多表查询
List<Map> list= userDao1.select(1);
System.out.println(list.get(1));
//测试xml注入的方式
User user1 = userDao1.selectUserById(1);
System.out.println(user1.getUserName());
}
}