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

论坛 期权论坛 区块链     
梦凌小样   2018-11-21 22:45   3050   0
            [h2]前言[/h2]

在上一篇文章中记录了spring boot整合jdbcTemplate,这次记录一下spring boot整合Mybatis,在实际项目中这种方式还是很常用的。和上一篇文章大同小异,发现spring boot整合mybatis比spring MVC整合要来得简单得多呢。[h2]正文[/h2]pom.xml引入依赖
  1.                     org.mybatis.spring.boot            mybatis-spring-boot-starter            1.3.0                            mysql            mysql-connector-java        
复制代码
  1. MyBatis-Spring-Boot-Starter
复制代码
会自动将我们配置的
  1. datasource
复制代码
  1. mapper.xml
复制代码
文件注册到spring上下文,很智能。在
  1. application.properties
复制代码
配置文件中配置数据源
  1. spring.datasource.url = jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8spring.datasource.username = rootspring.datasource.password = 123456spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
复制代码
添加数据池依赖,这里用的是阿里巴巴的数据池
  1.                     com.alibaba            druid            1.0.19        
复制代码
在启动类
  1. Chapter1Application.java
复制代码
中读取数据源配置信息,Spring Boot会自动的用我们配置的这个DataSource。添加如下代码
  1.     @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来与数据库进行数据交互

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

1.png

[h3]简单的做了个查询的例子:[/h3]
  • 创建实体文件:
    1. User.java
    复制代码
  1. public class User {    private int id;    private String name;    private int age;    private String address;    private String phone;    //set and get}
复制代码
    1. controller
    复制代码
    层:
    1. UserController.java
    复制代码
    :
  1. @RestControllerpublic 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 params = new HashMap();        params.put("name", name);        params.put("phone", phone);        List userList =userService.queryUserList(params);        return JSONArray.fromObject(userList).toString();    }
复制代码
    1. service
    复制代码
    层:接口
    1. UserService.java
    复制代码
    和实现类
    1. UserServiceImpl.java
    复制代码
  1. public interface UserService {    List queryUserList(Map params);}
复制代码
  1. @Servicepublic class UserServiceImpl implements UserService {    @Autowired    UserDao userDao;    @Override    public List queryUserList(Map params) {        return userDao.queryUserList(params);    }}
复制代码
整合Mybatis
  1. dao
复制代码
层:这里去掉了实现类,具体操作如下:
  1. @Component@Mapperpublic interface UserDao {    public List queryUserList(Map params);}
复制代码

  1. application.properies
复制代码
中增加如下配置:
  1. #指定bean所在包mybatis.type-aliases-package=com.mlin.entiy#指定映射文件mybatis.mapperLocations=classpath:mapper/*.xml
复制代码

新建
  1. mapper
复制代码
文件目录,存放在
  1. src/main/resources
复制代码
下面,在
  1. src/main/resources/mapper
复制代码
目录下新建
  1. UserDaoMapper.xml
复制代码
文件:
  1.                                                             id,name,age,address,phone                select                from user                    1 = 1                            AND name like CONCAT(CONCAT('%',#{name,jdbcType=VARCHAR}),'%')                                        AND phone like  CONCAT(CONCAT('%',#{phone,jdbcType=VARCHAR}),'%')                        
复制代码

通过指定
  1. namespace
复制代码
来与dao联系。[h2]结果[/h2]

启动项目,在浏览器输入:
  1. http://localhost:8080/queryUserList
复制代码
,得到如下结果

1.png

[h2]总结[/h2]

实践中可能遇到如下问题:
  1. 报错信息
复制代码
:启动项目后浏览器访问后台一直报
  1. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mlin.dao.UserDao.queryUserList
复制代码

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

    1. 1. mapper的namespace路径不正确
    复制代码

    1. 2.UserDao的方法在UserDaoMapper.xml中没有
    复制代码

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

    1. 4. 如果你确认没有以上问题,请任意修改下对应的xml文件,比如删除一个空行,再试试
    复制代码
    上面的办法都没有解决我这里的问题,后来才发现是
    1. application.properies
    复制代码
    配置mybatis的路径名写错了,可见这个名字也是不能随便乱取的
改之前
  1. #指定bean所在包mybatis.bean=com.mlin.entiy#指定映射文件mybatis.mapper=classpath:mapper/*.xml
复制代码
改之后:
  1. #指定bean所在包mybatis.type-aliases-package=com.mlin.entiy#指定映射文件mybatis.mapperLocations=classpath:mapper/*.xml
复制代码
原创作者:梦凌小样
作品链接:https://www.jianshu.com/p/7a804c7dee0f【原创不易,转载请注明出处,感谢理解】
一位爱生活,爱创作,爱分享,爱自己的90后女程序员一枚,记录工作中的点点滴滴,一起学习,共同进步,期待能和优秀的您交上朋友
         
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP