Spring-data-mybatis案例

2020-11-14 碼農向前衝

本節主要學習Spring-data-mybatis案例,即spring集成mybatis框架。

1.配置坐標

新建maven項目,pom.xml中配置坐標:

<dependencies> <!--spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.7.RELEASE</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!--mybatis-spring--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.5</version> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.7.0-M1</version> <scope>test</scope> </dependency> <!--日誌框架--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>

2.編寫配置文件

log4j.properties

log4j.rootLogger=debug,stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/cms?useUnicode=true&characterEncoding=utf8&useSSL=truejdbc.username=rootjdbc.password=rootreadOnly=falseconnectionTimeout=30000idleTimeout=600000maxLifetime=1800000maximumPoolSize=15

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 定義掃描註解所在的包 --> <context:component-scan base-package="raky.train" /> <!--1. 導入資源文件,屬性配置文件 --> <context:property-placeholder location="classpath:hikaricp.properties" /> <!--2. 配置數據源,連接池:dbcp/dbcp2/c3p0/druid/HikariCP --> <!-- druid--> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="readOnly" value="${readOnly}" /> <property name="connectionTimeout" value="${connectionTimeout}" /> <property name="idleTimeout" value="${idleTimeout}" /> <property name="maxLifetime" value="${maxLifetime}" /> <property name="maximumPoolSize" value="${maximumPoolSize}" /> </bean> <!-- 3.集成mybatis --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入連接池 --> <property name="dataSource" ref="dataSource"/> <!-- 配置模塊別名 --> <property name="typeAliasesPackage" value="raky.train.entity" /> <!-- 配置日誌實現 --> <property name="configuration"> <bean class="org.apache.ibatis.session.Configuration"> <property name="logImpl" value="org.apache.ibatis.logging.log4j.Log4jImpl" /> <property name="mapUnderscoreToCamelCase" value="true" /> </bean> </property> <!-- 模塊配置文件 --> <property name="mapperLocations" value="classpath:mybatis/*.xml"/> </bean> <!-- 4.sqlSessionTemplate對象 ===》sqlSession封裝 --> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <!-- <constructor-arg index="0" ref="sqlSessionFactory" /> --> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> </beans>

UserMapper.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="mybatis.UserMapper"> <!-- 只針對查詢,對象的屬性與表中的列一一對應 --> <resultMap type="User" id="selectUserResult"> <id column="id" property="id"/> <result column="name" property="name" /> <result column="pass" property="pass" /> <result column="age" property="age" /> </resultMap> <sql id="sf-user"> <where> <if test="id != null and id != 0">and id = #{id}</if> <if test="pass != null and pass != ''">and pass = #{pass}</if> <if test="name != null and name != ''">and name = #{name}</if> </where> </sql> <select id="getList" parameterType="User" resultType="User"> select * from user <include refid="sf-user" /> </select> <select id="getOne" parameterType="int" resultType="User"> select * from user where id = #{id} </select> <insert id="insert" parameterType="User"> insert into user <trim prefix="(" suffix=")" suffixOverrides=","> <if test="name != null and name !=''">name,</if> <if test="pass != null and pass !=''">pass,</if> <if test="age != null and age != 0">age,</if> </trim> <trim prefix="values(" suffix=")" suffixOverrides=","> <if test="name != null and name !=''">#{name},</if> <if test="pass != null and pass !=''">#{pass},</if> <if test="age != null and age != 0">#{age},</if> </trim> </insert> <update id="update"> update user <set> <if test="name != null and name != ''">name = #{name},</if> <if test="pass != null and pass != ''">pass = #{pass},</if> <if test="age != null and age != 0">age = #{age},</if> </set> where id = #{id} </update> <delete id="delete" parameterType="int"> delete from user where id=#{id} </delete> <delete id="deleteAll" parameterType="int[]"> delete from user where id in <foreach item="item" index="index" collection="array" open="(" separator="," close=")"> #{item} </foreach> </delete> </mapper>

3.編寫實體類

User.java

package raky.train.entity;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic class User { private Integer id; private String name; private String pass; private Integer age;}

4.編寫持久化層代碼

UserDao.java

