Mybatis学习记录
Mybatis基础搭建测试:
1、Mapper接口:
package com.zhaojianhui.mybatis.mapper;
import com.zhaojianhui.mybatis.pojo.User;
public interface UserMapper {
User getUserById(String id);
}
2、Mapper.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="com.zhaojianhui.mybatis.mapper.UserMapper">
<select id="getUserById" resultType="com.zhaojianhui.mybatis.pojo.User">
select * from User where id = #{id}
</select>
</mapper>
3、log4j.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
</appender>
<logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis">
<level value="info"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
4、mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"></properties> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <!--创建别名,默认是类名不区分大小写--> <package name="com.zhaojianhui.mybatis.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${db.driver}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
5、jdbc.properties
db.driver=com.mysql.cj.jdbc.Driver db.url=jdbc:mysql://localhost:3306/mybatisstudy?serverTimezone=UTC&characterEncoding=utf8&useSSL=false db.username=root db.password=1314520
6、测试代码:
package com.zhaojianhui.mybatis.test; import com.zhaojianhui.mybatis.mapper.UserMapper; import com.zhaojianhui.mybatis.pojo.User; 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 org.junit.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; public class TestMybatis { public static void main(String[] args) throws IOException { InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserById("2"); System.out.println(user); } }
7、实体类
package com.zhaojianhui.mybatis.pojo; public class User { private Integer id; private String username; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
8、输出结果:

TIPS:调用getMapper()方法时会通过动态代理生成代理类的实现类
Mybatis的基本crud:
1、测试代码
package com.zhaojianhui.mybatis.test; import com.zhaojianhui.mybatis.mapper.EmpMapper; import com.zhaojianhui.mybatis.mapper.UserMapper; import com.zhaojianhui.mybatis.pojo.Emp; import com.zhaojianhui.mybatis.pojo.User; 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 org.junit.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class TestMybatis { public static void main(String[] args) throws IOException { InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); //SqlSession sqlSession = sqlSessionFactory.openSession();//需要手动提交事务 SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务 /* UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserById("2"); System.out.println(user);*/ EmpMapper mapper = sqlSession.getMapper(EmpMapper.class); //mapper.add(new Emp(null, "秦始皇", 28, "男")); //sqlSession.commit(); //List<Emp> all = mapper.getAll(); //System.out.println(all); /* Emp emp = mapper.getEmpById("2"); System.out.println(emp);*/ //mapper.updateById(new Emp(2,"李琪",28,"男")); mapper.deleteById("5"); sqlSession.close(); } }
2、Mapper文件
<?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="com.zhaojianhui.mybatis.mapper.EmpMapper"> <select id="getEmpById" resultType="Emp"> select eid,ename,age,sex from emp where eid=#{eid} </select> <select id="getAll" resultType="Emp"> select eid,ename,age,sex from emp; </select> <insert id="add"> insert into emp values(null,#{ename},#{age},#{sex}) </insert> <update id="updateById"> update emp set ename=#{ename} ,age=#{age} ,sex=#{sex} where eid=#{eid} </update> <delete id="deleteById"> delete from emp where eid=#{eid} </delete> </mapper>
3、mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"></properties> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <!--创建别名,默认是类名不区分大小写--> <package name="com.zhaojianhui.mybatis.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${db.driver}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> <mapper resource="EmpMapper.xml"/> </mappers> </configuration>
4、Mapper接口
package com.zhaojianhui.mybatis.mapper; import com.zhaojianhui.mybatis.pojo.Emp; import java.util.List; public interface EmpMapper { //根据Id查询员工信息 Emp getEmpById(String eid); //获取所有员工信息 List<Emp> getAll(); //添加员工信息 void add(Emp emp); //修改员工信息 void updateById(Emp emp); //删除员工信息 void deleteById(String eid); }
Mybatis配置文件中注册多个mapper可以用<package/>注册,但是此时mapper接口所在包和mapper映射文件所在包得同名,如下图:


也可使用Map集合获取查询信息:
//以map集合获取一个员工信息
Map<String,Object> getMapById(String eid);
//以map集合获取所有员工信息
@MapKey("eid")//设置map的键
Map<String,Object> getAllMap();
<select id="getMapById" resultType="Map">
select eid,ename,age,sex from emp where eid=#{eid}
</select>
<select id="getAllMap" resultType="Map">
select eid,ename,age,sex from emp;
</select>
Mybatis获取参数值的两种方式${}和#{}:
${}:必须使用字符串拼接方式操作SQL语句,类似原生jdbc的statement,不可以防止SQL注入,要注意单引号问题。
#{}:可以使用通配符操作SQL,类似原生jdbc的Preparedstatement,可以防止SQL注入
建议:尽量用#{}.特殊情况如模糊查询和批量删除时用${}
获取主键值:在insert中加入下面两个属性即可

Mybatis获取不同参数值的方式:

多对一自定义映射(以员工和部门为例,一个部门对应多个员工):设置返回的结果集,id里面存放的是主键关系,SQL语句用左外连接或者右外连接。
<resultMap id="empMap" type="Emp">
<id column="eid" property="eid"/>
<result column="ename" property="ename"/>
<result column="age" property="age"/>
<result column="sex" property="sex"></result>
<result column="did" property="dept.did"/>
<result column="dname" property="dept.dname"/>
</resultMap>
<select id="getAllEmps" resultMap="empMap">
select e.eid,e.ename,e.age,e.sex,e.did,d.dname from emp e left join dept d on e.did=d.did
</select>
使用association完成多对一映射:
<resultMap id="empMap" type="Emp">
<id column="eid" property="eid"/>
<result column="ename" property="ename"/>
<result column="age" property="age"/>
<result column="sex" property="sex"></result>
<association property="dept" javaType="Dept">
<id column="did" property="did"/>
<result column="dname" property="dname"/>
</association>
</resultMap>
多对一分步查询示例:
package com.zhaojianhui.mybatis.mapper;
import com.zhaojianhui.mybatis.pojo.Dept;
public interface DeptMapper {
Dept getDeptById(String did);
}
package com.zhaojianhui.mybatis.mapper;
import com.zhaojianhui.mybatis.pojo.Emp;
import java.util.List;
public interface EmpDeptMapper {
List<Emp> getAllEmps();
Emp getEmpStep(String eid);
}
<?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="com.zhaojianhui.mybatis.mapper.DeptMapper">
<select id="getDeptById" resultType="Dept">
select did,dname from dept where did =#{did}
</select>
</mapper>
<resultMap id="empMapStep" type="Emp">
<id column="eid" property="eid"/>
<result column="ename" property="ename"/>
<result column="age" property="age"/>
<result column="sex" property="sex"></result>
<association property="dept" select="com.zhaojianhui.mybatis.mapper.DeptMapper.getDeptById" column="did"></association>
</resultMap>
<select id="getEmpStep" resultMap="empMapStep">
select eid,ename,age,sex,did from emp where eid=#{eid}
</select>
分步查询的延迟加载:
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--是否查询所有数据-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
分步查询的延迟加载控制fetch Type:
<association property="dept" select="com.zhaojianhui.mybatis.mapper.DeptMapper.getDeptById" column="did" fetchType="lazy"></association>
,设置为eager属性时为不延迟加载
动态SQL:
1、if示例:通过test表达式拼接SQL语句

2:where:添加where关键字同时去掉多余的and

3:trim:截取并拼接

常用属性:

4:set:解决修改操作SQL语句中可能多出逗号问题
5:choose:choose里面只有一个条件会被执行,如果所有的when都不符合则执行otherwise
<select id="getByChoose" resultType="Emp">
select eid,ename,age,sex from emp
where
<choose>
<when test="eid!=null">
eid=#{eid}
</when>
<when test="ename!=null and ename!=''">
ename=#{ename}
</when>
<when test="age!=null">
age=#{age}
</when>
<otherwise>
sex=#{sex}
</otherwise>
</choose>
</select>
批量删除
方式一:
//通过eid组成的字符串实现批量删除
void deleteMore(String eids);
String eids = "6,7,8";
mapper.deleteMore(eids);
<delete id="deleteMore">
delete from emp where eid in (${value})
</delete>
方式二:使用foreach实现批量删除
//通过list集合实现批量删除
void deleteByList(List<Integer> eids);
<!--foreach用于对数组或集合遍历,collection指定要遍历的集合或数组,item别名,close设置循环体结束内容,Open设置循环体开始内容
separator设置每一次循环之间的分隔符,index若遍历的是List代表下标,遍历Map则代表键
-->
<delete id="deleteByList">
delete from emp where eid in
(
<foreach collection="list" item="eid" separator=",">
#{eid}
</foreach>)
</delete>
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(9);
mapper.deleteByList(list);
批量操作:

批量添加:
//批量添加
void insertByArray(@Param("emps")Emp[] emps);
<insert id="insertByArray">
insert into emp values
<foreach collection="emps" item="emp" separator=",">
(null,#{emp.ename},#{emp.age},#{emp.sex},1)
</foreach>
</insert>
Emp emps1 = new Emp(null, "沙宣", 29, "女", new Dept(1, "开发部"));
Emp emps2 = new Emp(null, "沙", 29, "女", new Dept(2, "开发部"));
Emp emps3 = new Emp(null, "宣", 29, "女", new Dept(1, "开发部"));
Emp[] emps = {emps1, emps2, emps3};
mapper.insertByArray(emps);
sql标签:

需要的地方引入这个sql片段:

Mybatis缓存:
1、简介
Mybatis有两级缓存,默认只有一级缓存(SqlSession级别的缓存,也称本地缓存开启),二级缓存需要手动开启,它是基于namespace级别的缓存.为了提高拓展性,Mybatis定义了缓存接口cache,我们可以通过实现cache接口来自定义二级缓存。
2、一级缓存的使用
一级缓存对于同一个SqlSession的一个sql语句,执行之后就会存储在缓存中,下次执行相同的sql直接从缓存中取。
3、一级缓存失效的几种情况:
1)不同的sqlsession对应不同的一级缓存
2)同一个sqlsession但是查询条件不同
3)同一sqlsession两次查询期间执行了任意一次增删改操作(会自动清空缓存)
4)手动清空了缓存(调用clearCache方法)
二级缓存(全局作用域缓存
1、实体类需要可序列化
2、在sqlsession关闭或者提交后才会生效
3、使用步骤:
1、mybatis配置文件中开启二级缓存:<setting name="cacheEnabled" value="true"/>
2、需要使用二级缓存的映射文件处使用cache配置缓存:<cache/>
3、pojo实现Serializable接口
4、二级缓存相关属性:

缓存的常用属性:

第三方缓存(以ehcache为例):
1、配置cache标签:<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
2、导入jar包:
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
3、编写ehcache.xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <diskStore path="F:\mybatisStudy\cache"/> <defaultCache maxElementsInMemory="1" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"/> </ehcache>
4、settings中添加约束:

4、cache中引入type:
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
5、编写测试类
逆向工程:
1、mbg.xml配置文件
<?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> <context id="DB2Tables" targetRuntime="MyBatis3"> <!--数据库链接地址账号密码--> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/mybatisstudy?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&nullCatalogMeansCurrent=true" userId="root" password="1314520"> </jdbcConnection> <!--生成JAVABean类存放位置--> <javaModelGenerator targetPackage="com.zhaojianhui.mybatis.model" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!--生成mapper映射文件存放位置--> <sqlMapGenerator targetPackage="com.zhaojianhui.mybatis.mappers" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!--生成Dao类存放位置--> <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码 type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --> <!--mapper接口生成--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.zhaojianhui.mybatis.mappers" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!--生成对应表的实体类名--> <table tableName="emp" domainObjectName="Emp" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> <!-- <generatedKey column="id" sqlStatement="MySql" identity="true"/>--> </table> </context> </generatorConfiguration>
2、pom.xml中添加plugin和依赖:
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>mybatis generator</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<!--允许移动生成的文件-->
<verbose>true</verbose>
<!--允许自动覆盖文件-->
<overwrite>true</overwrite>
<configurationFile>
src/main/resources/mbg.xml
</configurationFile>
</configuration>
</plugin>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
3、run>>edit configurations>>+>>maven


4、command line中输入:mybatis-generator:generate -e
5、右上角选择运行:

6、测试结果:
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
EmpExample example = new EmpExample();
EmpExample.Criteria c1 = example.createCriteria();
c1.andAgeBetween(12, 16);
List<Emp> emps = mapper.selectByExample(example);
for (Emp emp : emps) {
System.out.println(emp);
}
分页插件pageHelper:
1、导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.jsqlparser/jsqlparser -->
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>3.1</version>
</dependency>
2、在mybatis全局配置文件中加入:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
3、测试
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
PageHelper.startPage(4, 1);
List<Emp> all = mapper.getAll();
PageInfo<Emp> pageInfo = new PageInfo<>(all, 5);
System.out.println(Arrays.toString(pageInfo.getNavigatepageNums()));
System.out.println();
for (Emp emp : all) {
System.out.println(emp);
}
模拟分页:
1、分页工具类:
package com.zhaojianhui.mybatis.util; import com.github.pagehelper.PageInfo; import com.zhaojianhui.mybatis.pojo.Emp; import javax.servlet.http.HttpServletRequest; public class PageUtil { public static String getPageInfo(PageInfo<Emp> pageInfo, HttpServletRequest request) { String path = request.getContextPath() + "/"; StringBuilder builder = new StringBuilder(); //拼接首页 builder.append("<a href='" + path + "emps/1'>首页</a>"); builder.append("  "); //拼接上一页 if (pageInfo.isHasPreviousPage()) { builder.append("<a href='" + path + "emps/" + pageInfo.getPrePage() + "'>上一页</a>"); builder.append("  "); } else { builder.append("上一页"); builder.append("  "); } //拼接下一页 if (pageInfo.isHasPreviousPage()) { builder.append("<a href='" + path + "emps/" + pageInfo.getNextPage() + "'>下一页</a>"); builder.append("  "); } else { builder.append("下一页"); builder.append("  "); } //拼接页码 int[] nums = pageInfo.getNavigatepageNums(); for (int i : nums) { if (i == pageInfo.getPageNum()) { builder.append("<a style='color:red;' href='" + path + "emps/" + i + "'>" + i + "</a>"); builder.append("  "); } else { builder.append("<a href='" + path + "emps/" + i + "'>" + i + "</a>"); builder.append("  "); } } //拼接尾页 builder.append("<a href='" + path + "emps/" + pageInfo.getPages() + "'>尾页</a>"); builder.append("  "); return builder.toString(); } }
SSM整合步骤:
1、导入jar
Spring、SpringMVC、mybatis、第三方支持:如log4j、pageHelper、AspectJ、jackson、jstl
2、搭建springmvc
1、web.xml:DispatcherServlet、HiddenHttpMethodFilter、CharacterEncodingFilter
2、spring-servlet.xml:扫描控制层组件、视图解析器、Default Servlet、MVC驱动、可选:MultipartResolver,拦截器
3、整合SpringMVC和Spring
1、web.xml:ContextLoaderListener、context-param
2、applicationContext.xml:扫描组件(排除控制层)、事务管理器
4、搭建Mybatis:核心配置文件、mapper接口和映射文件
5、spring整合Mybatis
applicationContext.xml:properties文件的引入、Datasource数据源的配置、事务管理器、开启事务驱动、SqlSessionFactoryBean:管理SqlSession、MapperScannerConfigurer
6、测试CRUD
配置文件:
1)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" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" 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"> <context:component-scan base-package="com.zhaojianhui"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--引入资源文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--数据源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${db.driver}"></property> <property name="url" value="${db.url}"></property> <property name="username" value="${db.username}"></property> <property name="password" value="${db.password}"></property> </bean> <!--声明事务管理器--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--开启事务注解驱动--> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/> <!--管理mybatis会话对象--> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <!--设置mybatis文件路径--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!--设置别名——--> <property name="typeAliasesPackage" value="com.zhaojianhui.pojo"/> <!--设置数据源--> <property name="dataSource" ref="dataSource"/> <!--设置映射文件路径--> <property name="mapperLocations" value="classpath:com/zhaojianhui/mapper/*Mapper.xml"/> </bean> <!--Mapper接口生成代理实现类--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.zhaojianhui.mapper"></property> </bean> </beans>
2)mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- <!–开启延迟加载–>
<setting name="lazyLoadingEnabled" value="true"/>
<!–是否查询所有数据–>
<setting name="aggressiveLazyLoading" value="false"/>-->
<!--是否开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
</configuration>
3)springMVC-servlet.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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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">
<!--扫描组件,将加上@Controller的类作为控制层-->
<context:component-scan base-package="com.zhaojianhui.controller"></context:component-scan>
<!--配置视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--处理静态资源-->
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<!--配置文件上传-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
<!--异常处理-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.NullPointerException">error</prop>
</props>
</property>
</bean>
</beans>
4)web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--配置核心控制器--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <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> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--默认web-info下applicationContext.xml--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
5)pom.xml
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.jsqlparser/jsqlparser -->
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-spec -->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
6)jdbc.properties
db.driver=com.mysql.cj.jdbc.Driver db.url=jdbc:mysql://localhost:3306/mybatisstudy?serverTimezone=UTC&characterEncoding=utf8&useSSL=false db.username=root db.password=1314520
7)log4j.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
</appender>
<logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis">
<level value="info"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
8)mbg.xml:
<?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> <context id="DB2Tables" targetRuntime="MyBatis3"> <!--数据库链接地址账号密码--> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/mybatisstudy?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&nullCatalogMeansCurrent=true" userId="root" password="1314520"> </jdbcConnection> <!--生成JAVABean类存放位置--> <javaModelGenerator targetPackage="com.zhaojianhui.mybatis.model" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!--生成mapper映射文件存放位置--> <sqlMapGenerator targetPackage="com.zhaojianhui.mybatis.mappers" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!--生成Dao类存放位置--> <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码 type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --> <!--mapper接口生成--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.zhaojianhui.mybatis.mappers" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!--生成对应表的实体类名--> <table tableName="emp" domainObjectName="Emp" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <!-- <generatedKey column="id" sqlStatement="MySql" identity="true"/>--> </table> </context> </generatorConfiguration>

浙公网安备 33010602011771号