整合Mybatis(Spring学习笔记十二)

一、导入相关的包

        junit 包        Mybatis包        mysql数据库包        Spring相关的包        Aop相关的包        

        Mybatis-Spring包(现在就来学这个)       

提示jdk版本不一致的朋友记得 jdk8只支持spring到5.x 所以如果导入的spring(spring-webmvc spring-jdbc)大于5.x 就需要降级或者安装jdk17否则就会报错;jdk8跟着我导入的包的版本来是没问题的

配置文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.example</groupId><artifactId>SpringFather</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>SpringSon10</artifactId><packaging>war</packaging><name>SpringSon10 Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!--导入junit支持--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version></dependency><!--导入AOP支持--><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.13</version></dependency><!--导入mysql支持        --><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--导入Mybatis支持        --><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency><!--导入Spring支持        --><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version></dependency><!--Spring操作数据库的话还需要导入一个spring-jdbc 支持    --><!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><!--Mybatis和Spring整合的包--><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.2</version></dependency><!--导入lombok包好写实体类的时候偷懒--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency><!--导入log4j相关依赖--><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies><build><finalName>SpringSon10</finalName><!--解决配置文件无法导出或生效的问题(一般加在父工程)--><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build>
</project>

二、回忆一下Mybatis怎么实现的

创建实体类

package com.li.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {private int id;private String name;private String pwd;
}

 创建增删改查接口

package com.li.dao;import com.li.pojo.User;import java.util.List;public interface UserMapper {List<User> selectAll();
}

 创建工具类获取sqlSessionFactory

package com.li.utils;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class MybatisUtils {//官网上有三段代码拿来用 工具类的作用就是得到SqlSessionprivate static final SqlSessionFactory sqlSessionFactory;static{try {//获取SqlSessionFactory对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}//获取SqlSessionpublic static SqlSession getSqlSession(){return sqlSessionFactory.openSession();}
}

 创建接口Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--上面是头文件不管-->
<!--namespace等于绑定一个对应的Mapper接口 我这里是UserMapper接口-->
<mapper namespace="com.li.dao.UserMapper">
<!--    这里没有写sql语句--><select id="selectAll" resultType="user">select *from mybatis1.user</select>
</mapper>

原来的mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--通过properties标签引入外部配置文件--><properties resource="db.properties"/><!--给实体类取别名--><typeAliases><package name="com.li.pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${urlName}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><!--    绑定mapper--><mappers><mapper resource="com/li/dao/UserMapper.xml"/><!--&lt;!&ndash;        &lt;!&ndash;也可以通过class绑定mapper&ndash;&gt;--><!--        <mapper class="com.li.mapper.UserMapper"/>--><!--&lt;!&ndash;        &ndash;&gt;&ndash;&gt;--></mappers></configuration>

和mybatis-config.xml相对应的配置文件

driver=com.mysql.jdbc.Driver
urlName=jdbc:mysql://localhost:3306/mybatis1?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=root

 测试类测试能不能跑通

package com.li.dao;import com.li.pojo.User;
import com.li.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;public class Testgo {@Testpublic void test1(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);for (User user : mapper.selectAll()) {System.out.println(user);}sqlSession.close();}
}

 目录结构

三、Mybatis-Spring

1、什么是Mybatis-spring

2、编写Mybatis-spring的xml配置文件

直接用spring的配置文件格式

<?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:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"></beans>

  配置数据库连接的数据,相当于Mybatis的连接数据库那一段

    <!--DataSource:使用Spring的数据源替换Mybatis的配置    还可以用c3p0  dbcp  druid--><!--配置数据源,数据源有很多种随便哪一种都可以--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis1?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="root"/></bean>

 相当于这一段

  <environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${urlName}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>

  得到sqlSessionFactory

  <!--得到sqlSessionFactory    --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--这里 ref后面值就是我们上面配置的数据库数据源的连接id值       --><property name="dataSource" ref="dataSource"/><!--这里可以实现Mybatis配置文件里的所有东西,基本上就可以不要mybatis配置文件了,但是有的时候mybatis配置文件还是有一定的作用一般会把取别名和设置放在mybatis的配置文件中去做--><!--绑定Mybatis的配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/><!--也可以注册mapper映射器--><property name="mapperLocations" value="classpath:com/li/dao/UserMapper.xml"/></bean>

        配置文件之前相当于下面这一段

package com.li.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class MybatisUtils {//官网上有三段代码拿来用 工具类的作用就是得到SqlSessionprivate static final SqlSessionFactory sqlSessionFactory;static{try {//获取SqlSessionFactory对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}//获取SqlSessionpublic static SqlSession getSqlSession(){return sqlSessionFactory.openSession();}
}

