MyBatis

MyBaits

  • MyBaits的jar包介绍
  • MyBaits的入门案例
    • 创建实体
  • java日志处理框架
    • 常用的日志处理框架
    • Log4j的日志级别
  • Mybatis配置的完善
    • Mybatis的日志管理
    • 使用别名alias
      • 方式一
      • 方式二
  • SqlSession对象下的常用API
    • 查询操作
  • Mapper动态代理
    • Mapper 动态代理规范
      • 查询所有用户
      • 根据用户ID查询用户
    • Mapper动态代理模式下的多参数处理
      • @Param注解传参法
      • POJO传参法
      • Map传参法
    • Mybatis的分页查询
      • 使用RowBounds
      • 使用SQL语句分页
    • Mybatis动态代理模式下的DML操作
      • 添加用户
    • 主键值回填
      • 获取自增主键值
    • Mapper动态代理的原理

MyBaits的jar包介绍

MyBatis_第1张图片
在这里插入图片描述

MyBaits的入门案例

创建实体

E:\java\MyBaits\mybatisdemo\src\com\bjsxt\pojo\Users.java

java日志处理框架

常用的日志处理框架

MyBatis_第2张图片
Log4j: Log For Java(Java 的日志) 是 Apache 提供的一个开源的 Java主流日志框架

Log4j的日志级别

MyBatis_第3张图片

Mybatis配置的完善

Mybatis的日志管理

使用别名alias

Mybatis 中的别名配置它只和 XML 配置有关, 只用来减少类完全限定名的多余部分。注
意:别名都是大小写不敏感的。

方式一

使用 typeAlias 指定单个类的别名

<typeAliases>
	<typeAlias type="com.bjsxt.pojo.Users" alias="u"/>
typeAliases>

<select id="selectUsersById" parameterType="int" resultType="u">
	select * from users where userid = #{suibian}
select>

表示用u来代替com.bjsxt.pojo.Users

方式二

使用package指定某个包下所有类的默认别名

<typeAliases>
	<package name="com.bjsxt.pojo"/>
typeAliases>

引入后的映射文件

<select id="selectUsersById" parameterType="int" resultType="users">
	select * from users where userid = #{suibian}
select>

这段代码的主要意思呢就是给com.bjsxt.pojo这个包结构下所有的类都起一个别名这个别名就是这个类名的小写字母,以后就可以用小写字母来代替这个包结构了。

eg:

com.xxx.xxx.GoodsName就可以替换为goodsname

com.xxx.xxx.GoodsNumber就可以替换为goodsnumber

SqlSession对象下的常用API

查询操作

1.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\mapper\UsersMapper.xml


    <select id="selectUsersByNameAndSex" resultType="users">
        select * from users where username = #{name} and usersex = #{sex}
    select>
mapper>
//2.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\dao\UsersDao.java

 Map<Integer,Users> selectUsersByNameAndSex(String username, String usersex);
//3.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\dao\impl\UsersDaoImpl.java(省略了UsersDao.java)

@Override
    public Map<Integer, Users> selectUsersByNameAndSex(String username, String usersex) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        Map<String,String> param = new HashMap<>();
        param.put("name",username);//要和UserMapper.xml中username = #{name} and usersex = {sex}对应
        param.put("sex",usersex);
        Map<Integer, Users> users = sqlSession.selectMap("com.bjsxt.mapper.UserMapper.selectUsersByNameAndSex", param, "userid");
        return users;
    }
//4.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\service\serviceimpl\UsersServiceImpl.java
@Override
    public Map<Integer, Users> findUsersByNameAndSex(String username, String usersex) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        Map<Integer, Users> integerUsersMap = null;
        try {
            UsersDaoImpl usersDao = new UsersDaoImpl();
            integerUsersMap = usersDao.selectUsersByNameAndSex(username, usersex);
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MybatisUtils.closeSqlSession();
        }
        return integerUsersMap;
    }
//5.测试
@Test
    public void findUsersByNameAndSex(){
        UsersServiceImpl usersService = new UsersServiceImpl();
        Map<Integer, Users> usersByNameAndSex = usersService.findUsersByNameAndSex("潘海宸", "男");
        Set<Integer> integers = usersByNameAndSex.keySet();
        for (Integer key:integers){
            Users users = usersByNameAndSex.get(key);
            System.out.println(key + "\t" + users.getUserid() + "\t" + users.getUsername() + "\t" + users.getUsersex());
        }
    }

Mapper动态代理

在 MyBatis 中提供了另外一种 Dao 层的实现方式,既:Mapper 动态代理(或称为接口
绑定)的操作方式。这种方式下程序员只需要写 Dao 接口,不需要创建 Dao 的接口实现类,
Mybatis 会自动生成接口实现类的代理对象。在 Dao 层我们只要创建接口与映射配置文件即
可。这种方式可以大大简化 Dao 层的代码结构,是在开发中最常见的使用方式。

