提示:结合之前文章MyBatis基础,在此基础上进行操作。
1 封装工具类
在src下main的java目录下建实体类:yj.com.units.MyBatisUtils
package yj.com.units;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisUtils {
static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
2.SqlSessionFactory
SqlSessionFactory是mybatos框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder则可以通过xml配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例:
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//根据配置文件构建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory对象是线程安全的,他一旦被创建,在整个应用执行期间都会存在。如果我们多次地创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。为了解决此问题,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单例模式。
3. SqlSession
SqlSession是mybatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。SqlSession对象包含了数据库中所有执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。
每个线程都应该有一个自己的SqlSession实例,并且该实例是不能被共享的。同时,SqlSession实例也是线程不安全的,因此其使用范围最好再一次请求或一个方法中,绝不能将其放在一个类的静态字段、实例字段或任何类型的管理范围(如Servlet的HttpSession)中使用。使用完SqlSession对象之后,要及时地关闭它,通常可以将其放在finally块中关闭,代码入下:
SqlSession sqlSession = SqlSessionFactory.openSession();
try{
//此处执行持久化操作
}finally{
sqlSession.close();
}
4.根据id查找
//按id号查找
public User findbyId(int id);
<!--查找-->
<select id="findbyid" parameterType="int" resultType="yj.com.pojo.User">
select * from xsgl.user where id=#{id}
</select>
//查询
@Test
public void findbyid(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findbyid(1002);
System.out.println(user.toString());
}
5.添加
// 添加一个新用户
public int addUser(User user);
<!-- 添加 -->
<insert id="addUser" parameterType="yj.com.pojo.User">
insert into xsgl.user(id,name,pwd,age) values (#{id},#{name},#{pwd},#{age})
</insert>
//添加
@Test
public void addUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(12323,"叶凡","123456",20);
int i = mapper.addUser(user);
if (i>=0){
sqlSession.commit();
System.out.println("插入成功");
}else{
sqlSession.rollback();
System.out.println("插入不成功");
}
}
6.修改
//修改用户
public int updateUser(User user);
<!-- 修改-->
<update id="updateUser" parameterType="yj.com.pojo.User">
update user set id=#{id},name=#{name},pwd=#{pwd},age=#{age} where id=#{id};
</update>
//修改
@Test
public void updateUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.updateUser(new User(12323,"萧炎","12323",22));
if (i>=1){
System.out.println("修改成功");
sqlSession.commit();
}else {
System.out.println("修改不成功");
sqlSession.rollback();
}
}
7.删除
//按 id号删除
public int delete(int id);
<!--删除-->
<delete id="delete" parameterType="int">
delete from xsgl.user where id=#{id}
//删除
@Test
public void delUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.delete(12323);
if (i>=1){
System.out.println("删除成功");
sqlSession.commit();
}else {
System.out.println("删除不成功");
sqlSession.rollback();
}
}
8.分析错误
1)标签不要匹配错
2)resource绑定mapper,需要使用路径
3)程序配置文件必须符合规范
4)NullPointException,没有注册到资源
5)输出的xml文件中存在中文乱码问题!
6)maven资源没有导出问题