电子商务类网站,建设的网站后台会自动退出是正常的,网络营销策划方案案例范文,wordpress中文问题文章目录学习之前#xff0c;跟你们说点事情#xff0c;有助于你能快速看完文章一、先应用再学习#xff0c;代码示例1. 第一个MyBatis程序2. MyBatis整合Spring3. SpringBoot整合MyBatis二、MyBatis整体流程#xff0c;各组件的作用域和生命周期三、说说MyBatis-config.xm…
文章目录学习之前跟你们说点事情有助于你能快速看完文章一、先应用再学习代码示例1. 第一个MyBatis程序2. MyBatis整合Spring3. SpringBoot整合MyBatis二、MyBatis整体流程各组件的作用域和生命周期三、说说MyBatis-config.xml核心配置文件吧四、讲讲xxxMapper.xml文件中的标签吧五、MyBatis剩下的问题在这里总结一下参考文章什么是MyBatis学习之前跟你们说点事情有助于你能快速看完文章
先对MyBatis整套流程做个总结看懂了就直接跳过这里的示例吧。
假设现在要全部都配置好了我现在要测试UserMapper接口 完成了jar包导入后需要配置数据源以及xml文件位置创建数据库、实体类、实体接口为每个接口配置xxxMapper.xml文件规定每个方法做什么测试获取SqlSessionFactoryBuilder、sqlSessionFactory、sqlSession、xxxMapper执行xxxMapper.方法时需要根据方法名在核心配置文件找到对象的xxxMapper.xml然后在xxxMapper.xml找到对应方法的CRUD操 很多同学对classpath这个东西不明白在MyBatis中的classpath表示main/java、main/resources 、第三方jar包的根目录
一、先应用再学习代码示例
1. 第一个MyBatis程序
省流 配置篇引入jar包、配置核心配置文件mybatis-config.xml、编写MyBatis工具类 数据库创建数据表 编程篇创建实体类、创建Mapper层、创建xxxMapper.xml文件 测试篇MybatisUtils.getSqlseesion(); sqlSession.getMapper(UserDao.class); 配置MyBatis 引入MyBatis的Jar包
!--mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.21/version/dependency!--mybatis--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.6/version/dependency!--junit--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.13/version/dependency!--配置全局--!--在build中配置resource来防止我们资源到处失败的问题--buildresourcesresourcedirectorysrc/main/resources/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringtrue/filtering/resourceresourcedirectorysrc/main/java/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringtrue/filtering/resource/resources/buildMyBatis配置类
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.cj.jdbc.Driver/property nameurl valuecom.mysql.cj.jdbc.Driver/property nameusername valueroot/property namepassword value123456//dataSource/environment/environmentsmappersmapper resourcecom/mybatis/dao/UserMapper.xml//mappers
/configuration编写MyBatis工具类
public class MybatisUtils {private static SqlSessionFactory sqlSessionFactory;static {try {//使用Mybatis第一步: 获取sqlSessionFactory对象String resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}//既然有了 SqlSessionFactory顾名思义我们可以从中获得 SqlSession 的实例。//sqlSession 完全包含了面向数据库执行SQL命令所需的所有方法public static SqlSession getSqlseesion() {// SqlSession sqlSession sqlSessionFactory.openSession();return sqlSessionFactory.openSession();}
}到这里MyBatis就已经配置完成了。下面是根据业务需求应用MyBatis。
数据库搭建
CREATE DATABASE mybatis;
USE mybatis;
DROP TABLE IF EXISTS user;
CREATE TABLE user (
id int(20) NOT NULL,
name varchar(20) DEFAULT NULL,
pwd varchar(40) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8;
insert into user(id,name,pwd) values (1,小明,123456),(2,张三,abcdef),(3,李四,987654);编程篇
Data
AllArgsConstructor
NoArgsConstructor
public class User {private int id; //idprivate String name; //姓名private String pwd; //密码
}public interface UserMapper {//查询全部用户ListUser getUserList();
}编写xxxMapper接口的配置文件xxxMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.mybatis.dao.UserMapperselect idgetUserList resultTypecom.mybatis.pojo.Userselect * from mybatis.user/select
/mapper测试接口 Testpublic void test(){SqlSession sqlSession MybatisUtils.getSqlseesion();UserDao userdao sqlSession.getMapper(UserDao.class);ListUser userList userdao.getUserList();for(User user : userList){System.out.println(user);}sqlSession.close();}2. MyBatis整合Spring
省流 配置篇引入jar包、配置核心配置文件mybatis-config.xml、配置核心配置文件spring-dao.xml 数据库创建数据表 编程篇实体类、Mapper接口、xxxMapper.xml文件、UserMapperImpl、bean传入Spring容器 测试篇ClassPathXmlApplicationContext(spring-dao.xml) context.getBean(userMapper, UserMapper.class); 配置MyBatisSpring篇
!--spring核心ioc--
dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.5.RELEASE/version
/dependency
!--做spring事务用到的--
dependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversion5.2.5.RELEASE/version
/dependency
dependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.2.5.RELEASE/version
/dependency
!--mybatis依赖--
dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.1/version
/dependency
!--mybatis和spring集成的依赖--
dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion1.3.1/version
/dependency
!--mysql驱动--
dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.9/version
/dependency
!--阿里公司的数据库连接池--
dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.12/version
/dependencybuild!--目的是把src/main/java目录中的xml文件包含到输出结果中。输出到classes目录中--resourcesresourcedirectorysrc/main/java/directory!--所在的目录--includes!--包括目录下的.properties,.xml 文件都会扫描到--include**/*.properties/includeinclude**/*.xml/include/includesfilteringfalse/filtering/resource/resources!--指定jdk的版本--pluginspluginartifactIdmaven-compiler-plugin/artifactIdversion3.1/versionconfigurationsource1.8/sourcetarget1.8/target/configuration/plugin/plugins
/build创建MyBatis核心配置文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configuration!--settings控制mybatis全局行为--settings!--设置mybatis输出日志--setting namelogImpl valueSTDOUT_LOGGING//settings!--设置别名--typeAliases!--name:实体类所在的包名表示com.bjpowernode.domain包中的列名就是别名你可以使用Student表示com.bjpowenrode.domain.Student包下的所有类的类名则为别名--package namecom.SpringStudy.domain//typeAliases!--一个mapper标签指定一个文件的位置。从类路径开始的路径信息target/classes(类路径)--mappers!--name是包名 这个包中的所有mapper.xml一次都能加载--package namecom.SpringStudy.dao//mappers
/configuration创建Spring配置文件spring-dao.xml
xml
?xml version1.0 encodingGBK?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd!--DataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid我们这里使用Spring提供的JDBC--bean iddataSource classorg.springframework.jdbc.datasource.DriverManagerDataSourceproperty namedriverClassName valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatis?useSSLfalseamp;useUnicodetrueamp;characterEncodingUTF-8/property nameusername valueroot/property namepassword value123456//bean!--sqlSessionFactory--bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdataSource /!--关联mybatis配置文件--property nameconfigLocation valueclasspath:mybatis-config.xml/property namemapperLocations valueclasspath:com/kuang/mapper/*.xml//bean!--SqlSessionTemplate:就是我们使用的sqlSession--bean idsqlSession classorg.mybatis.spring.SqlSessionTemplate!--只能使用构造器注入sqlSessionFactory因为它没有set方法--constructor-arg index0 refsqlSessionFactory //bean
/beans到这里Spring与MyBatis整合配置已经完成
数据库篇 数据库搭建
CREATE DATABASE mybatis;
USE mybatis;
DROP TABLE IF EXISTS user;
CREATE TABLE user (
id int(20) NOT NULL,
name varchar(20) DEFAULT NULL,
pwd varchar(40) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8;
insert into user(id,name,pwd) values (1,小明,123456),(2,张三,abcdef),(3,李四,987654);编程篇 创建实体类User
Data
AllArgsConstructor
NoArgsConstructor
public class User {private int id; //idprivate String name; //姓名private String pwd; //密码
}创建实体类接口Mapper
public interface UserMapper {//查询全部用户ListUser getUserList();
}编写xxxMapper接口的配置文件xxxMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.mybatis.dao.UserMapperselect idgetUserList resultTypecom.mybatis.pojo.Userselect * from mybatis.user/select
/mapper需要UserMapper接口的UserMapperImpl 实现类私有化sqlSessionTemplate
public class UserMapperImpl implements UserMapper {//我们的所有操作都使用sqlSession来执行在原来现在都使用SqlsessionTemplateprivate SqlSessionTemplate sqlSession;public void setSqlSession(SqlSessionTemplate sqlSession) {this.sqlSession sqlSession;}public ListUser selectUser() {UserMapper mapper sqlSession.getMapper(UserMapper.class);return mapper.selectUser();}
}将自己写的实现类注入到Spring配置文件spring-dao.xml bean iduserMapper classcom.kuang.mapper.UserMapperImplproperty namesqlSession refsqlSession//bean测试篇 Testpublic void test () throws IOException {ApplicationContext context new ClassPathXmlApplicationContext(spring-dao.xml);UserMapper userMapper context.getBean(userMapper, UserMapper.class);for (User user : userMapper.selectUser()) {System.out.println(user);}}3. SpringBoot整合MyBatis
省流 配置篇引入jar包、配置核心配置文件application.yml 数据库创建数据表 编程篇实体类、Mapper接口、xxxMapper.xml文件、UserMapperImpl、bean传入Spring容器 测试篇ClassPathXmlApplicationContext(spring-dao.xml) context.getBean(userMapper, UserMapper.class); 配置篇 SpringBootMyBatis配置文件
!--Springboot需要的依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--Mybatis项目需要的依赖--!--mysqlq驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.12/version/dependency!--mybatis--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.4/version/dependency!--junit--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency!--Springboot-Mybatis整合需要的依赖--
dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.1.1/version
/dependencybuild!--目的是把src/main/java目录中的xml文件包含到输出结果中。输出到classes目录中--resourcesresourcedirectorysrc/main/java/directory!--所在的目录--includes!--包括目录下的.properties,.xml 文件都会扫描到--include**/*.properties/includeinclude**/*.xml/include/includesfilteringfalse/filtering/resource/resources!--指定jdk的版本--pluginspluginartifactIdmaven-compiler-plugin/artifactIdversion3.1/versionconfigurationsource1.8/sourcetarget1.8/target/configuration/plugin/plugins
/build配置核心配置类application.yml放在Resource文件夹下SpringBoot会自己扫描到
spring:datasource:name: pro_man_sys_dburl: jdbc:mysql://localhost:3306/pro_man_sys_db?serverTimezoneUTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverresources:static-locations: classpath:/static,classpath:/resources,file:/root/uploadFilesmybatis:type-aliases-package: com.shiliuzi.modelmapper-locations: classpath:mapper/*.xml数据库篇
CREATE DATABASE mybatis;
USE mybatis;
DROP TABLE IF EXISTS user;
CREATE TABLE user (
id int(20) NOT NULL,
name varchar(20) DEFAULT NULL,
pwd varchar(40) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8;
insert into user(id,name,pwd) values (1,小明,123456),(2,张三,abcdef),(3,李四,987654);编程篇 创建实体类User
Data
AllArgsConstructor
NoArgsConstructor
public class User {private int id; //idprivate String name; //姓名private String pwd; //密码
}创建实体类接口Mapper
Mapper
public interface UserMapper {//查询全部用户ListUser getUserList();
}配置Mapper.xml文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
!--configuration core file--
mapper namespacecom.guo.mapper.UserMapperselect idqueryUserList resultTypeUser/select
/mapper二、MyBatis整体流程各组件的作用域和生命周期
不同作用域和生命周期类别是至关重要的因为错误的使用会导致非常严重的并发问题。 sqlSessionFactoryBuilder 利用xml解析资源来解析MyBatis-config.xml核心配置文件创建了sqlSessionFactory就可以丢弃 sqlSessionFactory SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到最简单的就是使用单例模式或者静态单例模式。 sqlSession 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的因此是不能被共享的所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域甚至一个类的实例变量也不行。 三、说说MyBatis-config.xml核心配置文件吧
主要说说接口和对应xml映射文件的位置问题可以通过mapper映射标签解决 Mybatis中接口和对应的mapper文件不一定要放在同一个包下如果放在一起的目的是为了Mybatis进行自动扫描并且要注意此时Java接口的名称和mapper文件的名称要相同否则会报异常由于此时Mybatis会自动解析对应的接口和相应的配置文件所以就不需要配置mapper文件的位置了。
如果接口和mapper文件不在同一个包下就不能进行自动扫描解析了需要对接口和文件分别进行配置。
!--方式一使用相对于类路径的资源引用--
mappersmapper resourceorg/mybatis/builder/AuthorMapper.xml/
/mappers!--方式一使用映射器接口实现类的完全限定类名 --
mappersmapper classorg.mybatis.builder.AuthorMapper/
/mappers!--方式三将包内的映射器接口实现全部注册为映射器 --
mapperspackage nameorg.mybatis.builder/
/mappers四、讲讲xxxMapper.xml文件中的标签吧
如果童鞋们将上述的三个项目搭建认真看完并且总结了我相信MyBatis在使用层面就没什么问题了这里就再补充一下xxxMapper.xml文件的标签问题就好了。
1. CRUD标签
!--对象中的属性可以直接取出来--select idgetUserById parameterTypeint resultTypecom.kuang.pojo.Userselect * from mybatis.user where id #{id}/selectinsert idaddUser parameterTypecom.kuang.pojo.Userinsert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd});/insertupdate idupdateUser parameterTypecom.kuang.pojo.Userupdate mybatis.user set name#{name},pwd#{pwd} where id #{id} ;/updatedelete iddeleteUser parameterTypeintdelete from mybatis.user where id #{id};/delete2. parameterType传入参数 parameterType 实体类 如果 User 类型的参数对象传递到了语句中会查找 id、username 和 password 属性然后将它们的值传入预处理语句的参数中。对传递语句参数来说这种方式真是干脆利落。
insert idinsertUser parameterTypeUserinsert into users (id, username, password) values (#{id}, #{username}, #{password})
/insertparameterType map !--对象中的属性可以直接取出来 传递map的key--insert idaddUser parameterTypemapinsert into mybatis.user (id, pwd) values (#{userid},#{passWord});/insertTestpublic void addUser2(){SqlSession sqlSession MybatisUtils.getSqlSession();UserMapper mapper sqlSession.getMapper(UserMapper.class);MapString, Object map new HashMapString, Object();map.put(userid,5);map.put(passWord,2222333);mapper.addUser2(map);sqlSession.close();}五、MyBatis剩下的问题在这里总结一下
MyBatis的事务问题CRUD需要提交事务可以通过手动提交和自动提交完成 手动提交sqlSession.commit自动提交sqlSessionFactory.openSessiontrue 属性名和字段名不一致通过ReslutMap
但是MyBatis-plus底层会去识别数据库字段然后遇到下划线就会转化为下一个字母的大写也就是驼峰命名转化。 resultMap idWaterSupplyProduction typecom.ruoyi.domain.monitor.WaterSupplyProduction!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id --!-- property主键在pojo中的属性名 --!-- column主键在数据库中的列名 --id propertyid columnid/!-- 定义普通属性 --result propertyareaName columnarea_name/result propertyfactoryId columnfactory_id/result propertymonitorRecordId columnmonitor_record_id/result propertyriverLevel columnriver_level/result propertyriverTurbidity columnriver_turbidity/result propertyriverFlowRate columnriver_flow_rate/result propertyhandledTurbidity columnhandled_turbidity/result propertypoolLevel columnpool_level/result propertyfactoryWaterTurbidity columnfactory_water_turbidity/result propertyfactoryWaterPH columnfactory_water_pH/result propertyfactoryWaterChlorine columnfactory_water_chlorine/result propertyfactoryWaterRate columnfactory_water_rate/result propertycreateTime columncreate_time//resultMapselect idselectAll resultMapWaterSupplyProductionselect * from water_supply_production/select使用注解开发项目实际上就是将xxxMapper.xml与xxxMapper整合在一起 如果把xxxMapper.xml与xxxMapper整合在一起那就应该把Mapper映射器位置改成xxxMapper接口位置 mappersmapper classcom.itheima.dao.UserMapper/mapper/mapperspublic interface UserMapper {Select(select * from user)ListUser getUsers();//方法存在多个参数所有的参数前面必须加上param(id)Select(select * from user where id #{id})User getUserById(Param(id) int id);Insert(insert into user(id,name,pwd) values(#{id},#{name},#{paswword}))int addUser(User user);Update(update user set name#{name},pwd#{password} where id#{id})int updateUser(User user);Delete(delete from user where id#{id})int deleteUser(Param(id) int id);
}MyBatis的二级缓存
在MyBatis-config.xml核心配置文件开启二级缓存支持
!-- 配置二级缓存 --
settings !-- 开启二级缓存的支持 -- setting namecacheEnabled valuetrue/
/settings在持久层接口中使用注解配置二级缓存
CacheNamespace(blocking true)
public interface UserMapper{}