Mapper 动态代理规范

  • 接口名称需要与映射配置文件名称相同
  • 映射配置文件中 namespace 必须是接口的全名
  • 接口中的方法名和映射配置文件中的标签的 id 一致
  • 接口中的返回值类型和映射配置文件中的 resultType的指定类型一致

注意:引入mapper映射配置文件时mapper标签内有所不同,需要用package标签

<!--引入 Mapper 映射配置文件-->
<mappers>
	<package name="com.bjsxt.mapper"/>
</mappers>

查询所有用户

1.修改映射配置文件


<select id="selectUsersAll" resultType="users">
	select * from users
select>

2.修改UserMapper接口添加抽象方法

public interface UsersMapper {
List<Users> selectUsersAll();
}

3.创建业务层接口

public interface UsersService {
List<Users> findUsersAll();
}
  1. 创建业务层接口实现类
    //可以通过接口的名字定位到映射配置文件,所以要求映射配置文件里面的namespace属性的值要和使用接口的全名相同;定位到映射配置文件后,根据方法名定位到要2使用的标签,所以方法名要和id的值相同。这样就能执行标签里的Sql语句了
 public List<Users> findUsersAll() {
        List<Users> list = null;
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        try {
            //getMapper 方法的作用是根据给定的接口的 Class 对象,生成该接口的接口实现类的代理对象
            UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);//可以通过接口的名字定位到映射配置文件,所以要求映射配置文件里面的namespace属性的值要和使用接口的全名相同;
            //定位到映射配置文件后,根据方法名定位到要2使用的标签,所以方法名要和id的值相同。这样就能执行标签里的Sql语句了
            list = mapper.selectUsersAll();
        } catch (Exception e) {
            sqlSession.rollback();
            e.printStackTrace();
        } finally {
            MybatisUtils.closeSqlSession();
        }
        return list;
    }

5.测试

@Test
    public void findUsersAll(){
        UsersServiceImpl usersService = new UsersServiceImpl();
        List<Users> usersAll = usersService.findUsersAll();
        Iterator<Users> iterator = usersAll.iterator();
        while (iterator.hasNext()){
            Users next = iterator.next();
            System.out.println(next.toString());
        }
    }

根据用户ID查询用户

  1. 修改映射配置文件
<select id="selectUsersById" parameterType="_int" resultType="users">
        select * from users where userid = #{id}
select>
  1. 修改UsersMapper接口添加抽象方法
Users selectUsersById(int id);
  1. 修改业务层接口
Users findUsersById(int id);
  1. 修改业务层接口实现类
 @Override
    public Users findUsersById(int id) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        Users users = null;
        try {
            UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
            users = mapper.selectUsersById(id);
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MybatisUtils.closeSqlSession();
        }
        return users;
    }
  1. 测试
@Test
    public void findUsersById(){
        UsersServiceImpl usersService = new UsersServiceImpl();
        Users user = usersService.findUsersById(2);
        System.out.println(user.toString());
    }

Mapper动态代理模式下的多参数处理

@Param注解传参法

注解中@param(“…”)中的参数代表的是Mapper映射文件中#{…}里面的值。

  1. 修改映射配置文件

<select id="selectUsersAnnParam" resultType="users">
	select * from users where username = #{name} and usersex= #{sex}
select>
  1. 修改UsersMapper接口添加抽象方法
List<Users> selectUsersAnnParam(@Param("name") String username,@Param("sex") String usersex);
  1. 修改业务层接口
List<Users> findUsersAnnParam(@Param("name") String username1, @Param("sex") String usersex);
  1. 修改业务层接口实现类
@Override
    public List<Users> findUsersAnnParam(String username1, String usersex) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        List<Users> list = null;
        try {
            UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
            list = mapper.selectUsersAnnParam(username1, usersex);
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MybatisUtils.closeSqlSession();
        }
        return list;
    }
  1. 测试
@Test
    public void findUsersAnnParam(){
        UsersServiceImpl usersService = new UsersServiceImpl();
        List<Users> user = usersService.findUsersAnnParam("潘海宸", "男");
        Iterator<Users> iterator = user.iterator();
        while (iterator.hasNext()){
            Users next = iterator.next();
            System.out.println(next.toString());
        }

POJO传参法

在 Mapper 动态代理中也可以使用 POJO 作为传递参数的载体,在 SQL 语句中绑定参数
使用 POJO 的属性名作为参数名即可。此方式推荐使用。

  1. 修改映射配置文件

<select id="selectUsersPOJOParam" resultType="users">
	select * from users where username = #{username} and usersex=#{usersex}
select>
  1. 修改UsersMapper接口添加抽象方法
List<Users> selectUsersPOJOParam(Users users);
  1. 修改业务层接口
 List<Users> findUsersPOJOParam(Users users);
  1. 修改业务层接口实现类
@Override
    public List<Users> findUsersPOJOParam(Users users) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        List<Users> list = null;
        try {
            UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
            list = mapper.selectUsersPOJOParam(users);
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MybatisUtils.closeSqlSession();
        }
        return list;
    }
  1. 测试
