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>