MyBatis

it2022-06-24  93

Mybatis

1.什么是mybatis

是一个orm框架,orm:对象(java)关系(Mysql…等数据库)映射问题:MyBatis和JDBC有什么区别及MyBatis和JPA有什么区别?1.MyBatis和JPA既然要操作数据库,底层还是JDBC2.开发效率比JDBC快,但比JPA慢;运行效率不输JDBC,但比JPA更快3.因为不写sql语句,所以更好的控制性能;也是因为不写sql,很麻烦

2.Mybatis的hello

1.先准备数据库,准备相应的表2.创建一个普通的项目3.导包(MyBatis的所有包):Mybatis的核心包,MyBatis的依赖包,数据库驱动包4.准备domin5.写配置文件:MyBatis-config.xml:核心配置文件;xxxMapper.xml:写sql语句6.完成测试:两个核心对象(SqlSessionFactory和SqlSession)

3.MySQL有两个引擎

1.MyISAM-不支持事务,不支持外键(速度快)2.ImoDB-支持事务,支持外键(速度慢)

4.有些数据保存之后马上就要使用(需要知道id才能确定是那一条数据)

1.在JDBC中取获取比较麻烦2.在JPA中默认就有(方便但性能不好)3.MyBatis中默认没有—》获取时性能较好 3.1如何获取:在需要获取的标签中写 userGeneratedKeys:true代表是否获取idKeyColumn:代表表中主键;KeyProperty:代表类中主键

5.MyBatis三大核心对象

1.SqlSessionFactoryBuilder:用于创建SqlSessionFactory,不需要用变量接收,用完就可以扔掉2.SqlSessionFactory:一个项目需要一个这个对象:a.重量级 b.线程安全3.SqlSession:一个线程使用一个这个对象:a.轻量级对象 b.线程不安全

6.MyBatis的使用细节

1.添加时可能需要获取id–>上面说过,这里就不详谈2.自定义别名2.1使用标签typeAliases: 2.1.1 Aliases:别名(别名不区分大小写),typeAlias(一个别名配一个),package(一劳永逸的方法,直接给包下的路径就可以) 3.日志: 等级从低到高 TRACE:详细 Debug:调试,类似于System.out.print Info:信息,类似于JPA打印sql等级 Warn:警告,程序可以正常运行,出现提示 Error:错误,出现异常 #log4j.properties(日志文件:) log4j.rootLogger=ERROR, stdout #log4j.rootLogger=NONE log4j.logger.cn.itsource=TRACE 把左边包名改成你自己的包名 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n 4.当数据库的表字段和类无法对应,我们就得手动加上映射 <!-- 1. 添加与修改在相应位置修改名称即可 2.查询需要创建一个resultMap 3.使用的时候返回结果必需是resultMap 准备一个映射(ORM)配置 resultMap:结果映射 --> <resultMap id="productMapper" type="product"> <!--如果是主键不一致,使用id这个标签--> <id column="id" property="id" /> <!-- result:某一个属性的映射 column:列名(表中) property:属性名(对象中) --> <result column="dir_id" property="dirId" /> </resultMap> <!-- 查询所有数据 --> <select id="findAll" resultMap="productMapper" > select * from product </select>

7.MyBatis高级- http://note.youdao.com/noteshare?id=f8227cf5f186b82434d182e757af7aa7

8.MyBatis开发三剑客-https://blog.csdn.net/wuseyukui/article/details/79497723

9.ssm配置及详细解析-https://www.cnblogs.com/smiledragon/p/10680377.html

10.Mybatis高级详解(pom.xml)

1.基本配置

1.创建一个Maven项目导包

注意:Maven项目的配置文件只有放到resources里面才能编译 1.将xml文件写到resources里面;2.百度搜索:如何在java文件中读取xml