@Test
    public void selectUsersPOJOParam(){
        UsersServiceImpl usersService = new UsersServiceImpl();
        Users user = new Users();
        user.setUsername("潘海宸");
        user.setUsersex("男");
        List<Users> usersPOJOParam = usersService.findUsersPOJOParam(user);
        Iterator<Users> iterator = usersPOJOParam.iterator();
        while (iterator.hasNext()){
            Users next = iterator.next();
            System.out.println(next.toString());
        }
    }

Map传参法

Mybatis的分页查询

使用RowBounds

RowBounds 是 Mybatis 提供的一个专门处理分页的对象。在 RowBounds 对象中有两个成员变量:

  • offset:偏移量,从 0 开始计数
  • limit:限制条数
  1. 修改映射配置文件

<select id="selectUsersRowBounds" resultType="users">
	select * from users
select>
  1. 修改UserMapper接口
List<Users> selectUsersRowBounds(RowBounds rowBounds);
  1. 业务层接口
List<Users> findUsersRowBounds();
  1. 业务层实现类
@Override
    public List<Users> findUsersRowBounds() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
        RowBounds rowBounds = new RowBounds(0, 20);
        List<Users> list = mapper.selectUsersRowBounds(rowBounds);
        return list;
    }
  1. 测试类
@Test
    public void findUsersRowBounds(){
        UsersServiceImpl usersService = new UsersServiceImpl();
        List<Users> usersRowBounds = usersService.findUsersRowBounds();
        Iterator<Users> iterator = usersRowBounds.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next().toString());
        }
    }

使用SQL语句分页

在分页查询时,如果返回的结果较多,那么需要使用特定的 SQL 语句来实现分页处理。在 MySQL 数据库中我们可以使用 limit 实现分页。

  1. 修改映射配置文件

<select id="selectUsersLimit" resultType="users">
	select * from users limit #{offset},#{limit}
select>
  1. 修改UserMapper接口
List<Users> selectUsersLimit(@Param("offset") intoffset,@Param("limit") int limit);
  1. 业务层接口
List<Users> findUsersLimit(@Param("offset") int offset, @Param("limit") int limit);
  1. 业务层实现类
@Override
    public List<Users> findUsersLimit(int offset, int limit) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        List<Users> list = null;
        try {
            UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
            list = mapper.selectUsersLimit(offset, limit);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MybatisUtils.closeSqlSession();
        }
        return list;
    }
  1. 测试类
public void findUsersLimit(){
        UsersServiceImpl usersService = new UsersServiceImpl();
        List<Users> users = usersService.findUsersLimit(0, 3);
        Iterator<Users> iterator = users.iterator();
        while (iterator.hasNext()){
            Users next = iterator.next();
            System.out.println(next.toString());
        }
    }

Mybatis动态代理模式下的DML操作

添加用户

  1. 修改映射配置文件

    <insert id="insertUsers">
        insert into users values (default , #{username}, #{usersex})
    insert>
  1. 修改UserMapper接口
void insertUsers(Users users);
  1. 业务层接口
void InsertUsers(Users users);
  1. 业务层实现类
@Override
    public void InsertUsers(Users users) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        try {
            UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
            mapper.insertUsers(users);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MybatisUtils.closeSqlSession();
        }
    }
  1. 测试类
@Test
    public void insertUsers(){
        UsersServiceImpl usersService = new UsersServiceImpl();
        Users user = new Users();
        user.setUsername("沙雕");
        user.setUsersex("男");
        usersService.InsertUsers(user);
    }

主键值回填

获取自增主键值

  1. 修改映射配置文件
    局部配置:

<insert id="insertUsersGetKey" useGeneratedKeys="true"keyProperty="userid">
	insert into users values(default ,#{username},#{usersex})
insert>

全局配置:

<settings>
	<setting name="useGeneratedKeys" value="true"/>
settings>


<insert id="insertUsersGetKey" keyProperty="userid">
	insert into users values(default ,#{username},#{usersex})
insert>

Mapper动态代理的原理

  1. 修改映射配置文件

  1. 修改UserMapper接口

  1. 业务层接口

  1. 业务层实现类

  1. 测试类

你可能感兴趣的:(#,Mybatis,java)