• Dao层


    Dao实现类用xml配置代理,Dao与xml放在同一包下,文件名、namespace、id要一一对应。

    service接口与实现类为委托类,仅写业务代码,在main中用动态代理来处理事务等。

    当需要在service中增加一个方法时,依次添加service接口-->service实现类-->Dao接口-->xml

    //PetDao.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"> <mapper namespace="com.WebTest01.dao.PetDao"> <select id="getByName" parameterType="java.lang.String" resultType="com.WebTest01.domain.Pet"> select * from pet where name = #{name} </select> <select id="getAll" resultType="com.WebTest01.domain.Pet"> select * from pet </select> <insert id="insertPet"> insert into pet(name,age,owner) values(#{name},#{age},#{owner}) </insert> <update id="updatePet"> update pet set name = #{name}, owner = #{owner} where age = #{age} </update> <delete id="deletePet"> delete from pet where age = #{age} </delete> </mapper>
    //PetDao.java
    
    package com.WebTest01.dao;
    
    import com.WebTest01.domain.Pet;
    
    import java.util.List;
    
    public interface PetDao {
    
        public Pet getByName(String name);
    
        public List<Pet> getAll();
    
        public void insertPet(Pet pet);
    
        public void updatePet(Pet pet);
    
        public void deletePet(Pet pet);
    
    }
    //PetService.java
    
    package com.WebTest01.service;
    
    import com.WebTest01.domain.Pet;
    
    import java.util.List;
    
    public interface PetService {
    
        public Pet getByName(String name);
    
        public List<Pet> getAll();
    
        public void insertPet(Pet pet);
    
        public void updatePet(Pet pet);
    
        public void deletePet(Pet pet);
    
    }
    //PetServiceImpl.java
    
    package com.WebTest01.service.Impl;
    
    import com.WebTest01.dao.PetDao;
    import com.WebTest01.domain.Pet;
    import com.WebTest01.service.PetService;
    import com.WebTest01.util.SqlSessionUtil;
    
    import java.util.List;
    
    public class PetServiceImpl implements PetService {
        //mybatis动态代理创建PetDao实现类
        private PetDao petDao = SqlSessionUtil.getSession().getMapper(PetDao.class);
    
        @Override
        public Pet getByName(String name) {
            return petDao.getByName(name);
        }
    
        @Override
        public List<Pet> getAll() {
            return petDao.getAll();
        }
    
        @Override
        public void insertPet(Pet pet) {
            petDao.insertPet(pet);
        }
    
        @Override
        public void updatePet(Pet pet) {
            petDao.updatePet(pet);
        }
    
        @Override
        public void deletePet(Pet pet) {
            petDao.deletePet(pet);
        }
    }
    //Test
    
    package com.WebTest01.test;
    
    import com.WebTest01.domain.Pet;
    import com.WebTest01.service.Impl.PetServiceImpl;
    import com.WebTest01.service.PetService;
    import com.WebTest01.util.ServiceFactory;
    
    public class Test01 {
        public static void main(String[] args) {
            PetService petService = (PetService) ServiceFactory.getService(new PetServiceImpl());
            Pet pet = new Pet("ttt", "S", 9999);
            petService.deletePet(pet);
        }
    }
    //ServiceFactory.java
    
    package com.WebTest01.util;
    
    public class ServiceFactory {
        //创建代理service对象
        public static Object getService(Object service){
            return new TransactionInvocationHandler(service).getProxy();
        }
    
    }
    //SqlSessionUtil.java
    package com.WebTest01.util;

    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;

    import java.io.IOException;
    import java.io.InputStream;

    public class SqlSessionUtil {

    private SqlSessionUtil(){}

    private static SqlSessionFactory sqlSessionFactory = null;

    static {
    String resource = "mybatis-config.xml";
    InputStream inputStream = null;
    try {
    inputStream = Resources.getResourceAsStream(resource);
    } catch (IOException e) {
    e.printStackTrace();
    }
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    private static ThreadLocal<SqlSession> t = new ThreadLocal<>();

    public static SqlSession getSession(){
    SqlSession sqlSession = t.get();
    if(sqlSession==null){
    sqlSession = sqlSessionFactory.openSession();
    t.set(sqlSession);
    }
    return sqlSession;
    }

    public static void closeSession(SqlSession sqlSession){
    if(sqlSession!=null){
    sqlSession.close();
    t.remove();
    }
    }


    }
     
    //TransactionInvocationHandler.java
    
    package com.WebTest01.util;
    
    import org.apache.ibatis.session.SqlSession;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class TransactionInvocationHandler implements InvocationHandler {
    
        private Object target;
    
        public TransactionInvocationHandler(Object target){
            this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //return值
            Object obj = null;
            SqlSession  session = null;
    
            try {
                session = SqlSessionUtil.getSession();
                obj = method.invoke(target, args);
                session.commit();
            } catch (Exception e) {
                if (session != null) {
                    session.rollback();
                }
                e.printStackTrace();
            } finally {
                SqlSessionUtil.closeSession(session);
            }
            return obj;
        }
    
        public Object getProxy(){
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), this);
        }
    
    }
  • 相关阅读:
    查询多列数据时用这种方法查询
    当只需要查找一列数据的时候 用这种方法减少数据库的访问
    将从数据表中获得的枚举变量名称或者是控件名变成要使用的枚举变量
    枚举变量用法
    查询数据表行数 然后循环查找表 添加数据到ITEMS
    tbType和TypeList操作
    c#中动态创建textbox并且从数据库中获取表中数据添加到textbox中
    OpenCV
    lambda表达式
    技术术语
  • 原文地址:https://www.cnblogs.com/faded828x/p/13328621.html
Copyright © 2020-2023  润新知