<?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.itsource</groupId> <artifactId>mybatisDay03</artifactId> <version>1.0-SNAPSHOT</version> <!--代码生成器,第一步导包--> <dependencies> <!--mybatis核心包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.1</version> </dependency> <!--mysql数据库驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!--junit测试包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--代码生成器的核心包--> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency> <!--mybatis分页--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.0.0</version> </dependency> </dependencies> <build> //这里是告诉需要在java中编译xml文件 <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <!--插件组的id--> <groupId>org.mybatis.generator</groupId> <!--插件的模块名称--> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <!-- 不写这一句,会默认到资源文件的根目录去找generatorConfig.xml --> <!--<configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile>--> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </plugin> </plugins> </build> </project> 2.代码生成器插件(pom.xml中) <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <!--插件组的id--> <groupId>org.mybatis.generator</groupId> <!--插件的模块名称--> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <!-- 不写这一句,会默认到资源文件的根目录去找generatorConfig.xml --> <!--<configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile>--> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </plugin> </plugins> </build> 3.准备generatorConfig.xml(必须是这个名字,默认是在resources根目录下面) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration> <!--导入db属性配置--> <properties resource="db.properties"></properties> <!--指定特定数据库的jdbc驱动jar包的位置--> <classPathEntry location="F:\resource\repository-teacher\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/> <!-- context:用于生成一组对象的环境(至少配置1个,可以配置多个) id:表达唯一的名称 targetRuntime:用于指定生成的代码的运行环境(MyBatis3/MyBatis3Simple) MyBatis3:默认值【生成更完整的功能】 MyBatis3Simple:不会生成与Example(案例)相关的方法 --> <context id="default" targetRuntime="MyBatis3Simple"> <!-- 用于配置如果生成注释信息(最多可以配置一下) suppressAllComments:阻止生成注释 ,默认为false suppressDate:阻止生成的注释 时间戳,默认为false addRemarkComments:注释是否添加数据库表的备注信息,默认为false --> <!-- optional,旨在创建class时,对注释进行控制 --> <commentGenerator> <property name="suppressDate" value="true"/> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--jdbc的数据库连接 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql:///ssm" userId="root" password="1234"> </jdbcConnection> <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制--> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类 targetPackage 指定生成的model生成所在的包名 targetProject 指定在该项目下所在的路径--> <javaModelGenerator targetPackage="generator.domain" targetProject="src/main/java"> <!--<!– 是否允许子包,即targetPackage.schemaName.tableName –> <property name="enableSubPackages" value="false"/> <!– 是否对model添加 构造函数 –> <property name="constructorBased" value="true"/>--> <!-- 是否对类CHAR类型的列的数据进行trim操作 --> <property name="trimStrings" value="true"/> <!-- <!– 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 –> <property name="immutable" value="false"/>--> </javaModelGenerator> <!-- sqlMapGenerator:生成映射文件存放位置(Mapper.xml文件) targetPackage:生成SQL映射文件(XML文件)在哪个包中 targetProject:指定目标项目路径(根目录) --> <!--mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 --> <sqlMapGenerator targetPackage="generator.mapper" targetProject="src/main/resources"> <!-- <property name="enableSubPackages" value="false"/>--> </sqlMapGenerator> <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码 type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口--> <!-- targetPackage:mapper接口dao生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="generator.mapper" targetProject="src/main/java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- table:生成对应表及类名 tableName:对应表名(注:%代表所有) domainObjectName:对应的类名 generatedKey:主键自增的id字段(针对当前 数据库配置MySQL) --> <table tableName="employee" domainObjectName="Employee" > <generatedKey column="id" sqlStatement="MySql"/> </table> <!--<table tableName="mmall_cart" domainObjectName="Cart" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>--> </context> </generatorConfiguration>

2.MyBatis拦截器

2.1自定义拦截器

2.1.1实现接口Interceptor(里面的三个方法)
1.intercept:拦截的核心方法(在这里面实现相应的功能)2.plugin:必需 return Plugin.wrap(o, this); 代表对于签名(在类上面的注解中)的拦截3.setProperties:获取拦截器配置的参数
2.1.2签名
1.type:对应的类(Executor.class,ResultSetHandler.class,ParameterHandler.class,StatementHandler.class) 但是一般只用 Executor.class2.method:type类中的方法名,我们一般只用 Executor.class中的update(增删改)与query(查询)3.args:参数(方法中的参数类型) package generator.intercept; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.plugin.*; import java.util.Properties; import org.apache.ibatis.executor.Executor; @Intercepts( @Signature( type = Executor.class, method = "update", args = {MappedStatement.class,Object.class} ) ) public class HelloIntercept implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { System.out.println("我要开始作死了"); Object proceed = invocation.proceed(); System.out.println("我死了"); return proceed; } /* * 判断当前操作是否拦截,根据当前拦截器上面的Intercepts注释进行判断,如果被拦截,就会执行intercept方法,没有就会放行 * */ @Override public Object plugin(Object o) { return Plugin.wrap(o, this); } @Override public void setProperties(Properties properties) { String dbType = properties.getProperty("dbType"); System.out.println(dbType); } }

2.2拦截器配置

在mybatis-cofing.xml中配置 <plugins> <plugin interceptor="generator.intercept.HelloIntercept"> <property name="dbType" value="MySql"/> </plugin> </plugins>

2.3分页插件

分页就是一个拦截器

2.3.1引入分页插件
<!--mybatis分页--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.0.0</version> </dependency>
2.3.2插件配置

-在mybatis-cofing.xml中配置

<plugins> <!--分页插件--> <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin> </plugins>

11.SSM集成

SpringMVC,Spring,Mybatis

11.1Spring和MyBatis集成(applicationContext.xml)

①.创建与读取jdbc.properties -> ②.配置dataSource -> ③.配置MyBatis的SqlSessionFactory-> ④.配置mapper对象 -> ⑤.service -> ⑥.事务的添加 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> <!--扫描service层--> <context:component-scan base-package="cn.itsource.ssm.service" /> <!--1.引入外部jdbc.properties--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--2.配置dpcp连接池--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--3.jpa中有一个EntityManagerFactoryBean对象 mybatis也有一个SqlSessionFactoryBean对象 --> <bean id="SqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--配置数据源--> <property name="dataSource" ref="dataSource"/> <!--配置别名--> <property name="typeAliasesPackage" value="cn.itsource.ssm.domain"/> <!--扫描mapper.xml--> <property name="mapperLocations" value="classpath:cn/itsource/ssm/mapper/*.xml"/> </bean> <!--4.为EmployeeMapper创建一个实现两种方式--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.itsource.ssm.mapper"/> </bean> <!--5.配置一个事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--6.事务注解支持--> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>

11.2jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///ssm jdbc.username=root jdbc.password=1234

11.3测试(是否集成成功)

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SSMTest { /*@Autowired private DataSource ds;*/ // @Autowired // private EmployeeMapper mapper; @Autowired private IEmployeeService service; @Test public void testFindAll() throws Exception{ service.findAll().forEach(p-> System.out.println(p)); } @Test public void testSSM() throws Exception{ //System.out.println(ds); //mapper.findAll().forEach(p-> System.out.println(p)); Employee employee = new Employee(); employee.setName("扎逼样"); employee.setAge(17); employee.setSex(true); service.save(employee); } }

11.4Spring和SpringMVC

1.applicationContext-MVC.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!--1.扫描controller--> <context:component-scan base-package="cn.itsource.ssm.controller"/> <!--2.静态资源放行--> <mvc:default-servlet-handler/> <!--3.springmvc的注释支持--> <mvc:annotation-driven/> <!--4.视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> <!--5.上传,暂时不要--> <!--<import resource="classpath:applicationContext.xml" />--> </beans> 2.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--配置监听器,启动spring--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--读取spring配置文件--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--配置核心控制器--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--让springmvc随着tomcat运行而启动--> <load-on-startup>1</load-on-startup> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <!-- 符合RESTful风格--> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

最新回复(0)