刚接触mybatis+spring的使用的时候会很蒙,看的懂代码但是不知道写代码的过程是怎样的。
写代码要看个人习惯,以下是我总结的流程:
(图片是我经过svn之后的,忽略图标)
要引的jar包:
工程样式:
1.创建工程后引入jar包,建立一个model包,包内存放实体bean:
package com.qckj.model;
public class Job {
private Integer jobid;
private String jobcontent;
private Integer uid;
public Integer getJobid() {
return jobid;
}
public void setJobid(Integer jobid) {
this.jobid = jobid;
}
public String getJobcontent() {
return jobcontent;
}
public void setJobcontent(String jobcontent) {
this.jobcontent = jobcontent;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
}
2.创建一个mybatis-config.xml文件,在其中配置POJO简写:
<?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>
<!-- 配置POJO简写 -->
<typeAliases>
<package name="com.qckj.model"/>
</typeAliases>
</configuration>
3.创建一个mapper包,在包中创建一个jobmapper接口以及jobmapper.xml文件。
jobmapper接口中放入增删改查的抽象方法:
package com.qckj.mapper;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.qckj.model.Job;
@Repository("jobMapper")
public interface JobMapper {
public List<Map<String,Object>> sel(Map<String,Object> map); //找到funcmapper.xml进行查询
public int ins(Job job);
}
jobmapper.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">
<!-- namespace:包名.接口名 -->
<mapper namespace="com.qckj.mapper.JobMapper">
<sql id="selColumn">jobid,jobcontent,uid</sql>
<sql id="setColumn">(jobcontent,uid)</sql>
<sql id="whereColumn">
<where>
<if test="jobid != null">
jobid = #{jobid}
</if>
<if test="jobcontent != null">
AND jobcontent LIKE CONCAT('%',#{jobcontent},'%')
</if>
<if test="uid != null">
AND uid = #{uid}
</if>
</where>
</sql>
<select id="sel" parameterType="map" resultType="map">
SELECT
<include refid="selColumn"/>
FROM
tab_job
<include refid="whereColumn"/>
</select>
<insert id="ins" parameterType="Job">
INSERT
INTO
tab_job
<include refid="setColumn"/>
VALUES(#{jobcontent},#{uid})
</insert>
</mapper>
4.创建application-context.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- 连接数据库 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- id随便起名字,class的值在spring-jdbc.jar包下 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!-- value的值在spring-jdbc-4.2.6.RELEASE.jar包下 -->
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<!-- 连接数据库的路径 这里我的数据库的名字是mydb -->
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 读取mybatis配置文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- class的值是在mybatis-spring-1.3.0.jar包下 -->
<property name="dataSource" ref="dataSource"/>
<!-- 连接上边的数据库,ref的值=上边bean中id的值 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- value的值中“classpath: ” 是固定格式,后边是之前设置的mybatis-config.xml文件-->
</bean>
<!-- 扫描mapper文件 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- class的值在 mybatis-spring-1.3.0.jar包下-->
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<!-- 连接上边的读取mybatis配置文件的bean的id -->
<property name="basePackage" value="com.qckj.mapper"/>
<!-- 扫描mapper文件,读取增删改查的内容 -->
</bean>
<!-- 创建事物进行提交回滚 -->
<bean id="tranManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- class的值在spring-jdbc-4.2.6.RELEASE.jar包下 -->
<property name="dataSource" ref="dataSource"/>
<!-- 连接“连接数据库”的bean中的id -->
</bean>
<!-- 注解式事务管理 -->
<tx:annotation-driven transaction-manager="tranManager"/>
<!-- 打开注解 -->
<context:annotation-config/>
<!-- 扫描注解 -->
<context:component-scan base-package="com.qckj"/>
</beans>
以下是引用jar包的位置
连接数据库时:<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<bean id="tranManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
5.再建立service包,在其中建立一个service接口以及serviceImp实现service接口的实现类。
service接口中写接收的值+返回的值,和原来一样的是逻辑控制层:
package com.qckj.service;
import java.util.List;
import java.util.Map;
import com.qckj.model.Job;
public interface Services {
public List<Map<String,Object>> selJob(Map<String,Object> map);//接口接收map的传值,返回一个list集合
public int insJob(Job job);
}
serviceImp实现类中内容更多一些,需要通过set注入的方法以及注解的方式连接jobmapper:
package com.qckj.service.imp;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.qckj.mapper.JobMapper;
import com.qckj.model.Job;
import com.qckj.service.Services;
@Service("services")
@Transactional //自动处理事物进行提交和回滚
public class ServiceImp implements Services {
@Autowired
JobMapper jobMapper;//连接了jobmapper的接口
public void setJobMapper(JobMapper jobMapper) {
this.jobMapper = jobMapper; //通过set方法注入
}
public List<Map<String,Object>> selJob(Map<String,Object> map) {
List<Map<String,Object>> datalist = jobMapper.sel(map); //在jobmapper接口中找到sel方法
return datalist;
}
public int insJob(Job job) {
int affectrow = jobMapper.ins(job);
return affectrow;
}
}
6.返回mapper写mapper注解,然后再写service注解(这里是正常应该的步骤 但是上边的代码直接带注解的)
7.创建test,写test相关的注解调用service
package com.qckj.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
import com.qckj.model.Job;
import com.qckj.service.Services;
@RunWith(SpringJUnit4ClassRunner.class) //让测试运行于Spring测试环境
@ContextConfiguration("classpath:application-context.xml")
public class TestMS {
@Autowired
Services services; //连接service接口
public void setServices(Services services) {
this.services = services;
}
@Test //通过set注入的方式进入service进行查询
public void sel() {
Map<String,Object> map = new HashMap<String,Object>();
map.put("jobid", 1);//查询id为1的工作
List<Map<String,Object>> datalist =services.selJob(map); //传参到service中的seljob方法
for (int i = 0; i < datalist.size(); i++) {
Map<String,Object> dataMap = datalist.get(i);
System.out.println(dataMap.get("jobid")
+ "," + dataMap.get("jobcontent")
+ "," + dataMap.get("uid"));
}
}
@Test
public void ins() {
Job job = new Job();
job.setJobcontent("hello1");
job.setUid(2);
int affectrow =services.insJob(job);
assertEquals("插入失败",0, affectrow);
}
}