Mybatis(二)

简介: Mybatis相关介绍

③. Mybatis的Dao层实现

1>.传统的开发模式

//1.编写UserDao接口
public interface UserDao {
    List<User> findAll() throws IOException;
}
//2.编写UserDaoImpl实现
public class UserDaoImpl implements UserDao {
    public List<User> findAll() throws IOException {
        InputStream resourceAsStream = 
                    Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new 
                    SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        sqlSession.close();
        return userList;
    }
}
//3.测试传统方式
@Test
public void testTraditionDao() throws IOException {
    UserDao userDao = new UserDaoImpl();
    List<User> all = userDao.findAll();
    System.out.println(all);
}

2>. 代理开发方式

1. Mapper 接口开发需要遵循以下规范

  • ①. Mapper.xml文件中的namespace与mapper接口的全限定名相同
  • ②. Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
  • ③. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
  • ④. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

20190927221950812.png


2. 测试代理类

  • 注意:获得MyBatis框架生成的UserMapper接口的实现类
@Test
public void testProxyDao() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //获得MyBatis框架生成的UserMapper接口的实现类
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    User user = userMapper.findById(1);
    System.out.println(user);
    sqlSession.close();
}

3. 知识点总结

MyBatis的Dao层实现的两种方式:
1.手动对Dao进行实现:传统开发方式
2.代理方式对Dao进行实现:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

④. 动态Sql

1>.动态sql语句概述

  • Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了

2>. if

  • 注意:where:可以自动去掉条件中的第一个and或者or
    <if test="username!=null and username!=''">
  <select id="findByCondition" parameterType="user" resultType="user">
      select * from User
      <where>
          <if test="id!=0">
              and id=#{id}
          </if>
          <if test="username!=null">
              and username=#{username}
          </if>
      </where>
  </select>

3>. forEach

<foreach>标签用于遍历集合,它的属性:
  •collection:代表要遍历的集合元素,注意编写时不要写#{}
  •open:代表语句的开始部分
  •close:代表结束部分
  •item:代表遍历集合的每个元素,生成的变量名[#{id}中生成的值]
  •separator:代表分隔符
    <!--forEach的使用-->
    <select id="findByIds" parameterType="list" resultType="user">
        select * from User
        <where>
            <foreach collection="list" open="id in(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>
    /*根据用户ids进行查询*/
    List<User> findByIds(List<Integer>list);
    @Test
    public void test2(){
        List<Integer>ids=new ArrayList<>();
        ids.add(1);
        ids.add(2);
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User>users = mapper.findByIds(ids);
        System.out.println(users);
    }

4>. sql片段

步骤:
1.先定义一个sql片段
2.引用sql片段

20190105110009512.png

20190105110042340.png

<!--抽取sql片段简化编写-->
<sql id="selectUser"></sql> select * from User</sql>
<select id="findById" parameterType="int" resultType="user">
    <include refid="selectUser"></include> where id=#{id}
</select>
<select id="findByIds" parameterType="list" resultType="user">
    <include refid="selectUser"></include>
    <where>
        <foreach collection="array" open="id in(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </where>
</select>

5>. set

  • set元素主要用于更新操作,其主要作用是在动态包含的sql语句前输出一个SET关键字,并将SQL语句中最后一个逗号去除

6>.选择

<choose> <when> <otherwise>
    <choose>
        <when test="username!=null and username!=''">
            and username=#{username}
        </when>
        <when test="job!=null and job!=''">
            and job=#{job}
        </when>
        <otherwise>
            and password=#{password}
        </otherwise>
    </choose>

⑤. typeHandlers、plugins

1>. typeHandlers

  • 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时[从java到数据库],还是从结果集中取出一个值时[从数据库到java], 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器(截取部分)

20190928110822684.png

例如需求:一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,取出来时转
换成java的Date,即java的Date与数据库的varchar毫秒值之间转换。

20190928111104412.png

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;
    }
    <!--时间的转换-->
     <insert id="save" parameterType="user">
         insert into user values(#{id},#{username},#{password},#{birthday})
     </insert>
public void save(User user);
//重点掌握
public class DateTypeHandler extends BaseTypeHandler<Date> {
    //将java类型转换为数据库需要的类型
    public void setNonNullParameter(PreparedStatement ps, int i, Date date, JdbcType jdbcType) throws SQLException {
     long time=date.getTime();
     ps.setLong(i,time);
    }
    //将数据库中类型转换为java类型
    //String参数 要转换的字段名称
    //ResultSet 查询出的结果集
    public Date getNullableResult(ResultSet rs, String s) throws SQLException {
        //获取结果集中需要的数据(long)转换成Date类型返回
        long aLong = rs.getLong(s);
        Date date=new Date(aLong);
        return date;
    }
    //将数据库中类型转换为java类型
    public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Long along=rs.getLong(columnIndex);
        Date date=new Date(along);
        return date;
    }
    //将数据库中类型转换为java类型
    public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Long along= cs.getLong(columnIndex);
        Date date=new Date(along);
        return date;
    }
}
<?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="jdbc.properties"/>
    <typeAliases>
        <typeAlias alias="user" type="com.itheima.domain.User"></typeAlias>
    <!-- <package name="com.itheima.domain"></package>-->
    </typeAliases>
    <!--自定义类型处理器-->
    <typeHandlers>
        <!--handler属性:用于指定在程序中自定义的类型处理器-->
        <typeHandler handler="com.itheima.handler.DateTypeHandler"></typeHandler>
    </typeHandlers>
         <environments default="developement">
             <environment id="developement">
                 <transactionManager type="JDBC"></transactionManager>
                 <dataSource type="POOLED">
                     <property name="driver" value="${jdbc.driver}"/>
                     <property name="url" value="${jdbc.url}"/>
                     <property name="username" value="${jdbc.username}"/>
                     <property name="password" value="${jdbc.password}"/>
                 </dataSource>
             </environment>
         </environments>
    <!--加载映射文件-->
    <mappers>
        <mapper resource="com/itheima/mapper/UserMapper.xml"></mapper>
        <!--<package name="com.itheima.mapper"></package>-->
    </mappers>
