spring boot学习(五)之连接数据库整合Mybatis

作者: xml_ | 来源:发表于2018-11-21 16:00 被阅读0次

前言

在上一篇文章中记录了spring boot整合jdbcTemplate,这次记录一下spring boot整合Mybatis,在实际项目中这种方式还是很常用的。和上一篇文章大同小异,发现spring boot整合mybatis比spring MVC整合要来得简单得多呢。

正文

pom.xml引入依赖
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

MyBatis-Spring-Boot-Starter会自动将我们配置的datasourcemapper.xml文件注册到spring上下文,很智能。

application.properties配置文件中配置数据源
spring.datasource.url = jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
添加数据池依赖,这里用的是阿里巴巴的数据池
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.19</version>
        </dependency>
在启动类Chapter1Application.java中读取数据源配置信息,Spring Boot会自动的用我们配置的这个DataSource。添加如下代码
    @Autowired
    private Environment environment;
    
    public DataSource dataSource(destroyMethod =  "close") {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(environment.getProperty("datasource.url"));
        dataSource.setUsername(environment.getProperty("datasource.username"));
        dataSource.setPassword(environment.getProperty("datasource.password"));
        dataSource.setDriverClassName(environment.getProperty("datasource.driver-class-name"));
        dataSource.setInitialSize(5);//初始化时建立物理连接的个数
        dataSource.setMaxActive(20);//最大连接池数量
        dataSource.setMinIdle(0);//最小连接池数量
        dataSource.setMaxWait(50000);//获取连接时最大等待时间,单位毫秒。
        dataSource.setValidationQuery("SELECT 1");//用来检测连接是否有效的sql
        return dataSource;
    }
下面就用我们配置的这个数据源信息,用JdbcTemplate来与数据库进行数据交互

本地创建spring数据库,再创建一张user表,表属性如下,自行填几条数据:

1.png

简单的做了个查询的例子:

  • 创建实体文件:User.java
public class User {
    private int id;
    private String name;
    private int age;
    private String address;
    private String phone;
    //set and get
}
  • controller层:UserController.java:
@RestController
public class UserController {

    @Autowired
    private UserService userService;
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping(value = "/queryUserList",method = RequestMethod.GET,produces="application/json;charset=UTF-8")
    @ResponseBody
    public String queryLearnList(HttpServletRequest request , HttpServletResponse response){

        String name = request.getParameter("name");
        String phone = request.getParameter("phone");
        Map<String,Object> params = new HashMap<String,Object>();
        params.put("name", name);
        params.put("phone", phone);
        List userList =userService.queryUserList(params);
        return JSONArray.fromObject(userList).toString();

    }
  • service层:接口UserService.java和实现类UserServiceImpl.java
public interface UserService {
    List queryUserList(Map<String, Object> params);
}
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserDao userDao;
    @Override
    public List queryUserList(Map<String,Object> params) {
        return userDao.queryUserList(params);
    }
}
整合Mybatis

dao层:这里去掉了实现类,具体操作如下:

@Component
@Mapper
public interface UserDao {
    public List queryUserList(Map<String, Object> params);
}

application.properies中增加如下配置:

#指定bean所在包
mybatis.type-aliases-package=com.mlin.entiy
#指定映射文件
mybatis.mapperLocations=classpath:mapper/*.xml

新建mapper文件目录,存放在src/main/resources下面,在src/main/resources/mapper目录下新建UserDaoMapper.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.mlin.dao.UserDao">
    <resultMap id="resultMap" type="com.mlin.entiy.User">
        <id column="id" property="id" jdbcType="BIGINT"  />
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="age" property="age" jdbcType="BIGINT"  />
        <result column="address" property="address" jdbcType="VARCHAR"/>
        <result column="phone" property="phone" jdbcType="VARCHAR"/>
    </resultMap>
    <sql id="sql_column" >
        id,name,age,address,phone
    </sql>
    <select id="queryUserList" resultMap="resultMap" parameterType="java.util.HashMap">
        select
        <include refid="sql_column" />
        from user
        <where>
            1 = 1
            <if test="name!= null and name !=''">
                AND name like CONCAT(CONCAT('%',#{name,jdbcType=VARCHAR}),'%')
            </if>
            <if test="phone != null and phone !=''">
                AND phone like  CONCAT(CONCAT('%',#{phone,jdbcType=VARCHAR}),'%')
            </if>

        </where>
    </select>
</mapper>

通过指定namespace来与dao联系。

结果

启动项目,在浏览器输入:http://localhost:8080/queryUserList,得到如下结果

1.png

总结

实践中可能遇到如下问题:

报错信息:启动项目后浏览器访问后台一直报

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mlin.dao.UserDao.queryUserList

这里给出网络上的一下答案:

  • 1. mapper的namespace路径不正确

  • 2.UserDao的方法在UserDaoMapper.xml中没有

  • 3. UserDao的方法返回值是List,而select元素没有正确配置ResultMap,或者只配置ResultType

  • 4. 如果你确认没有以上问题,请任意修改下对应的xml文件,比如删除一个空行,再试试
    上面的办法都没有解决我这里的问题,后来才发现是application.properies配置mybatis的路径名写错了,可见这个名字也是不能随便乱取的

改之前
#指定bean所在包
mybatis.bean=com.mlin.entiy
#指定映射文件
mybatis.mapper=classpath:mapper/*.xml
改之后:
#指定bean所在包
mybatis.type-aliases-package=com.mlin.entiy
#指定映射文件
mybatis.mapperLocations=classpath:mapper/*.xml

原创作者:梦凌小样
作品链接:https://www.jianshu.com/p/7a804c7dee0f【原创不易,转载请注明出处,感谢理解】
一位爱生活,爱创作,爱分享,爱自己的90后女程序员一枚,记录工作中的点点滴滴,一起学习,共同进步,期待能和优秀的您交上朋友

相关文章

网友评论

    本文标题:spring boot学习(五)之连接数据库整合Mybatis

    本文链接:https://www.haomeiwen.com/subject/trdcqqtx.html