1. [MyBatis 笔记] 入门阶段

MyBatis入门

  • List item

什么是MyBatis

  • 持久层框架。
  • 避免JDBC代码 :无设置动态参数 和 处理结果集的getXXX方法。
  • 配置:使用xml和注解 配置原生类型,接口 和 Java的POJO为数据库中的记录。sql代码写在xml文件当中,完成分离。

获取MyBatis

第一个MyBatis程序

搭建环境:

  1. 创建数据库。
  2. 新建项目 :
    2.1 : 创建一个空的maven项目, 无需使用骨架。
    2.2 : 删除src目录。
  3. 导入依赖 : mybatis + mysql 驱动 + Junit。
    <!-- 依赖 -->
    <dependencies>

        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <!-- myBatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>

        <!-- Junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

创建模块:

     特意说明,这里使用模块儿而不是整个项目是为了方便学习。每个模块儿的pom.xml都在父级项目当中进行了声明,这样不用频繁进行jar包的导入

编写配置文件

    在src/main/resouces目录下面创建一个xml文件,建议使用`mybatis-config.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>
    <!-- 可以配置多套环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 事务管理 -->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&amp;userUnicode=ture&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

编写MyBatis工具类

    目的是为了将MyBatis配置文件加载,其他内容进行一次封装。

public class MyBatisUtil {

    // 加载配置文件获取工厂
    private static SqlSessionFactory sqlSessionFactory = null;
    static {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

编写实体类User:

    这里的user属性 和 数据库mybits.user中的字段是一样(先保持名字一致)。

public class User {
    private int id;
    private String name;
    private String pwd;
	// 省略构造 + getter/setter
}

编写 Mapper接口 和 xml

  • Mapper接口
package dao;

import pojo.User;
import java.util.List;

public interface UserMapper {
    List<User> getAllUser();
}
  • Mapper.xml
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--
    namespace : 指定到绑定到Mapper接口。
-->
<mapper namespace="dao.UserDao">
    <!--
        id : 对应Mapper接口的方法名字.
        resultType : 返回的Pojo类型
     -->
    <select id="getAllUser" resultType="pojo.User">
        select * from mybatis.user;
    </select>
</mapper>

注册mapper

<mappers>
    <mapper resource="dao/UserMapper.xml"></mapper>
</mappers>

测试

public class UserDaoTest {

    @Test
    public void test() {

        //1. 获得SQLSession对象
        SqlSession session = MyBatisUtil.getSqlSession();

        //2.
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> userList = mapper.getAllUser();
        System.out.println(userList);
    }
}

核心API注意事项:

SqlSessionFactoryBuilder

         一旦创建了SqlSessionFactory就不再需要了,因此其最佳使用位置是局部方法位置。不应该让其一直存在,以保证所有的XML解析资源可以被释放给重要的事情。

SqlSessionFactory

        被创建就应该一直存在,没有必要抛弃它后重新创建。其最佳作用域是应用的作用区域。很多方法可以做到,比如单例模式,静态单例模式,或者用静态代码块儿进行初始化。

SqlSession

        SqlSession是线程不安全,放在局部作用区域使用,确保其在单线程中。应该让每次收到一个请求,打开一个SqlSession,返回响应,然后关闭。

CRUD

select

<!-- 
	id : 对应的接口当中的方法名。
	resultType : SQL 语句执行的返回值。
	parameterType : 参数的类型。
-->

<! --
	需求:根据指定的id查询用户。
    UserMapper中存在抽象方法 : User getUserById(int id);
    -->
<select id="getUserById"   resultType="pojo..User"  paramterType="int" >
	select * from user where id = #{id}
</select>

isnert

<!-- 
 
    需求: 插入一个User
    在UserMapper中存在抽象方法:insertUser(User user);
	insert 没有resultType
    参数对象的属性可以直接在sql中使用,不用get方法
 -->
<isnert id="insertUser"    paramterType="pojo.User">
	insert into user (id, name, pwd) values (NULL,  #{name}, #{pwd});
</isnert>
    
  • 测试代码
	@Test
    public void insertUser() {
        User user = new User(-1, "张三", "xxxxxx");
        SqlSession session = MyBatisUtil.getSqlSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        mapper.insertUser(user);

        // 提交事务
        session.commit();
        session.close();
	}

update

<!--
	UserMapper中存在抽象方法:int updateUser(User user);
-->
<update id="updateUser" paramterType="pojo.User">
	update user set name= #{name} where id=#{id};
</update>
  • 测试代码
 @Test
public void updateUser() {
    SqlSession session = MyBatisUtil.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = new User(3, "王五", null);
    mapper.updateUser(user);

    // 提交事务
    session.commit();
    session.close();
}

delete

<!--
	UserMapper当中存在方法:int deleteUser(User user);
-->
<delete id="deleteUserById" paramterType="int">
	delete from user where id=#{id}
</delete>
  • 测试代码
@Test
public void updateUser() {
    SqlSession session = MyBatisUtil.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = new User(3, "王五", null);
    mapper.updateUser(user);

    // 提交事务
    session.commit();
    session.close();
}

Map作为参数

    使用POJO作为参数的情况下不是很方便,可以使用Map类型作为参数,这样只用填写关键字段就可以了。

  • UserMapper.java
int insertUserByMap(Map<String, Object> mp);
  • UserMapper.xml
<!-- 使用Map作为参数插入 -->
<insert id="insertUserByMap" parameterType="map">
	insert into user (id, name, pwd) values (NULL, #{userName}, #{passWord})
</insert>
  • 测试
@Test
public void insertUserByMap() {
    SqlSession session = MyBatisUtil.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);

    Map<String, Object> data = new HashMap<String, Object>();
    data.put("userName", "李白");
    data.put("passWord", "123456");

    mapper.insertUserByMap(data);

    // 提交事务
    session.commit();
    session.close();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章