关于配置数据库可以参考上一篇文章,这里只讲mybatis
pom.xml
- <!-- 引入mybatis -->
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>1.3.0</version>
- </dependency>
- <!-- mybatis分页插件 -->
- <dependency>
- <groupId>com.github.pagehelper</groupId>
- <artifactId>pagehelper-spring-boot-starter</artifactId>
- <version>1.1.1</version>
- </dependency>
基本SQL操作
spring boot已经自动实现了mybatis所有配置,直接写dao接口即可
- @Mapper
- public interface MybatisDao {
- @Select("select * from user where id = #{id}")
- public List<User> findById(User param);
@Mapper:声明一个mybatis的dao接口,会被spring boot扫描到
@Select:声明一个查询方法,相应的增删改使用@Insert @Delete@Update
List<User>:返回集合。如果只返回一个结果,返回值是User。如果是增删改方法返回值是int
User param:传参,#{id}就是param对象的id值
扫描Mapper
- @MapperScan("hello.dao")
驼峰命名
在properties中添加以下配置,在执行查询后,可以将数据库的NN_NN格式字段,在java结果集对象中自动转换成驼峰命名参数
- mybatis.configuration.mapUnderscoreToCamelCase=true
结果映射@Results
如果结果集不是JAVA对象而是Map,map中的列名会和数据库中的NN_NN一样,是不会自动驼峰转换的。可以使用@Result来指明结果映射,同样也适用JAVA对象
- @Results({
- @Result(property="nnNn",column="NN_NN")
- })
- @Select("select * from user")
- public List<Map> findAll();
可复用的@Results
声明时给id赋值为user
- @Results(id="user",value={
- @Result(property="nnNn",column="NN_NN")
- })
在其他 方法中,重复使用id为user的结果映射
- @ResultMap("user")
打印SQL日志到控制台
在application.properties中添加以下配置
- logging.level.你的包名.mybatis接口包=debug
执行SQL时,会在控制台打印SQL日志
第一行:==>左边是执行SQL的接口及其方法,右边是执行语句
第二行:传参数1,String类型
第三行:查到一行数据
分页
首先要在pom.xml中引入文章开头的分页插件,分页逻辑写在service层。
- @Service
- @Transactional
- public class HelloServiceImpl {
- @Autowired
- MybatisDao mybatisDao;
- public void find(){
- //分页插件: 查询第1页,每页10行
- Page<User> page =PageHelper.startPage(1, 10);
- mybatisDao.findAll();
- //数据表的总行数
- page.getTotal();
- //分页查询结果的总行数
- page.size();
- //第一个User对象,参考list,序号0是第一个元素,依此类推
- page.get(0);
- }
执行原理:PageHelper.startPage会拦截下一个sql,也就是mybatisDao.findAll()的SQL。并且根据当前数据库的语法,把这个SQL改造成一个高性能的分页SQL,同时还会查询该表的总行数,具体可以看SQL日志。
PageHelper.startPage和mybatisDao.findAll()最好紧跟在一起,中间不要有别的逻辑,否则可能出BUG。
Page<User> page:相当于一个list集合,findAll()方法查询完成后,会给page对象的相关参数赋值
回传ID
假设数据库表的ID主键是自动增长的,现在添加一条数据,想要得到这条数据自动增长的ID,方法如下
dao层
useGeneratedKeys=true:获取数据库生成的主键
keyProperty="id":把主键值存入User param对象的id属性
- @Insert("insert into user(name) values(#{name})")
- @Options(useGeneratedKeys=true,keyProperty="id")
- public int add(User param);
service层
- User user = new User();
- user.setName("tom");
- mybatisDao.add(user);
- System.out.println("回传ID值:"+user.getId());
控制台
存储过程
这是一个mysql存储过程,传入一个id值,根据这个id查询出name值并且做为传出参数
- DELIMITER $$
- CREATE PROCEDURE `hello`(IN id_in VARCHAR(10),OUT name_out VARCHAR(10))
- BEGIN
- SELECT NAME INTO name_out FROM USER WHERE id=id_in;
- END$$
- DELIMITER ;
dao层
mode=IN:传入参数,就是user.id
mode=OUT:传出参数,就是user.name
StatementType.CALLABLE:说明这是一个存储过程
- @Select("call hello(#{id,mode=IN,jdbcType=VARCHAR},#{name,mode=OUT,jdbcType=VARCHAR})")
- @Options(statementType= StatementType.CALLABLE )
- public void call(User user);
service层
- public void call(){
- User user = new User();
- user.setId("14");
- mybatisDao.call(user);
- System.out.println(user.getName());
执行结果