resources:

在【jdbc.properties】中配置 Druid 数据库连接池:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
在【spring-mybatis.xml】中完成 spring 和 mybatis 的配置:
加入了Mybatis分页插件 PageHelper
<?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:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 整合mybatis过程 -->
<!-- 1.自动扫描 -->
<context:component-scan base-package="com.ray"/>
<!-- 2.配置数据库相关参数properties属性 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 3.数据库连接池 druid -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" 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}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1"/>
<property name="minIdle" value="1"/>
<property name="maxActive" value="20"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000"/>
<!-- 验证连接有效与否的SQL,不同的数据配置不同 -->
<property name="validationQuery" value="SELECT 1" />
<!-- 如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效 -->
<property name="testWhileIdle" value="true"/>
<!-- 这里建议配置为TRUE,防止取到的连接不可用 -->
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="false"/>
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<!-- 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。 -->
<property name="poolPreparedStatements" value="false"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
<!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->
<property name="defaultAutoCommit" value="true" />
<!-- 合并多个DruidDataSource的监控数据 -->
<property name="useGlobalDataSourceStat" value="true"/>
<!-- 开启Druid的监控统计功能,StatFilter可以和其他的Filter配置使用 -->
<property name="filters" value="stat"/>
<!-- proxyFilters属性配置,通过bean的方式配置 -->
<property name="proxyFilters">
<list>
<ref bean="log-filter"/>
</list>
</property>
</bean>
<!-- proxyFilters配置 -->
<bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4j2Filter">
<!-- 所有连接相关的日志 -->
<property name="connectionLogEnabled" value="false"/>
<!-- 所有Statement相关的日志 -->
<property name="statementLogEnabled" value="false"/>
<!-- 是否显示结果集 -->
<property name="resultSetLogEnabled" value="true"/>
<!-- 是否显示SQL语句 -->
<property name="statementExecutableSqlLogEnable" value="true"/>
</bean>
<!-- 4.spring和Mybatis结合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置Mybatis全局配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 扫描entity包,使用别名 -->
<property name="typeAliasesPackage" value="com.ray.entity"/>
<!-- 扫描sql配置文件mapper -->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
<!-- 配置分页插件 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!-- 这里的几个配置主要演示如何使用,如果不理解,一定要去掉下面的配置 -->
<value>
helperDialect=mysql
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
<!-- 5.配置扫描Dao接口包,实现动态Dao接口,注入到spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 需要扫描的包 -->
<property name="basePackage" value="com.ray.dao"/>
</bean>
</beans>
在【spring-mvc.xml】中完成 Spring MVC 的相关配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- 1.自动扫描该包,使SpringMVC认为包下用了@Controller注解的类是控制器 -->
<context:component-scan base-package="com.ray.controller"/>
<!-- 2.处理请求时返回json字符串的中文乱码问题 -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>
application/json;charset=UTF-8
</value>
</list>
</property>
</bean>
<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>
application/json;charset=UTF-8
</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 3.静态资源访问(不拦截此目录下的东西的访问) -->
<!--<mvc:resources mapping="/js/" location="/js/**"/>-->
<!--<mvc:resources mapping="/css/" location="/css/**"/>-->
<!-- 3.静态资源由WEB服务器默认的Servlet来处理(推荐) -->
<mvc:default-servlet-handler/>
<!-- 4.定义跳转的文件的前后缀,视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
在【spring-service.xml】中完成 Spring 事务的相关配置:
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- 1.配置事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 方法一:
开启注解事务 打开事务驱动
基于注解的方式需要在业务层上添加一个@Transactional的注解。
-->
<!--<tx:annotation-driven transaction-manager="transactionManager"/>-->
<!-- 方法二:
基于AspectJ的XML声明式事务管理
在这种方式下Dao和Service的代码也没有改变
-->
<!--2.配置事务的通知:(事务的增强)-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 定义事物传播特性 -->
<tx:attributes>
<!--
propagation :事务传播行为
isolation :事务的隔离级别
read-only :只读
rollback-for :发生哪些异常回滚
no-rollback-for :发生哪些异常不回滚
timeout :过期信息
-->
<tx:method name="insert" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="select*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 3.配置事务切面,使得上面的事务配置对service接口的所有操作有效 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="pointcut" expression="execution(* com.ray.service.*.*(..))"/>
<!-- 配置切面 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
</beans>
在【mybatis-config.xml】中完成 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>
<!-- 配置全局属性 -->
<settings>
<!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 使用列别名替换列名 默认:true -->
<setting name="useColumnLabel" value="true" />
<!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
在【log4j2.xml】中完成日志输出的相关配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<!--只接受程序中DEBUG级别的日志进行处理-->
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss.SSS}] %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!--处理DEBUG级别的日志,并把该日志放到logs/debug.log文件中-->
<!--打印出DEBUG级别日志,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileDebug" fileName="./logs/debug.log"
filePattern="logs/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="DEBUG"/>
<ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="500 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<!--处理INFO级别的日志,并把该日志放到logs/info.log文件中-->
<RollingFile name="RollingFileInfo" fileName="./logs/info.log"
filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<!--只接受INFO级别的日志,其余的全部拒绝处理-->
<ThresholdFilter level="INFO"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="500 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<!--处理WARN级别的日志,并把该日志放到logs/warn.log文件中-->
<RollingFile name="RollingFileWarn" fileName="./logs/warn.log"
filePattern="logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="WARN"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="500 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<!--处理error级别的日志,并把该日志放到logs/error.log文件中-->
<RollingFile name="RollingFileError" fileName="./logs/error.log"
filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
<ThresholdFilter level="ERROR"/>
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="500 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<!--druid的日志记录追加器-->
<RollingFile name="druidSqlRollingFile" fileName="./logs/druid-sql.log"
filePattern="logs/$${date:yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %L %M - %msg%xEx%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="500 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
</appenders>
<loggers>
<root level="DEBUG">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
<appender-ref ref="RollingFileDebug"/>
</root>
<!--记录druid-sql的记录-->
<logger name="druid.sql.Statement" level="debug" additivity="false">
<appender-ref ref="druidSqlRollingFile"/>
</logger>
<logger name="druid.sql.Statement" level="debug" additivity="false">
<appender-ref ref="druidSqlRollingFile"/>
</logger>
<!--log4j2 自带过滤日志-->
<Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
<Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
<logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
<Logger name="org.crsh.plugin" level="warn" />
<logger name="org.crsh.ssh" level="warn"/>
<Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
<logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
<logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
<logger name="org.thymeleaf" level="warn"/>
</loggers>
</configuration>
以上就完成了 SSM 框架的基本配置:
- 添加进了 SSM 项目所需要的 jar 包
- 配置好了 spring/mybatis/spring MVC 的相关配置信息(自动扫描
包下的带有注解的类)com.ray
- 通过 xml 配置的方式配置好了日志和数据库
实体类设计
实体类仅仅是对数据库中表的一一映射(表中字段名应该和实体类中的名称一一对应),同时可能还需要兼顾对业务能力的支持。
- 在 Packge【com.ray.entity】下创建 Student 类:
package com.ray.entity;
/**
* @author Ray
* @date 2018/6/23 0023
* 表中字段名应该和实体类中的名称一一对应
*/
public class Student {
private int id;
private int stu_id;
private String stu_name;
private int stu_age;
private String stu_major;
public Student() {
}
public Student(int stu_id, String stu_name, int stu_age, String stu_major) {
this.stu_id = stu_id;
this.stu_name = stu_name;
this.stu_age = stu_age;
this.stu_major = stu_major;
}
public Student(int id, int stu_id, String stu_name, int stu_age, String stu_major) {
this.id = id;
this.stu_id = stu_id;
this.stu_name = stu_name;
this.stu_age = stu_age;
this.stu_major = stu_major;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", stu_id=" + stu_id +
", stu_name='" + stu_name + '\'' +
", stu_age=" + stu_age +
", stu_major='" + stu_major + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getStu_id() {
return stu_id;
}
public void setStu_id(int stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public int getStu_age() {
return stu_age;
}
public void setStu_age(int stu_age) {
this.stu_age = stu_age;
}
public String getStu_major() {
return stu_major;
}
public void setStu_major(String stu_major) {
this.stu_major = stu_major;
}
}
- 在 Packge【com.ray.entity】下创建 User类:
package com.ray.entity;
/**
* @author Ray
* @date 2018/6/23 0023
*/
public class User {
private int id;
private String username;
private String password;
public User() {
}
public User(String username) {
this.username = username;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int 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;
}
}
DAO 类的设计
DAO,即 Date Access Object,数据库访问对象,就是对数据库相关操作的封装,让其他地方看不到 JDBC 的代码。
在【com.ray.dao】包下创建【StudentDao】接口:
/**
* @author Ray
* @date 2018/6/23 0023
* 对数据库相关操作的封装
*/
public interface StudentDao {
/**
* 查询所有学生信息
*/
List<Student> selectByStudent();
/**
* 根据编号查询学生信息
*/
Student selectByKey(@Param("id") int id);
/**
* 根据学号查询学生信息
*/
Student selectByStuId(@Param("stu_id") int stu_id);
/**
* 新增学生信息
*/
void insert(Student student);
/**
* 修改学生信息
*/
void update(Student student);
/**
* 删除学生信息
*/
void delete(@Param("id") int id);
}
在【com.ray.dao】包下创建【UserDao】接口:
/**
* @author Ray
* @date 2018/6/23 0023
*/
public interface UserDao {
/**
* 根据用户名查询用户信息
*/
User selectByName(String username);
/**
* 新增用户信息
*/
void insert(User user);
}
然后在【resources/mapper】下创建好对应的映射文件【StudengMapper.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.ray.dao.StudentDao">
<!-- 在resultMap节点中,id表示哪个字段代表这主键,result节点定义了普通的映射关系,
这里的property表示JavaBean中的属性名称,column表示数据库中的字段名称-->
<resultMap id="BaseResultMap" type="com.ray.entity.Student">
<id property="id" column="id"/>
<result property="stu_id" column="stu_id"/>
<result property="stu_name" column="stu_name"/>
<result property="stu_age" column="stu_age"/>
<result property="stu_major" column="stu_major"/>
</resultMap>
<!-- <sql>用来封装SQL语句 -->
<sql id="Base_Column_List">
id,stu_id,stu_name,stu_age,stu_major
</sql>
<!-- 查询所有学生信息 resultMap则是对外部ResultMap的引用-->
<select id="selectByStudent" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM
student
</select>
<!-- 根据编号查询学生信息 -->
<select id="selectByKey" resultMap="BaseResultMap" parameterType="com.ray.entity.Student">
SELECT
<include refid="Base_Column_List"/>
FROM
student
WHERE
id = #{id}
</select>
<!-- 根据学号查询学生信息 -->
<select id="selectByStuId" resultMap="BaseResultMap" parameterType="com.ray.entity.Student">
SELECT
<include refid="Base_Column_List"/>
FROM
student
WHERE
stu_id = #{stu_id}
</select>
<!-- 新增学生信息 parameterType为输入参数 -->
<!-- (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段) -->
<insert id="insert" parameterType="com.ray.entity.Student" useGeneratedKeys="true" keyProperty="id">
INSERT INTO
student
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="stu_id != null">
stu_id,
</if>
<if test="stu_name != null">
stu_name,
</if>
<if test="stu_age != null">
stu_age,
</if>
<if test="stu_major != null">
stu_major,
</if>
</trim>
<trim prefix="VALUES(" suffix=")" suffixOverrides=",">
<if test="stu_id != null">
#{stu_id},
</if>
<if test="stu_name != null">
#{stu_name},
</if>
<if test="stu_age != null">
#{stu_age},
</if>
<if test="stu_major != null">
#{stu_major},
</if>
</trim>
</insert>
<!-- 修改学生信息 parameterType为输入参数 -->
<update id="update" parameterType="com.ray.entity.Student">
UPDATE
student
<set>
<if test="stu_id != null">
stu_id = #{stu_id},
</if>
<if test="stu_name != null">
stu_name = #{stu_name},
</if>
<if test="stu_age != null">
stu_age = #{stu_age},
</if>
<if test="stu_major != null">
stu_major = #{stu_major},
</if>
</set>
WHERE
id = #{id}
</update>
<!-- 删除学生信息 parameterType为输入参数 -->
<delete id="delete" parameterType="int">
DELETE FROM
student
WHERE
id = #{id}
</delete>
</mapper>
然后在【resources/mapper】下创建好对应的映射文件【UserMapper.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.ray.dao.UserDao">
<!-- 在resultMap节点中,id表示哪个字段代表这主键,result节点定义了普通的映射关系,
这里的property表示JavaBean中的属性名称,column表示数据库中的字段名称 -->
<resultMap id="BaseResultMap" type="com.ray.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</resultMap>
<!-- <sql>用来封装SQL语句 -->
<sql id="Base_Column_List">
id,username,password
</sql>
<!-- 根据用户名查询用户信息 -->
<select id="selectByName" resultMap="BaseResultMap" parameterType="java.lang.String">
SELECT
<include refid="Base_Column_List"/>
FROM
user
WHERE
username = #{username}
</select>
<!-- 新增用户信息 -->
<insert id="insert" parameterType="com.ray.entity.User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO
user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username != null">
username,
</if>
<if test="password != null">
password,
</if>
</trim>
<trim prefix="VALUES(" suffix=")" suffixOverrides=",">
<if test="username != null">
#{username},
</if>
<if test="password != null">
#{password},
</if>
</trim>
</insert>
</mapper>
编写好了 Dao 类是需要测试的, 这里就略过了..