整合mybatis 核心 : 就是将SqlSessionFactory纳入spring的IOC容器中,是由SqlSessionFactoryBean中的getobjoce方法
在resources中配置xml文件
<!-- 整合mybatis, 其核心就是将SqlSessionFactory纳入spring的IOC容器 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据源, 引用上面配置数据源的bean的id --> <property name="dataSource" ref="dataSource"/> <!-- 指定实体的别名--> <property name="typeAliasesPackage" value="edu.nf.ch02.entity"/> <!-- 指定mapper映射文件的目录--> <property name="mapperLocations" value="classpath:mapper/*.xml"/> <!-- 配置文件插件--> <property name="plugins"> <!-- 装配分页的拦截器 --> <bean class="com.github.pagehelper.PageInterceptor"> <!-- 注入分页属性 --> <property name="properties"> <props> <!-- 数据库方言 --> <prop key="helperDialect">mysql</prop> <!-- 启用分页注解支持--> <prop key="supportMethodsArguments">true</prop> <!-- 分页合理化--> <prop key="reasonable">true</prop> </props> </property> </bean> </property> </bean> <!-- 3. 扫描dao的接口包。这样会利用动态代理的机制在运行时创建所有到、接口的实现类 --> <mybatis:scan base-package="edu.nf.ch02.dao"/> </beans>
案例:
创建一个实体类
@Data @AllArgsConstructor @NoArgsConstructor public class City { private Integer cityId; private String cityName; private String cityCode; private String province; }
dao层
public interface CityDao { /** * 查询城市信息 * @param cityName * @return */ City getCityByName(String cityName); /** * 查询城市列表 * @param pageNum * @param pageSize * @return */ List<City> listCity(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize); }
配置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="edu.nf.ch02.dao.CityDao"> <!--编写插入语句,id属性指dao接口的方法名 如果在mysql配置文件中指定了别名,可以在这里进行引用,否则就必须指定实体的完整类名 SQL语句中的参数使用ognl表达式#(属性名)来获取实体中的属性值 --> <!-- void saveUser(User user); --> <resultMap id="cityMap" type="City"> <id property="cityID" column="city_id"/> <result property="cityCode" column="country"/> <result property="cityName" column="city_name"/> <result property="province" column="province" /> </resultMap> <select id="getCityByName" resultMap="cityMap"> select city_id,country,province,city_name from city_info where city_name=#{cityName} </select> <select id="listCity" resultMap="cityMap"> select city_id,country,province,city_name from city_info </select> </mapper>
service层
public interface CityService { /** * 查询城市信息 * @param name * @return */ City getCityByName(String name); /** * 查询城市列表 * @param pageNum * @param pageSize * @return */ PageInfo<City> listCity(int pageNum, int pageSize); }
配置resource中的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:mybatis="http://mybatis.org/schema/mybatis-spring" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd"> <!--1 启用包扫描注解 --> <context:component-scan base-package="edu.nf.ch02"/> <!-- 整合druid连接池,其实也就是druid的数据源纳入spring的IOC容器中 init - method指定数据源的初始化方法destroy-method指定数据源的close方法 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!--注入数据库连接属性 --> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/citydb?useSSI=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="sb"/> <!-- 注入连接池配置属性 --> <!-- 最大连接池数量 --> <property name="maxActive" value="20"/> <!-- 初始化连接池创建的连接个数 --> <property name="initialSize" value="5"/> <!-- 最小连接池数量,建议和初始化大小一致 --> <property name="minIdle" value="5"/> <!-- 获取连接最大等待时间,超时则抛异常 单位:毫秒 --> <property name="maxWait" value="2000"/> <!-- 连接保持空闲而不被驱逐出连接池 单位 : 毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000"/> <!-- 销毁连接的线程检测的间隔时间,单位: 毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 检测连接是否有效 --> <property name="testWhileIdle" value="true"/> <!-- 必须设置为true,才会触发检测 --> <property name="testOnBorrow" value="true"/> <!-- 归还连接池的时候,检测是否有效 --> <property name="testOnReturn" value="true"/> <!-- 是否缓存PreparedStatement,mysql建议关闭 --> <property name="poolPreparedStatements" value="false"/> <!-- 定义一条伪sql,用于检查连接的可用性 --> <property name="validationQuery" value="select 1"/> </bean> <!--2 整合mybatis 核心: 将SqlSessionFactory纳入spring的IOC容器--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据源,引用上面配置源属性 --> <property name="dataSource" ref="dataSource"/> <!-- 指定实体的别名 --> <property name="typeAliasesPackage" value="edu.nf.ch02.entity"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> <!-- 配置文件插件 --> <property name="plugins"> <bean class="com.github.pagehelper.PageInterceptor"> <!-- 注入分页属性 --> <property name="properties"> <props> <!-- 数据库方言 --> <prop key="helperDialect">mysql</prop> <!-- 启用分页注解支持 --> <prop key="supportMethodsArguments">true</prop> <!-- 分页合理化 --> <prop key="reasonable">true</prop> </props> </property> </bean> </property> </bean> <!-- 3 扫描dao接口包,这样会利用动态代理的机制在程序运行时创建所有dao接口的实现类 --> <mybatis:scan base-package="edu.nf.ch02.dao"/> </beans>
service中的impl
@RequiredArgsConstructor 注解作用是将一个无构造参数的值 在target包中自动创建一个构造方法,并不会显示在源代码中,只会显示在target中
@Service /** * 当我们的参数没有构造方法时,此时. * @RequiredArgsConstructor注解会自动帮我们创建一个构造参数 */@RequiredArgsConstructor public class CityServiceImpl implements CityService { private final CityDao cityDao; @Override public City getCityByName(String name) { return cityDao.getCityByName(name); } @Override public PageInfo<City> listCity(int pageNum, int pageSize) { List<City> list = cityDao.listCity(pageNum, pageSize); PageInfo<City> pageInfo = new PageInfo<>(list); return pageInfo; } }
测试层的daima:
@Slf4j public class Te { @Test public void se(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); CityDao bean = context.getBean(CityDao.class); City c = bean.getCityByName("珠海"); log.debug(c.toString()); log.debug(c.getCityCode()); log.debug(c.getCityName()); log.debug(c.getProvince()); } @Test public void sa(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); CityDao bean = applicationContext.getBean(CityDao.class); bean.listCity(1,5).forEach(city -> log.debug(city.getCityName())); } }
运行成功视图
测试1
测试2