package raky.train.dao;import java.util.List;import raky.train.entity.User;public interface UserDao { public int insert(User user); public int update(User user); public int delete(Integer id); public User getOne(Integer id); public List<User> getList(User user);}

UserDaoImpl.java

package raky.train.dao.impl;import java.util.List;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Repository;import raky.train.dao.UserDao;import raky.train.entity.User;@Repositorypublic class UserDaoImpl implements UserDao{ @Autowired private SqlSessionTemplate sqlSessionTemplate; private static final String namespace="mybatis.UserMapper."; @Override public int insert(User user) { return sqlSessionTemplate.insert(namespace + "insert", user); } @Override public int update(User user) { return sqlSessionTemplate.update(namespace + "update", user); } @Override public int delete(Integer id) { return sqlSessionTemplate.delete(namespace + "delete", id); } @Override public User getOne(Integer id) { return sqlSessionTemplate.selectOne(namespace + "getOne", id); } @Override public List<User> getList(User user) { return sqlSessionTemplate.selectList(namespace + "getList", user); }}

5.編寫服務層代碼

UserService.java

package raky.train.service;import java.util.List;import raky.train.entity.User;public interface UserService { int insert(User user); int update(User user); int delete(Integer id); User getOne(Integer id); List<User> getList(User user);}

UserServiceImpl.java

package raky.train.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import raky.train.dao.UserDao;import raky.train.entity.User;import raky.train.service.UserService;@Servicepublic class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public int insert(User user) { return userDao.insert(user); } @Override public int update(User user) { return userDao.update(user); } @Override public int delete(Integer id) { return userDao.delete(id); } @Override public User getOne(Integer id) { return userDao.getOne(id); } @Override public List<User> getList(User user) { return userDao.getList(user); }}

6.編寫控制層代碼

UserController.java

package raky.train.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import raky.train.entity.User;import raky.train.service.UserService;@Controllerpublic class UserController { @Autowired private UserService userService; public int insert(User user) { return userService.insert(user); } public int update(User user) { return userService.update(user); } public int delete(Integer id) { return userService.delete(id); } public User getOne(Integer id) { return userService.getOne(id); } public List<User> getList(User user) { return userService.getList(user); }}

7.編寫測試代碼

UserControllerTest.java

package raky.train.controller;import lombok.extern.slf4j.Slf4j;import org.junit.jupiter.api.Test;import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;import raky.train.entity.User;import javax.annotation.Resource;import java.util.List;import static org.junit.jupiter.api.Assertions.*;@Slf4j@SpringJUnitConfig(locations = {"classpath:applicationContext.xml"})class UserControllerTest { @Resource private UserController userController; @Test void insert() { User user = User.builder().name("abc").pass("abc").build(); int result = userController.insert(user); log.info("===>user:{}",user); log.info("===>{}",result); assertEquals(result,1); } @Test void update() { User user = User.builder().id(22).name("cba").pass("cba").age(99).build(); int result = userController.update(user); log.info("===>{}",result); assertEquals(result,1); } @Test void delete() { int result = userController.delete(333); log.info("===>{}",result); assertEquals(result,0); } @Test void getOne() { User user = userController.getOne(1); log.info("===>{}",user); assertNotNull(user); } @Test void getList() { User user = User.builder().build(); List<User> userList = userController.getList(user); userList.forEach(x -> log.info("===>{}",x)); }}

8.調試運行

調試運行測試代碼,結果如下:

至此,Spring-data-mybatis案例學習筆記整理完畢。希望對大家有幫助。越分享越快樂。

