使用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下

posted @ 2020-10-28 21:19  hjy1995  阅读(4473)  评论(0编辑  收藏  举报