提示:结合之前文章MyBatis基础,在此基础上进行操作。
在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();
-
- }
- }
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实例时,建议使用单例模式。
SqlSession是mybatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。SqlSession对象包含了数据库中所有执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。
每个线程都应该有一个自己的SqlSession实例,并且该实例是不能被共享的。同时,SqlSession实例也是线程不安全的,因此其使用范围最好再一次请求或一个方法中,绝不能将其放在一个类的静态字段、实例字段或任何类型的管理范围(如Servlet的HttpSession)中使用。使用完SqlSession对象之后,要及时地关闭它,通常可以将其放在finally块中关闭,代码入下:
- SqlSession sqlSession = SqlSessionFactory.openSession();
- try{
- //此处执行持久化操作
- }finally{
- sqlSession.close();
- }
- //按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());
- }
- // 添加一个新用户
- 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("插入不成功");
- }
- }
- //修改用户
- 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();
- }
- }
- //按 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();
- }
- }
1)标签不要匹配错
2)resource绑定mapper,需要使用路径
3)程序配置文件必须符合规范
4)NullPointException,没有注册到资源
5)输出的xml文件中存在中文乱码问题!
6)maven资源没有导出问题