zoukankan      html  css  js  c++  java
  • 使用Mapper.xml和Mapper接口开发

    编写工具类获取sqlsession

    使用Mybatis的API来创建一个工具类,通过mybatis配置文件与数据库的信息,得到Connection对象

    public class MybatisUtil {
        private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
        private static SqlSessionFactory sqlSessionFactory;
    
        //加载配置文件 mybatis.xml
        static {
            try {
                Reader reader = Resources.getResourceAsReader("mybatis.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    
        //禁止外界通过new创建
        private MybatisUtil() {}
    
        //获取 SqlSession
        public static SqlSession getSqlSession() {
            //从当前线程中获取 SqlSession 对象
            SqlSession sqlSession = threadLocal.get();
            // 如果获取的SqlSession为空,则从已初始化的sqlSessionFactory中获取
            if (sqlSession == null) {
                sqlSession=sqlSessionFactory.openSession();
                //将SqlSession对象与当前线程绑定
                threadLocal.set(sqlSession);
            }
            return sqlSession;
        }
    
        //关闭 SqlSession,并解除与当前线程绑定
        public static void closeSqlSession(){
            //从当前线程获取 SqlSession 对象
            SqlSession sqlSession=threadLocal.get();
            // 如果获取到的 SqlSession不为空,则关闭,并解除与当前线程的绑定,让GC尽早回收
            if(sqlSession!=null){
                sqlSession.close();
                threadLocal.remove();
            }
        }
       
    }

    创建实体类POJO

    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    public class Cities {
        private int id;
        private String city;
        private String province;
        private String country;
    }

    编写Mapper接口(DAO)

    public interface CitiesMapper {
        void insert(Cities cities) throws Exception;
        Cities selectById(int id) throws Exception;
    }

    Mybatis配置文件

    数据库属性文件

    resources下创建数据库属性文件db.properties,配置数据库的地址及账号密码

    mysql.driver = com.mysql.jdbc.Driver
    mysql.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
    mysql.usercity = root
    mysql.password = 123456

    mybatis配置文件

    resources下创建mybatis的配置文件mybatis.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>
    
        <!-- 加载类路径下的属性文件 -->
        <properties resource="db.properties"/>
    
        <!-- 设置一个默认的连接环境信息 -->
        <environments default="mysql_dev">
    
            <!-- 连接环境信息,设置一个任意唯一的id -->
            <environment id="mysql_dev">
                <!-- mybatis使用jdbc事务管理方式 -->
                <transactionManager type="jdbc"/>
                <!-- mybatis使用连接池方式获取连接 -->
                <dataSource type="pooled">
                    <!-- 配置连接数据库的4个必要属性,从db.properties中获取 -->
                    <property city="driver" value="${mysql.driver}"/>
                    <property city="url" value="${mysql.url}"/>
                    <property city="usercity" value="${mysql.usercity}"/>
                    <property city="password" value="${mysql.password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!-- 关联 实体类与表的映射文件,resource为映射文件全路径名称 -->
        <mappers>
            <mapper resource="mappers/CitiesMapper.xml"/>
        </mappers>
    
    </configuration>

    实体与表的映射文件Mapper.xml

    resources下创建一个文件夹mappers(所有映射文件统一管理),在mappers下创建实体与表的映射关系文件CitiesMapper.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">
    
    <!-- cityspace是命名空间,为Mapper接口的全限定名-->
    <mapper cityspace="mybatis_test.CitiesMapper">
        <!-- resultMap标签:映射实体类与表
             type属性:表示实体类全路径名
             id属性:为实体类与表的映射取一个任意且唯一的名字
        -->
        <resultMap id="citiesMap" type="mybatis_test.Cities">
            <!-- id标签:映射表的主键
             result标签:映射表的非主键字段
             property:实体类的属性名
             column:表的字段名
            -->
            <id column="id" property="id"/>
            <result column="city" property="city"/>
            <result column="province" property="province"/>
            <result column="country" property="country"/>
        </resultMap>
        <!-- 在mybatis中使用 #{} 作为占位符,#{} 实际就是调用的get()
             parameterType为DAO层(Mapper接口)的方法指定传入参数类型,为实体类全路径
        -->
        <insert id="insert" parameterType="mybatis_test.Cities">
            insert into cities values(#{id},#{city},#{province},#{country});
        </insert>
    </mapper>

    通过Mapper接口执行Sql

    Mybatis中的事务是默认开启的,因此我们在完成操作以后,需要我们手动去提交事务!

    public class CitiesTest {
        @Test
        public void testInsert(){
            Cities cities=new Cities(2,"mianyang","chengdu","cn");
            //得到连接对象
            SqlSession sqlSession= MybatisUtil.getSqlSession();
            //传入 Mapper接口类,获取Mapper接口的代理对象
            CitiesMapper citiesMapper=sqlSession.getMapper(CitiesMapper.class);
            try {
                //执行Mapper接口的方法,实际为调用xml映射文件对应的sql(Mapper.xml的命令空间.SQL执行动作的id 调用对应的映射文件中的SQL)
    (实际为调用sqlSession.insert())
    citiesMapper.insert(cities); //Mybatis中的事务默认开启,需要手动commit sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); //出现异常回滚 sqlSession.rollback(); }finally { //关闭sqlSession MybatisUtil.closeSqlSession(); } } }

    文件结构

     

    • 实体类POJO Cities和 Mapper接口类(DAO) CitiesMapper 在同一包下

    • 数据库配置文件db.properties和mybatis配置文件mybatis.xml都放在resources下

  • 相关阅读:
    BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)
    牛客练习赛1 A
    2018年全国多校算法寒假训练营练习比赛(第一场)J
    2018年全国多校算法寒假训练营练习比赛(第一场)C
    2018年全国多校算法寒假训练营练习比赛(第一场)D
    2018年全国多校算法寒假训练营练习比赛(第一场)E
    Wannafly挑战赛7 E
    Wannafly挑战赛7 C
    Wannafly挑战赛7 B
    Wannafly挑战赛7 D
  • 原文地址:https://www.cnblogs.com/yjh1995/p/13893565.html
Copyright © 2011-2022 走看看