相關焦點

  • springdata mybatis mini 版本 2.2.2 更新,簡化 mybatis - OS...
    模版引擎即動態 sql 能力,sql 寫在 markdown 文件裡,便於書寫和閱讀 底層 jdbc 使用 spring jdbc 簡化 mybatis 動態 sql 寫法,比如:{@and id in idList} 等於<if test="null!
  • Spring Data 簡介和踩坑心得
    引入spring data,特別是在spring boot之後,最大的好處就是簡化了配置。換句話說,幾個註解,幾行yml配置,一套數據源就整合進來了。省去了查詢官方手冊的時間。orm我們喜歡mybatis,而國外使用jpa和hibernate的明顯更多,mybatis份額很小。(參見stackoverflow調查)列式資料庫,我們hbase 相較 cassandra 用的更多。一些雲廠商、小廠商的資料庫,我們幾乎不會使用。
  • SpringDataJPA這麼玩?
    ;      <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>參考文章
  • Spring集成MyBatis | Spring系列第53篇
    2、案例代碼git地址:https://gitee.com/javacode2018/spring-series方式1源碼:spring-series\lesson-005-mybatis方式2源碼:spring-series\lesson-006-mybatis3、準備
  • Spring-data-jdbcTemplate案例
    本節主要學習Spring-data針對jdbc的封裝JdbcTemplate技術。https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org
  • 兩大熱門框架 Spring 與 Mybatis 如何整合呢?
    >整合的方式新建 maven 項目引入依賴包配置資源文件案例實操新建 maven 項目新建 maven 項目 spring_mybatis>com.xxx.dao、com.xxx.mapper、com.xxx.service、com.xxx.service.impl測試包:spring_mybatis
  • 深入Spring Boot (十):整合Mybatis框架詳解
    如果你使用spring-boot-starter-jdbc或spring-boot-starter-data-jpa,會自動添加對HikariCP的依賴,也就是說此時使用HikariCP。當然你也可以強制使用其它的連接池技術,可以通過在application.properties或application.yml中配置spring.datasource.type指定。
  • 最新Spring整合MyBatis詳解教程
    <dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis-spring</artifactId>    <version>2.0.5</version></dependency>
  • Spring boot整合持久層框架Mybatis
    boot和mybatis的依賴,可以根據實際情況進行修改版本spring boot相關依賴<parent> <groupId>org.springframework.boot
  • Spring整合Mybatis框架基礎配置
    文件,因為和spring框架整合之後,我們連接資料庫的配置寫到了spring的配置文件中,所有mybatis的配置文件可以不寫了,但是,我們也可以寫一些配置。那我們這裡保留別名寫到mybatis的配置文件中。
  • SpringBoot學習筆記二之Spring整合Mybatis
    useUnicode=true&characterEncoding=UTF-8jdbc.driver=com.mysql.jdbc.Driver在learn-admin-webui中配置mybatis-config.xml(注意是在mybatis目錄中)配置內容
  • MyBatis初級實戰之一:Spring Boot集成
    JDK:1.8.0_1812. mybatis-spring-boot-starter:2.1.3(對應的MyBatis:3.5.5)3. Spring Boot:2.3.2.RELEASE4. MySQL:5.7.295. 實戰環境:win106.
  • 挺詳細的spring+springmvc+mybatis配置整合|含原始碼
    +springmvc+mybatis)框架。--sqlSessionFactory -->  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    <property name="dataSource" ref="dataSource
  • 集成Redis、mybatis、springboot
    這兒我們就不用jedis了,spring對redis也有支持,我們就用spring-boot-starter-data-redis來整合redis。--https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis
  • Spring boot集成mybatis以及使用的步驟
    mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version
  • Spring boot與MyBatis簡單整合
    <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot
  • 基於 SpringBoot2.0+優雅整合 SpringBoot+Mybatis
    Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術的整合,可能是你遇到的講解最詳細的學習案例
  • 理解 MyBatis 是如何在 Spring 容器中初始化的
    <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.2.0.RELEASE</version></dependency><!
  • mybatis-spring定義DAO用代理類操作資料庫
    在本案例中我們模擬實現mybatis-spring中代理類生成部分GenericBeanDefinition,定義bean的信息,在mybatis-spring中使用到的是;ScannedGenericBeanDefinition 略有不同。FactoryBean,用於處理bean工廠的類,這個類非常見。
  • Spring-Mybatis 讀寫分離
    Spring Boot 引入 mybatis 的教程 可以參考 傳送門 。  首先我們來看一下配置文件中的信息:spring.datasource.url=jdbc:mysql://localhost:3306/charles_blog2spring.datasource.username=rootspring.datasource.password=rootspring.datasource.driver-class-name