基本的DAO的开发方式,就是指的传统的开发dao接口和dao实现类的方式,
下来我代领大家一步步的实现一次。
1.创建项目
2.为符合maven格式,添加config和test代码包以及lib文件夹
完成后的目录结构为:
3.导入如下jar文件:
asm-3.3.1.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
javassist-3.17.1-GA.jar
junit-4.9.jar
log4j-1.2.17.jar
log4j-api-2.0-rc1.jar
log4j-core-2.0-rc1.jar
mybatis-3.2.7.jar
mysql-connector-java-5.1.7-bin.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
4.添加pojo类
package com.cm.mybatis.pojo;
public class ClassInfo {
private int classid;
private String classname;
private String classlocation;
private String memo;
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public String getClasslocation() {
return classlocation;
}
public void setClasslocation(String classlocation) {
this.classlocation = classlocation;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
@Override
public String toString() {
return "ClassInfo [classid=" + classid + ", classname=" + classname + ", classlocation=" + classlocation
+ ", memo=" + memo + "]";
}
}
4.在config中添加SqlMapConfig.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>
<environments default="defaultEnvironment">
<environment id="defaultEnvironment">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/course_mybatis?useUnicode=true&characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
5.添加接口
package com.cm.mybatis.dao;
import java.util.List;
import com.cm.mybatis.pojo.ClassInfo;
public interface ClassInfoDao {
ClassInfo findClassInfoById(int classid);
List<ClassInfo> findClassInfosByName(String classname);
void insertClassInfo(ClassInfo info);
}
6.添加实现类
package com.cm.mybatis.dao.impl;
import java.util.List;
import com.cm.mybatis.dao.ClassInfoDao;
import com.cm.mybatis.pojo.ClassInfo;
public class ClassInfoDaoImpl implements ClassInfoDao {
@Override
public ClassInfo findClassInfoById(int classid) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<ClassInfo> findClassInfosByName(String classname) {
// TODO Auto-generated method stub
return null;
}
@Override
public void insertClassInfo(ClassInfo info) {
// TODO Auto-generated method stub
}
}
7.添加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="com.cm.mybatis.ClassInfo"> <select id="findClassInfoById" parameterType="int" resultType="com.cm.mybatis.pojo.ClassInfo"> SELECT * from class_info where classid=#{id} </select> <select id="findClassInfosByName" parameterType="java.lang.String" resultType="com.cm.mybatis.pojo.ClassInfo"> SELECT * from class_info where classname LIKE '%${value}%' </select> <insert id="insertClassInfo" parameterType="com.cm.mybatis.pojo.ClassInfo"> <selectKey keyProperty="classid" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO class_info(classname,classlocation,memo) VALUES(#{classname},#{classlocation},#{memo}) </insert> </mapper>
8.将mapper文件添加到全局配置文件中
9.完成实现类
package com.cm.mybatis.dao.impl; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import com.cm.mybatis.dao.ClassInfoDao; import com.cm.mybatis.pojo.ClassInfo; public class ClassInfoDaoImpl implements ClassInfoDao { private SqlSessionFactory sqlSessionFactory; public ClassInfoDaoImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Override public ClassInfo findClassInfoById(int classid) { SqlSession sqlSession = sqlSessionFactory.openSession(); ClassInfo info = sqlSession.selectOne("com.cm.mybatis.ClassInfo.findClassInfoById", classid); sqlSession.close(); return info; } @Override public List<ClassInfo> findClassInfosByName(String classname) { SqlSession sqlSession = sqlSessionFactory.openSession(); List<ClassInfo> infos = sqlSession.selectOne("com.cm.mybatis.ClassInfo.findClassInfosByName", classname); sqlSession.close(); return infos; } @Override public void insertClassInfo(ClassInfo info) { SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.selectOne("com.cm.mybatis.ClassInfo.insertClassInfo", info);
10.编写测试类sqlSession.commit(); sqlSession.close(); } }
package com.cm.mybaits.test; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; import java.util.Random; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import com.cm.mybatis.dao.impl.ClassInfoDaoImpl; import com.cm.mybatis.pojo.ClassInfo; public class ClassInfoTest { private SqlSessionFactory sqlSessionFactory; @Before public void beforeLoad() throws IOException { // 全局配置文件的文件名 String resource = "SqlMapConfig.xml"; // 将全局配置文件加载到Stream中 InputStream is = Resources.getResourceAsStream(resource); // 根据全局配置文件创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); } @Test public void findClassInfoById(){ ClassInfoDaoImpl impl=new ClassInfoDaoImpl(sqlSessionFactory); ClassInfo info=impl.findClassInfoById(1); System.out.println(info); } @Test public void findClassInfosByName(){ ClassInfoDaoImpl impl=new ClassInfoDaoImpl(sqlSessionFactory); List<ClassInfo> infos=impl.findClassInfosByName("2002"); } @Test public void insertClassInfo(){ ClassInfoDaoImpl impl=new ClassInfoDaoImpl(sqlSessionFactory); ClassInfo info=createClassInfo(); impl.insertClassInfo(info); System.out.println(info.getClassid()); } private ClassInfo createClassInfo(){ ClassInfo info=new ClassInfo(); info.setClasslocation("咱家的事情"+new Random().nextInt()); info.setClassname("新班级名称"+new Date()); info.setMemo(new Random().toString()); return info; } }
11.代码写完了,哥们不知道能不能运行起来,测试一把,有问题我们逐个修复吧!不赖哦,第一个直接测试通过
第二个测试失败,看下原因
太多结果异常,使用单个执行结果进行了集合查询将集合结果
使用了错误的sqlsession方法
定位到代码,对于一个集合的结果,使用了selectone,复制代码时候要注意修改啊,教训啊
修改后的结果
执行结果
这里忘记写打印执行结果的代码了,顺手补上。
执行结果
测试第三个方法
数据库结果
可能有细心的朋友发现打印出来的classid是0,这是因为什么呢。
1.还是selectone
2.结果没有返回
修改三个地方
1)、接口方法中提供对应的返回值
2)、实现类中做对应的修改
3)、测试方法也要做对应修改
再次执行,已经获取到了新增数据的ID
总算完成了,有以下疑问
1.这种方式的代码量大不大?
大,的确大,这就是传统的开发方式,完全没有体现出来mybatis的优势啊,同时还有大量的模板代码。
下一节我们就想办法简化他
最后我们贴下对应的代码结构: