前言:先建立Maven,配置好pom.xml文件,将所依赖的包都导入
Dao层开发基本步骤
Dao层的作用:
- 实现对数据库增删改查操作,并将结果封装起来传递给Service层使用
步骤
- 创建schema.sql文件来建立数据库以及表的设计
- 创建jdbc.properties来配置驱动、数据库url、数据库账户及密码
- 建立封装数据的类(实现数据传递给各个层)
- 建立dao层操作的接口,待使用MyBatis来创建对应的配置文件实现这些接口
- 创建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>
<!--使用jdbc的getGeneratekeys获取自增主键值-->
<setting name="useGeneratedKeys" value="true"/>
<!--使用列别名替换列名 默认值为true
select name as title(实体中的属性名是title) form table;
开启后mybatis会自动帮我们把表中name的值赋到对应实体的title属性中-->
<setting name="useColumnLabel" value="true"/>
<!--开启驼峰命名转换Table:create_time到 Entity(createTime)-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
- 为dao层每个接口创建配置文件,实现这些接口的方法(这也是MyBatis的好处,可以分离出SQL语句,在后续的维护中可以更有针对性优化SQL语句)
- 完成Spring与MyBatis在dao层的整合工作:
1.建立spring-dao.xml来配置(占位符完成jdbc.properties的加载、配置数据库链接池(此处使用c3p0)、配置 SqlSessionFactory对象、配置扫描Dao接口包)
2.SqlSessionFactory对象成员变量:数据库链接池(dataSource)、mybatis全局配置文件(configLocation)、实体包(typeAliasesPackage)、每个接口实现的配置文件(mapperLocations)
3.配置MapperScannerConfigurer类实例:成员变量sqlSessionFactory(注意:此处该成员变量名字为sqlSessionFactoryBeanName,以防止提前初始化sqlSessionFactory)、扫描的Dao接口包(basePackage)
<?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"
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"
>
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据库链接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 驱动 -->
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}" />
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<property name="autoCommitOnClose" value="false"/>
<property name="checkoutTimeout" value="1000"/>
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!-- 配置SqilSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="typeAliasesPackage" value="cn.xiaofang.entity"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- 配置扫描Dao接口包,动态实现Dao接口,注入IOC容器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="cn.xiaofang.dao"/>
</bean>
</beans>
Dao层开发中的小问题
- 在建立新表出现 Invalid default value for ‘某一列字段’ 原因
- 使用mybatis为方法接口配置SQL语句不能使用
<=
出现冲突,改用<![CDATA[ <= ]]>
- JAVA不会保留形参名,应该使用
@Param("形参名")
来修饰,否则在 mybatis 的对应配置文件的SQL语句无法识别(#{形参名})
- 在xml配置文件中的
INSERT
语句要用INGORE
忽略主键冲突时的异常 - 在实体中还有实体对象,用mybatis可以将select出来的字段注入到这内部对象的字段中
SELECT
sk,skilled_id,
…,
s.skilled_id “seckill.seckill_id”,
s.name “seckill.name”,
…
FROM success_killed sk INNER JOIN skilled s ON sk.skilled_id = s.skilled
WHERE sk.skilled_id =#{} and …;
Mybatis和Spring整合的好处:
- Mybatis本身简化了开发,可以通过配置文件直接来实现接口,在配置文件中直接用SQL来实现接口的方法,分离了java代码和sql,达到了解耦,在后续开发维护中可以更好的针对SQL语句进行优化更改。
- Spring与MyBatis整合中,不用在spring-dao.xml文件中一个个类接口进行配置,直接扫描对应的包就可以,大大减少了代码量。
- 在扫描dao接口时,动态实现dao接口,配置到IOC容器中,代码端直接获取使用就行(
@Resource
)
好处总结:
- sql写在配置文件中,便于统一管理优化
- 实现sql和程序代码解耦,提高可维护性
- 支持动态SQL语句、支持对象与数据库的ORM字段关系映射
- mybatis自动实现接口,不用手动实现,并且会自动注入IOC容器中不用手动添加
bean