昨天学习的实现类中,有大部分代码是不用修改的,且重复的比较多,所以对其进行简化,首先在实现文件包(cn.jbit.mybatisdemo.dao.impl)下创建一个文件,该文件之间拷过去就可以了。
MyBatisUtil.java
package cn.jbit.mybatisdemo.dao.impl;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private MyBatisUtil(){
}
private static final String RESOURCE = "mybatis-config.xml";
private static SqlSessionFactory sqlSessionFactory = null;
private static ThreadLocal
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader(RESOURCE);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
sqlSessionFactory = builder.build(reader);
} catch (Exception e1) {
e1.printStackTrace();
throw new ExceptionInInitializerError("加载MyBatis失败,请检测配置文件或数据库");
}
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
public static SqlSession getSession(){
SqlSession session = threadLocal.get();
if (session == null){
session = (sqlSessionFactory !=null) ?sqlSessionFactory.openSession():null;
threadLocal.set(session); // 5
}
return session;
}
public static void closeSession(){
SqlSession session = (SqlSession) threadLocal.get(); // 2
threadLocal.set(null);
if (session !=null){
session.close();
}
}
}
在实现类StuDaoImpl.java中,只需要调用上述代码中的方法即可,简化前后的对比,黄色区域简化成粉色区域部分,代码清爽很多
简化前
@Override
public List
String resource = "mybatis-config.xml";
Reader reader = null;
SqlSessionFactory factory = null;
SqlSession session = null;
List
try {
reader = Resources.getResourceAsReader(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(reader);
session = factory.openSession();
//这句话是重点
list = session.selectList("cn.jbit.mybatisdemo.dao.IStuDao.selectAll");//选到接口文件下的接口selectAll
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
session.close();
}
return list;//返回范式list
}
简化以后
@Override
public List
SqlSession session = MyBatisUtil.getSession();
List
try {
list = session.selectList("cn.jbit.mybatisdemo.dao.IStuDao.selectAll");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
MyBatisUtil.closeSession();
}
return list;
}
映射文件中的resultType是cn.jbit.mybatisdemo.entity.Stu,写多个查询语句的话都要写着个路径比较麻烦,可以在配置文件mybatis-config中对路径进行配置一下,简化后可以不用写那么长的路径
在mybatis-config添加配置语句
简化前
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
简化后
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
如果实体类中的变量名称和数据库中的名称不一致的话,查询结果会为空,在映射文件StuDaoMapper.xml中增加结果映射,可以解决这个问题
在以后的查询语句中,用到的变量名称,就可以在便签里加上resultMap="stuResultMap",只要映射语句中的id一致即可,如:
1.查找一个,查找一个的时候要指明参数的类型,用#号获取参数变量,注意这里对照的是实体类里的变量
2.增添数据,增添数据用到的标签是insert,也需要指明参数的类型,因为要传参数进来,
<insert id="insertStu" parameterType="Stu">
insert into stu(sid,sname,gender) values(#{sid},#{sname},#{sgender})
insert>
第二种增添数据是主键设置成自增模式,插入一条数据之后,还可以获取增加后的主键的值
<insert id="insertStu" parameterType="Stu" useGeneratedKeys="true" keyProperty="sage">
insert into stu(sid,sname,gender) values(#{sid},#{sname},#{sgender})
insert>
3.删除数据,删除数据用到的标签是delete,也需要指明参数类型,因为要传递参数进来
<delete id="deleteSid" parameterType="int">
delete from stu where sid=#{sid}
delete>
4.更改数据,更改数据用到的标签是update,也需要指明参数类型,因为要传递参数进来
<update id="updateStu" parameterType="Stu">
update stu set sname=#{sname},age=#{sage},gender=#{sgender} where sid=#{sid}
update>
5.最后一个是动态查询,动态查询要指明返回值类型,因为要把查询结果返回来给我们,还有指明映射
a.如果没有1=1 且第一个判断是正确的语句就变成select * from stu where and....从而导致错误
b.like是模糊查询,注意用法