配置文件下面那两段相当于mybatis核心配置文件中的配置之类的(有一一对应的property 设置)

 方式一:得到sqlSession 在mybatis-spring中叫sqlSessionTemplat     来调用方法

一、通过org.mybatis.spring.SqlSessionTemplate得到sqlSessionT

二、构造器注入sqlSessionFactory

  <!--得到sqlSession,在mybatis-spring中叫sqlSessionTemplat可以简答的理解她两就是一个意思--><!--这里需要给SqlSessionTemplate注入一个参数    --><bean id="sqlSessionT" class="org.mybatis.spring.SqlSessionTemplate"><!--这里只能用构造器注入,因为没有set方法        --><constructor-arg index="0" ref="sqlSessionFactory"/></bean>

 在mybatis中我们在配置文件中就可以写sql语句,但是这里链接Spring了之后配置是面向对象的,需要创建一个实现类来写sql语句

package com.li.dao;import com.li.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;import java.util.List;public class UserMapperImpl implements UserMapper{//之前我们所有的操作都是用sqlSession来执行,现在我们用sqlSessionTemplat来执行的//使用spring需要注入,需要有set方法,spring万物皆注入private SqlSessionTemplate sqlSessionTemplate;public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {this.sqlSessionTemplate = sqlSessionTemplate;}@Overridepublic List<User> selectAll() {//这里的操作就是和拿到SqlSession之后拿mapper的方法是一样的UserMapper mapper = sqlSessionTemplate.getMapper(UserMapper.class);return  mapper.selectAll();}
}

 

 写完类之后就需要在配置文件中注入

 <!--注入写的拿到写sql语句的类--><bean id="userMapper" class="com.li.dao.UserMapperImpl"><!--得到sqlSessionTempla--><property name="sqlSessionTemplate" ref="sqlSessionTempla"/></bean>

 方式二:得到sqlSession 在mybatis-spring中叫sqlSessionTemplat     来调用方法

编写是西安类

