Mybatis的应用

目录

一、Mybatis的基础应用

1、maven坐标

2、核心配置文件

3、建表建实体

4、两种映射方式

4.1 XML方式

    4.1.1 插入数据

    4.1.2 删除数据

    4.1.3 修改数据

    4.1.4 查询数据

        4.1.4.1 查询一对一的数据

        4.1.4.2 查询一对多的数据

        4.1.4.3 查询多对多的数据

4.2 注解方式

    4.2.1 插入数据

    4.2.2 删除数据

    4.2.3 修改数据

    4.2.4 查询数据

        4.2.4.1 查询一对一的数据

       4.2.4.2 查询一对多的数据

        4.2.4.3 查询多对多的数据

二、Mybatis的缓存

1、一级缓存

2、二级缓存

2.1 开启二级缓存的配置

2.2 禁用当前select语句的二级缓存配置

3、二级缓存整合redis

3.1 二级缓存整合redis导包

3.2 配置文件

3.3 配置redis连接


一、Mybatis的基础应用

1、maven坐标

<properties>

    <maven.compiler.source>8</maven.compiler.source>

    <maven.compiler.target>8</maven.compiler.target>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>

    <java.version>1.8</java.version>

</properties>



<dependencies>

    <!--mybatis坐标-->

    <dependency>

        <groupId>org.mybatis</groupId>

        <artifactId>mybatis</artifactId>

        <version>3.4.5</version>

    </dependency>

    <!--mysql驱动坐标-->

    <dependency>

        <groupId>mysql</groupId>

        <artifactId>mysql-connector-java</artifactId>

        <version>5.1.6</version>

        <scope>runtime</scope>

    </dependency>

    <!--单元测试坐标-->

    <dependency>

        <groupId>junit</groupId>

        <artifactId>junit</artifactId>

        <version>4.12</version>

        <scope>test</scope>

    </dependency>

    <!--⽇志坐标-->

    <dependency>

        <groupId>log4j</groupId>

        <artifactId>log4j</artifactId>

        <version>1.2.12</version>

    </dependency>

</dependencies>

2、核心配置文件

SqlMapCongif.xml

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <!-- environments的default指定默认的环境名称 -->

    <environments default="development">

        <!-- environments的id指定当前环境的名称 -->

        <environment id="development">

            <!-- transactionManager的type,指定事务管理类型是JDBC

                    JDBC:从数据源得到的连接管理事务作用域,直接使⽤了JDBC 的提交和回滚设置

                    MANAGED:让容器来管理事务的整个⽣命周期,不提交或回滚⼀个连接-->

            <transactionManager type="JDBC"/>

            <!-- dataSource的type,指定当前数据源类型是连接池

                   UNPOOLED:是每次被请求时打开和关闭连接

                   POOLED:利⽤“池”的概念将 JDBC 连接对象组织起来

                   JNDI:为了能在如 EJB 或应⽤服务器这类容器中使⽤,容器可以集中或在外部配置数据源,然后放置⼀个 JNDI 上下⽂的引⽤-->

            <dataSource type="POOLED">

                <!-- 数据源配置的基本参数 -->

                <property name="driver" value="com.mysql.jdbc.Driver"/>

                <property name="url" value="jdbc:mysql://192.168.3.33:3306/springimpl?characterEncoding=UTF-8"/>

                <property name="username" value="centos01mysql"/>

                <property name="password" value="qwer_4321ASDF"/>

            </dataSource>

        </environment>

    </environments>



    <!-- mapper加载映射

            resource:类路径的资源引⽤

            url:完全限定资源定位符(URL) file:///var/mappers/UserMapper.xml

            class:映射器接⼝实现类的完全限定类名 com.test.UserMapper

            -->

    <!-- <mappers>

        <mapper resource="com/test/UserMapper.xml"/>

    </mappers> -->

    <!-- package加载映射 name:包路径 -->

    <!--<package name="com.test.mapper"/>-->

</configuration>

3、建表建实体

public class User {

    private int id;

    private String username;

    private String password;

    //省略set、get方法

}

public class Order {

    private int id;

    private Date ordertime;

    private int total;

    //省略set、get方法

}

public class Role {

    private int id;

    private String rolename;

