实体类的创建:
例如我项目其中的一个:
接口的编写和测试
Dao层的Mapper接口
我们就拿上图的 UserMapper 作为一个例子。
UserMapper 接口:
public interface UserMapper { /** * 注册用户 * @param name 用户名 * @param passWord 密码 * @return 返回是否注册成功,若为1即为成功 */ int register(@Param("name")String name,@Param("passWord")String passWord); /** * 根据用户名和密码来获取User * @param name 用户名 * @param passWord 密码 * @return 用户名 */ String getUserByNameAndPaw(@Param("name")String name,@Param("passWord")String passWord); /** * 根据用户的用户名来获取用户 * @param name 用户名 * @return 用户名 */ String getUserByName(String name); /** * 根据用户名修改密码 * @param name 用户名 * @param passWord 密码 * @return 返回是否修改数据库的行数 */ int updatePassWord(@Param("name")String name,@Param("passWord")String passWord); /** * 保存头像地址到数据库 */ int saveUserImg(@Param("user_name")String name , @Param("userImg")String userImg); }
编写对应的xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xiaobao.dao.UserMapper"> <insert id="register" parameterType="String"> insert into notes.user (user_name,user_password) values (#{name},#{passWord}); </insert> <select id="getUserByNameAndPaw" parameterType="String" resultType="String"> select user_name from notes.user where user_name = #{name} and user_password = #{passWord} </select> <select id="getUserByName" parameterType="String" resultType="String"> select user_name from notes.user where user_name = #{name} </select> <update id="updatePassWord" parameterType="String"> update notes.user set user_password =#{passWord} where user_name =#{name}; </update> <update id="saveUserImg" parameterType="String"> UPDATE notes.user SET userImg = #{userImg} WHERE user_name = #{user_name} </update> </mapper>
Service层的接口
上述中我们编写完毕 Dao 的 Mapper 接口,而 Mapper 层接口就是为了服务 Service 的业务需求。按照我们上述的例子我们可以来看 Service 层的需求编写。
接口:
public interface UserService { /** * 前端传输后端注册信息,返回前端result * @param userName 用户名 * @param passWord 用户密码 * @return 则return Result.error(2,"用户名已存在",null); * 注册成功则return Result.success(null);不需要回传数据。 */ public Result<User> register(String userName,String passWord); /** * 验证登入信息 * @param userName 用户名 * @param passWord 用户密码 * @return 一共返回三个结果 * Result.error(2,"用户名不存在",null); * Result.error(2,"密码错误",null); * Result.success(user.getUsername()); */ public Result<User> login(String userName,String passWord); /** * 更新用户密码 * @param userName 用户名 * @param passWord 用户密码 * @return Result.success(null) */ public Result<User> updatePassWord(String userName,String passWord); public Result<User> saveUserImg(String userImg, String name); }
接口的实现类:
@Autowired private UserMapper userMapper; @Override public Result<User> register(String userName, String passWord) { try { String name = userMapper.getUserByName(userName); if (name == null) {//用户名不存在 userMapper.register(userName, passWord);//注册信息 return Result.success(null); } else {//用户名存在4 return Result.error(2, "用户名已存在", null); } }catch (Exception e){ e.printStackTrace(); return Result.error(2, "出错了请稍后再试!", null); } } @Override public Result<User> login(String userName, String passWord) { try { String nameByName = userMapper.getUserByName(userName); String nameByNameAndPwd = userMapper.getUserByNameAndPaw(userName, passWord); if (nameByName == null) { return Result.error(2, "用户名不存在", null); } else if (nameByNameAndPwd == null) { return Result.error(2, "密码错误", null); } else { return Result.success(nameByName); } } catch (Exception e){ e.printStackTrace(); return Result.error(2, "出错了请稍后再试!", null); } } @Override public Result<User> updatePassWord(String userName, String passWord) { try{ userMapper.updatePassWord(userName,passWord); return Result.success(null); }catch (Exception e){ e.printStackTrace(); return Result.error(2, "出错了请稍后再试!", null); } } @Override public Result<User> saveUserImg(String userImg, String name) { try { userMapper.saveUserImg(name ,userImg); return Result.success(userImg); } catch (Exception e){ e.printStackTrace(); return Result.error(2, "出错了请稍后再试!", null); } } public void setUserMapper(UserMapper userMapper) { try{ this.userMapper = userMapper; }catch (Exception e){ e.printStackTrace(); } }
Spring层的配置文件
Mybatis
整合 Mybatis 则是使用 Spring-dao.xml 来进行一个配置。
扫描数据库的配置文件:
<!--1.关系数据库配置文件 通过Spring配置-->
<!--1.关系数据库配置文件 通过Spring配置--> <context:property-placeholder location="classpath:database.properties"/>
导入数据源:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <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>
绑定Mybatis的配置文件:
SqlSessionFactory需要注入数据源跟mybatis路径,这样mybatis-config.xml配置的内容才能生效
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--绑定Mybatis的配置文件--> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean>
扫描映射器:
配置 dao 接口扫描包,动态的实现了dao接口可以注入到Spring容器中
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--注入sqlSessionFactoryBeanName--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!--要扫描的dao包--> <property name="basePackage" value="com.xiaobao.dao"/> </bean>
功能和mybatis-config中 mappers 是一样的。都是扫描Mapper,用来配置需要加载的 sql 映射配置文件路径的。
<mappers> <package name="com.xiaobao.dao"/> </mappers> >
文件上传配置:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --> <property name="defaultEncoding" value="utf-8"/> <!-- 上传文件大小上限,单位为字节(10485760=10M) --> <property name="maxUploadSize" value="10485760"/> <property name="maxInMemorySize" value="40960"/> </bean>
使用c3p0连接池的完整版:
<context:property-placeholder location="classpath:database.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}"/> <!-- c3p0连接池的私有属性 --> <property name="maxPoolSize" value="30"/> <property name="minPoolSize" value="10"/> <!-- 关闭连接后不自动commit --> <property name="autoCommitOnClose" value="false"/> <!-- 获取连接超时时间 --> <property name="checkoutTimeout" value="10000"/> <!-- 当获取连接失败重试次数 --> <property name="acquireRetryAttempts" value="2"/> </bean> <!--3.sqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--绑定Mybatis的配置文件--> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <!--4.配置dao接口扫描包,动态的实现了dao接口可以注入到Spring容器中--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--注入sqlSessionFactoryBeanName--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!--要扫描的dao包--> <property name="basePackage" value="com.xiaobao.dao"/> </bean> <!--文件上传配置--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --> <property name="defaultEncoding" value="utf-8"/> <!-- 上传文件大小上限,单位为字节(10485760=10M) --> <property name="maxUploadSize" value="10485760"/> <property name="maxInMemorySize" value="40960"/> </bean> </beans>