</configuration>
<!--注册类型自定义转换器-->
  <typeHandlers>
      //子元素typeHandler的handler属性用于指定在程序中自定义的类型处理器类
      <typeHandler handler="com.itheima.typeHandlers.MyDateTypeHandler"></typeHandler>
  </typeHandlers>
      //1.添加测试数据
       User user=new User();
       user.setId(8);
       user.setUsername("测试");
       user.setPassword("123456");
       user.setBirthday(new Date());
       //2.创建SqlSession会话对象
       SqlSession sqlSession = MybatisUtils.getSqlSession();
       //4.得到UserMapper对象
       UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
       userMapper.save(user);
       sqlSession.commit();
       sqlSession.close();

2019092811155476.png

2>. plugins标签

  • MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据
  • ①. 导入通用PageHelper坐标
  <!-- 分页助手 -->
  <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>3.7.5</version>
  </dependency>
  <dependency>
      <groupId>com.github.jsqlparser</groupId>
      <artifactId>jsqlparser</artifactId>
      <version>0.9.1</version>
  </dependency>
  • ②. 在mybatis核心配置文件中配置PageHelper插件
    <!--配置分页助手插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 指定方言 -->
            <property name="dialect" value="mysql"/>
        </plugin>
  • ③. 测试分页代码实现
   @Test
   public void test5(){
       SqlSession sqlSession = MybatisUtils.getSqlSession();
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       //设置分页相关参数, 当前页+每页显示的条数
       PageHelper.startPage(1,3);
       //在使用了 PageHelper.startPage(1,3);后一定要进行dao调用
       List<User> users = mapper.findAll();
       for (User user : users) {
           System.out.println(user);
       }
   }
   @Test
   public void test6(){
       SqlSession sqlSession = MybatisUtils.getSqlSession();
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       //设置分页相关参数, 当前页+每页显示的条数
       PageHelper.startPage(1,2);
       List<User> lists= mapper.findAll();
       /*for (User user : users) {
           System.out.println(user);
       }*/
       //获取分页相关的参数
       PageInfo<User>pageInfo=new PageInfo<User>(lists);
       System.out.println("总条数:"+pageInfo.getTotal());
       System.out.println("总页数:"+pageInfo.getPages());
       System.out.println("当前页:"+pageInfo.getPageNum());
       System.out.println("每页显示长度:"+pageInfo.getPageSize());
       System.out.println("是否第一页:"+pageInfo.isIsFirstPage());
       System.out.println("是否最后一页:"+pageInfo.isIsLastPage());
       System.out.println("上一页:"+pageInfo.getPrePage());
       System.out.println("下一页:"+pageInfo.getNextPage());
   }

3>. 总结

MyBatis核心配置文件常用标签:
1、properties标签:该标签可以加载外部的properties文件
2、typeAliases标签:设置类型别名
3、environments标签:数据源环境配置标签
4、typeHandlers标签:配置自定义类型处理器
5、plugins标签:配置MyBatis的插件















相关文章
|
2月前
|
缓存 Java 数据库连接
Mybatis
Mybatis
22 0
|
4月前
|
SQL Java 数据库连接
|
7月前
|
SQL Java 数据库连接
|
16天前
|
SQL 缓存 Java
mybatis使用总结
mybatis使用总结
|
1月前
|
SQL Java 数据库连接
从0开始回顾Mybatis
Mybatis 1、什么是Mybatis? 概念: 1. Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。 2. MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 缺点: 1. SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求
|
4月前
|
Java 数据库连接 测试技术
mybatis中@Many
mybatis中@Many
31 0
|
4月前
|
Java 数据库连接 数据库
Mybatis及Mybatis-Plus使用
Mybatis及Mybatis-Plus使用
609 2
Mybatis及Mybatis-Plus使用
|
6月前
|
SQL Java 数据库连接
14MyBatis - MyBatis介绍
14MyBatis - MyBatis介绍
21 0
|
7月前
|
SQL Java 数据库连接
|
8月前
|
SQL XML 缓存
了解mybatis
了解mybatis
48 0