package com.li.dao;import com.li.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;import java.util.List;public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {@Overridepublic List<User> selectAll() {//因为实现类集成了SqlSessionDaoSupport,可以直接getSqlSession()得到SqlSessionreturn getSqlSession().getMapper(UserMapper.class).selectAll();}
}

 spring-dao.xml注入实现类

    <!--第二种实现方式:    注入实现类来执行增删改查方法    --><bean id="userMapper2" class="com.li.dao.UserMapperImpl2"><!--方式二相对于方式一不需要下面这段代码<bean id="sqlSessionT" class="org.mybatis.spring.SqlSessionTemplate">这里只能用构造器注入,因为没有set方法<constructor-arg index="0" ref="sqlSessionFactory"/></bean>--><!--但是需要注入一个 sqlSessionFactory  因为实现类的父类需要  --><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean>

 

配置完成之后我们来写测试类测试

package com.li.dao;import com.li.pojo.User;
import com.li.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Testgo {@Testpublic void test1(){//        SqlSession sqlSession = MybatisUtils.getSqlSession();
//
//        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//
//        for (User user : mapper.selectAll()) {
//            System.out.println(user);
//        }
//
//        sqlSession.close();ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");//下面的userMapper就是spring-dao.xml最后注入的bean标签的id名称UserMapper mapper = context.getBean("userMapper", UserMapper.class);for (User user : mapper.selectAll()) {System.out.println(user);}}
}

完整的spring-dao.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:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!--DataSource:使用Spring的数据源替换Mybatis的配置    还可以用c3p0  dbcp  druid--><!--这里相当于配置连接数据库--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis1?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="root"/></bean><!--得到sqlSessionFactory    --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--这里 ref后面值就是我们上面配置的数据库来连接的id值       --><property name="dataSource" ref="dataSource"/><!--这里可以实现Mybatis配置文件里的所有东西,基本上就可以不要mybatis配置文件了,但是有的时候mybatis配置文件还是有一定的作用一般会把取别名和设置放在mybatis的配置文件中去做--><!--绑定Mybatis的配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/><!--也可以注册mapper映射器--><property name="mapperLocations" value="classpath:com/li/dao/UserMapper.xml"/></bean><!--得到sqlSession,在mybatis-spring中叫sqlSessionTemplat可以简答的理解她两就是一个意思--><!--这里需要给SqlSessionTemplate注入一个参数    --><bean id="sqlSessionT" class="org.mybatis.spring.SqlSessionTemplate"><!--这里只能用构造器注入,因为没有set方法        --><constructor-arg index="0" ref="sqlSessionFactory"/></bean><!--注入写的拿到写sql语句的类--><bean id="userMapper" class="com.li.dao.UserMapperImpl"><!--得到sqlSessionTemplate--><property name="sqlSessionTemplate" ref="sqlSessionT"/></bean></beans>

需要注意的是UserMapper的配置文件不能把里面的sql语句部分删除,要不然会报

Invalid bound statement (not found)  的错

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--上面是头文件不管-->
<!--namespace等于绑定一个对应的Mapper接口 我这里是UserMapper接口-->
<mapper namespace="com.li.dao.UserMapper">
<!--    这里没有写sql语句--><select id="selectAll" resultType="user">select *from mybatis1.user</select>
</mapper>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/594010.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

家具木材选择,橡胶木和松木哪个好?福州中宅装饰,福州装修

装修中&#xff0c;选择橡胶木和松木作为家具材料是一个常见的选择。然而&#xff0c;对于哪种木材更适合做家具这个问题&#xff0c;需要从多个方面进行分析和比较。 首先&#xff0c;让我们来看看 橡 胶 木。橡胶木通常被认为是一种坚硬和耐用的木材&#xff0c;这使得它非常…

【快速解决】python缺少了PyQt5模块的QtMultimedia子模块

目录 问题描述 问题原因 解决方法 成功示范 问题描述 Traceback (most recent call last): File "d:\桌面\python项目\DesktopWords-master\main.py", line 4, in <module> from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent ModuleNotFoundEr…

Jupyter IPython帮助文档及其魔法命令

1.IPython 的帮助文档 使用 help() 使用 ? 使用 &#xff1f;&#xff1f; tab 自动补全 shift tab 查看参数和函数说明 2.运行外部 Python 文件 使用下面命令运行外部 Python 文件&#xff08;默认是当前目录&#xff0c;也可以使用绝对路径&#xff09; %run *.py …

Spring-IoC 基于注解

基于xml方法见&#xff1a;http://t.csdnimg.cn/dir8j 注解是代码中的一种特殊标记&#xff0c;可以在编译、类加载和运行时被读取&#xff0c;执行相应的处理&#xff0c;简化 Spring的 XML配置。 格式&#xff1a;注解(属性1"属性值1",...) 可以加在类上…

Redis -- 缓存穿透问题解决思路

缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对象 优点&#xff1a;实现简单&#xff0c;维护方便 缺点&#xff1a; 额外…

00-JAVA基础-动态编译

动态编译 JAVA 6 引入了动态编译机制。Java 动态编译是指在运行时将Java源代码编译成可执行的字节码。这通常使用Java的内置编译器API javax.tools.JavaCompiler 来实现。 动态编译的应用场景 可以做一个浏览器编写java代码&#xff0c;上传服务器编译和运行的在线测评系统服…

【JavaSE】反射

Java代码的生命周期 Java代码在计算机中经历的阶段&#xff1a;Source源代码阶段、Class类对象阶段、RunTime运行时阶段。 Source源代码阶段: 这个阶段是由程序员编写生成源代码,再由Javac编译器生成class文件。 Class类对象阶段&#xff1a;由类加载器将class文件加载到JVM内…

动规训练3

一、按摩师 1、题目解析 简而言之就是&#xff0c;找到一个按摩师的预约总是长的最长方案&#xff0c;还有一个限制条件&#xff0c;选取的预约两两不相邻。 2、算法原理 a状态表示方程 小技巧&#xff1a;经验题目要求 dp[i]表示以这个节点为结尾&#xff0c;最长的预约时…

Calico IPIP和BGP TOR的数据包走向

IPIP Mesh全网互联 文字描述 APOD eth0 10.7.75.132 -----> APOD 网关 -----> A宿主机 cali76174826315网卡 -----> Atunl0 10.7.75.128 封装 ----> Aeth0 10.120.181.20 -----> 通过网关 10.120.181.254 -----> 下一跳 BNODE eth0 10.120.179.8 解封装 --…

哈佛大学商业评论 --- 第四篇:一家公司的AR经验

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 专题作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大多…

LeetCode每日一题之专题一:双指针 ——快乐数

快乐数OJ链接&#xff1a;202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 题目分析: 为了房便叙述&#xff0c;将「对于⼀个正整数&#xff0c;每⼀次将该数替换为它每个位置上的数字的平方和」这⼀个 操作记为 x 操作&#xff1b; 题目告诉我们&#…

什么是原生IP?原生IP的作用是什么?

原生IP&#xff08;Native IP&#xff09;是指直接从互联网服务提供商&#xff08;ISP&#xff09;获得的IP地址&#xff0c;而非通过代理服务器、VPN或其他中间层方式获取。这种IP地址直接与用户的设备或网络关联&#xff0c;无需经过任何中间服务器或代理的转发或隐藏&#x…