    //省略setget方法

}
CREATE TABLE user(

  id int NOT NULL,

  username varchar(20) NULL DEFAULT NULL,

  password varchar(20) NULL DEFAULT NULL,

  PRIMARY KEY (id) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;



CREATE TABLE orders(

  id int NOT NULL,

  total int(10)  NULL DEFAULT NULL,

  ordertime datetime NOT NULL DEFAULT '2000-01-01 01:00:00'

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;



CREATE TABLE role(

  id int NOT NULL,

  rolename VARCHAR(10)  NULL DEFAULT NULL

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;



CREATE TABLE user_role(

  user_id int NOT NULL,

  role_id int NOT NULL

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

4、两种映射方式

4.1 XML方式

    SqlMapCongif.xml添加配置

<mappers>

    <mapper resource="com/test/UserMapper.xml"/>

    <mapper resource="com/test/OrderMapper.xml"/>

</mappers>

    添加UserMapper.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.test.UserMapper">

</mapper>

    添加OrderMapper.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.test.OrderMapper">

</mapper>

    添加UserMapper接口文件

public interface UserMapper {

}

    添加OrderMapper接口文件

public interface OrderMapper {

}
    4.1.1 插入数据

        UserMapper.xml文件中添加配置

<insert id="insertByPK" parameterType="com.test.User">
    INSERT INTO user (id, username, password)
    VALUES (#{id}, #{username}, #{password})
</insert>

        UserMapper接口文件中添加方法

public int insertByPK(User user);

        单测

@Test

public void testInsert() throws IOException {

    //加载核⼼配置⽂件

    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");

    //获得sqlSession⼯⼚对象

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

    //获得sqlSession对象

    SqlSession sqlSession = sqlSessionFactory.openSession();

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    User user = new User();

    user.setId(2);

    user.setUsername("李四");

    user.setPassword("123456");

    //执⾏sql语句

    int insertCnt = userMapper.insertByPK(user);

    sqlSession.commit();

    //打印结果

    System.out.println(insertCnt);

    //释放资源

    sqlSession.close();

}
    4.1.2 删除数据

        UserMapper.xml文件中添加配置

<delete id="deleteByPK" parameterType="com.test.User">
    DELETE FROM user WHERE id=#{id}
</delete>

        UserMapper接口文件中添加方法

public int deleteByPK(User user);

       单测

@Test

public void testDelete() throws IOException {

    //加载核⼼配置⽂件

    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");

    //获得sqlSession⼯⼚对象

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

    //获得sqlSession对象

    SqlSession sqlSession = sqlSessionFactory.openSession();

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    User user = new User();

    user.setId(2);

    //执⾏sql语句

    int deleteCnt = userMapper.deleteByPK(user);

    sqlSession.commit();

    //打印结果

    System.out.println(deleteCnt);

    //释放资源

    sqlSession.close();

}
    4.1.3 修改数据

        UserMapper.xml文件中添加配置

<update id="updateByPK" parameterType="com.test.User">

    UPDATE user SET username=#{username} WHERE id=#{id}

</update>

        UserMapper接口文件中添加方法

public int updateByPK(User user);

        单测

@Test

public void testUpdate() throws IOException {

    //加载核⼼配置⽂件

    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");

    //获得sqlSession⼯⼚对象

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

    //获得sqlSession对象

    SqlSession sqlSession = sqlSessionFactory.openSession();

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    User user = new User();

    user.setId(2);

    user.setUsername("王五");

    //执⾏sql语句

    int updateCnt = userMapper.updateByPK(user);

    sqlSession.commit();

    //打印结果

    System.out.println(updateCnt);

    //释放资源

    sqlSession.close();

}
    4.1.4 查询数据
        4.1.4.1 查询一对一的数据

            一个订单对应一个用户

            Order添加变量

private User user;

//省略对应setget方法

            OrderMapper接口中添加方法

List<Order> findAll();

            OrderMapper.xml中添加配置

<select id="findAll" resultMap="orderMap">

    select * from orders o,user u where o.id=u.id

</select>

<resultMap id="orderMap" type="com.test.Order">

    <result property="id" column="id"></result>

    <result property="ordertime" column="ordertime"></result>

    <result property="total" column="total"></result>

    <association property="user" javaType="com.test.User">

        <result column="id" property="id"></result>

        <result column="username" property="username"></result>

        <result column="password" property="password"></result>

    </association>

</resultMap>

或

<resultMap id="orderMap" type="com.test.Order">

    <result column="id" property="user.id"></result>

    <result column="username" property="user.username"></result>

    <result column="password" property="user.password"></result>

</resultMap>

            单测

@Test

public void testOneToOne() throws IOException {

    //加载核⼼配置⽂件

    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");

    //获得sqlSession⼯⼚对象

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

    //获得sqlSession对象

    SqlSession sqlSession = sqlSessionFactory.openSession();

    OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);

    //执⾏sql语句

    List<Order> list = orderMapper.findAll();

    sqlSession.commit();

    //打印结果

    System.out.println(list);

    //释放资源

    sqlSession.close();

}
        4.1.4.2 查询一对多的数据

            一个用户对应多个订单

            User添加变量

private List<Order> orderList;

            UserMapper接口中添加方法

List<User> findAll();

            UserMapper.xml中添加配置

<resultMap id="userMap" type="com.test.User">

    <result column="id" property="id"></result>

    <result column="username" property="username"></result>

    <result column="password" property="password"></result>

    <collection property="orderList" ofType="com.test.Order">

        <result column="oid" property="id"></result>

        <result column="ordertime" property="ordertime"></result>

        <result column="total" property="total"></result>

    </collection>

</resultMap>

<select id="findAll" resultMap="userMap">

    select *,o.id oid from user u left join orders o on u.id=o.id

</select>

            单测

@Test

public void testOneToMore() throws IOException {

    //加载核⼼配置⽂件

    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");

    //获得sqlSession⼯⼚对象

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

    //获得sqlSession对象

    SqlSession sqlSession = sqlSessionFactory.openSession();

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    //执⾏sql语句

    List<User> list = userMapper.findAll();

    sqlSession.commit();

    //打印结果

    System.out.println(list);

    //释放资源

    sqlSession.close();

}
        4.1.4.3 查询多对多的数据

            一个用户对应多个角色id,每个角色id对应各自的角色name

         User类添加变量

private List<Role> roleList;

            UserMapper接口添加方法

List<User> findAllUserAndRole();

            UserMapper.xml添加配置

<resultMap id="userRoleMap" type="com.test.User">

    <result column="id" property="id"></result>

    <result column="username" property="username"></result>

    <result column="password" property="password"></result>

    <collection property="roleList" ofType="com.test.Role">

        <result column="rid" property="id"></result>

        <result column="rolename" property="rolename"></result>

    </collection>

</resultMap>

<select id="findAllUserAndRole" resultMap="userRoleMap">

    select u.*,r.*,r.id rid from user u left join user_role ur on u.id=ur.user_id

                                        inner join role r on ur.role_id=r.id

</select>

            单测

@Test

public void testMoreToMore() throws IOException {

    //加载核⼼配置⽂件

    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");

    //获得sqlSession⼯⼚对象

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

    //获得sqlSession对象

    SqlSession sqlSession = sqlSessionFactory.openSession();

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    //执⾏sql语句

    List<User> list = userMapper.findAllUserAndRole();

    sqlSession.commit();

    //打印结果

    System.out.println(list);

    //释放资源

    sqlSession.close();

}

4.2 注解方式

    添加RoleMapper接口

public interface RoleMapper {

}

    SqlMapConfig.xml配置

<mappers>

    <!--扫描使⽤注解的类-->

    <mapper class="com.test.UserMapper"/>

    <mapper class="com.test.OrderMapper"/>

    <mapper class="com.test.RoleMapper"/>

</mappers>

    单测提取方法

private UserMapper userMapper;

private OrderMapper orderMapper;

@Before

public void before() throws IOException {

    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");

    SqlSessionFactory sqlSessionFactory = new

            SqlSessionFactoryBuilder().build(resourceAsStream);

    SqlSession sqlSession = sqlSessionFactory.openSession(true);

    userMapper = sqlSession.getMapper(UserMapper.class);

    orderMapper = sqlSession.getMapper(OrderMapper.class);

}
    4.2.1 插入数据

        UserMapper接口添加方法

@Insert("INSERT INTO user (id, username, password) VALUES (#{id}, #{username}, #{password})")

int insertByPK(User user);

        单测

@Test

public void testInsert() throws IOException {

    User user = new User();

    user.setId(2);

    user.setUsername("李四");

    user.setPassword("123456");

    //执⾏sql语句

    int insertCnt = userMapper.insertByPK(user);

    //打印结果

    System.out.println(insertCnt);

}
    4.2.2 删除数据

        UserMapper接口添加方法

@Delete("DELETE FROM user WHERE id=#{id}")

int deleteByPK(User user);

        单测

@Test

public void testDelete() throws IOException {

    User user = new User();

    user.setId(2);

    //执⾏sql语句

    int deleteCnt = userMapper.deleteByPK(user);

    //打印结果

    System.out.println(deleteCnt);

}
    4.2.3 修改数据

        UserMapper接口添加方法

@Update("UPDATE user SET username=#{username} WHERE id=#{id}")

int updateByPK(User user);

        单测

@Test

public void testUpdate() throws IOException {

    User user = new User();

    user.setId(2);

    user.setUsername("王五");

    //执⾏sql语句

    int updateCnt = userMapper.updateByPK(user);

    //打印结果

    System.out.println(updateCnt);

}

    4.2.4 查询数据
        4.2.4.1 查询一对一的数据

            一个订单对应一个用户

            Order类中添加变量

private User user;

//省略setget方法

            OrderMapper接口中添加方法

@Select("select * from orders")

@Results({

        @Result(id=true,property = "id",column = "id"),

        @Result(property = "ordertime",column = "ordertime"),

        @Result(property = "total",column = "total"),

        @Result(property = "user",column = "uid",

                javaType = User.class,

                one = @One(select = "com.test.UserMapper.findById"))

})

List<Order> findAll();

            UserMapper接口中添加方法

@Select("select * from user where id=#{id}")

User findById(int id);

           单测

@Test

public void testSelectOrderAndUser() {

    List<Order> all = orderMapper.findAll();

    for(Order order : all){

        System.out.println(order);

    }

}
       4.2.4.2 查询一对多的数据

            一个用户对应多个订单

            User类添加变量

private List<Order> orderList;

//省略setget方法

            UserMapper接口中添加方法

@Select("select * from user")

@Results({

        @Result(id = true,property = "id",column = "id"),

        @Result(property = "username",column = "username"),

        @Result(property = "password",column = "password"),

        @Result(property = "orderList",column = "id",

                javaType = List.class,

                many = @Many(select = "com.test.OrderMapper.findByUid"))

})

List<User> findAllUserAndOrder();

            OrderMapper接口中添加方法

@Select("select * from orders where uid=#{uid}")

List<Order> findByUid(int uid);

            单测

@Test

public void testFindAllUserAndOrder() {

    List<Order> all = orderMapper.findAll();

    for(Order order : all){

        System.out.println(order);

    }

}
        4.2.4.3 查询多对多的数据

           一个用户对应多个角色id,每个角色id对应各自的角色name

         User类添加变量

private List<Role> roleList;

//省略setget方法

        UserMapper接口添加方法

@Select("select * from user")

@Results({

        @Result(id = true,property = "id",column = "id"),

        @Result(property = "username",column = "username"),

        @Result(property = "password",column = "password"),

        @Result(property = "roleList",column = "id",

                javaType = List.class,

                many = @Many(select = "com.test.RoleMapper.findByUid"))

})

List<User> findAllUserAndRole();

        RoleMapper接口添加方法

@Select("select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=#{uid}")

List<Role> findByUid(int uid);

        单测

@Test

public void testFindAllUserAndRole() throws IOException {

    List<User> all = userMapper.findAllUserAndRole();

    for(User user : all){

        System.out.println(user.getUsername());

        List<Role> roleList = user.getRoleList();

        for(Role role : roleList){

            System.out.println(role);

        }

    }

}

二、Mybatis的缓存

1、一级缓存

一级缓存是基于sqlSession的,同一个sqlSesion中,只要不进行修改类操作,重复查询,只会对数据库查询一次

mybatis默认是一级缓存

2、二级缓存

二级缓存是基于mapper文件的namespace的,一台服务器内同一个namespace中,只要不进行修改类操作,重复查询,只会对数据库查询一次

2.1 开启二级缓存的配置

首先在SqlMapConfig.xml文件中加入代码

<!--开启⼆级缓存-->

<settings>

    <setting name="cacheEnabled" value="true"/>

</settings>

其次在具体Mapper.xml文件中开启缓存

<!--开启⼆级缓存-->

<cache></cache>

2.2 禁用当前select语句的二级缓存配置

useCache默认是true

<select id="selectUserByUserId" useCache="false" resultType="com.test.User" parameterType="int">

    select * from user where id=#{id}

</select>

3、二级缓存整合redis

由于mybatis自带的二级缓存是单机版,无法跨服务器工作,所以引入redis,可以实现基于多台服务器的namespace缓存

3.1 二级缓存整合redis导包

<dependency>

    <groupId>org.mybatis.caches</groupId>

    <artifactId>mybatis-redis</artifactId>

    <version>1.0.0-beta2</version>

</dependency>

3.2 配置文件

Mapper.xml文件中添加配置

<cache type="org.mybatis.caches.redis.RedisCache" />

<select id="findAll" resultType="com.test.User" useCache="true">

    select * from user

</select>

3.3 配置redis连接

redis.host=localhost

redis.port=6379

redis.connectionTimeout=5000

redis.password=

redis.database=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值