mybatis自学历程(一)

第一个mybatis程序

  • IDE:myeclipse2017
  • jar包:mybatis3.5.2,mybatis依赖包,mysql8.0.17驱动包

注:mybatis包和所需的依赖包,可到http://www.mybatis.cn/下载,mybatis官方文档(可选中文)

1.项目结构图

 注:本示例参考于C语言中文网,如对本示例有疑问可查看此网站,看是否能解决问题

2.建库建表

CREATE DATABASE test;
USE test;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `uid` INT UNSIGNED AUTO_INCREMENT,
  `uname` varchar(20) DEFAULT NULL,
  `usex` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.导jar包

 4.创建日志文件

MyBatis 默认使用 log4j 输出日志信息,如果开发者需要查看控制台输出的 SQL 语句,那么需要在 classpath 路径下配置其日志文件。在 myBatis应用的 src 目录下创建 log4j.properties 文件,其内容如下:

# Global logging configuration
log4j.rootLogger=ERROR,stdout
# MyBatis logging configuration...
log4j.logger.com.mybatis=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

5.创建持久化类

在 src 目录下创建一个名为 com.mybatis.po 的包,在该包中创建持久化类 MyUser,注意在类中声明的属性与数据表 user 的字段一致。

package com.mybatis.po;

public class MyUser {
    private Integer uid; // 主键
    private String uname;
    private String usex;
    public Integer getUid() {
        return uid;
    }
    public void setUid(Integer uid) {
        this.uid = uid;
    }
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
    public String getUsex() {
        return usex;
    }
    public void setUsex(String usex) {
        this.usex = usex;
    }
    
    @Override
    public String toString() {
        return "MyUser [uid=" + uid + ", uname=" + uname + ", usex=" + usex + "]";
    }
    
    
}

6.创建映射文件

在 src 目录下创建一个名为 com.mybatis.mapper 的包,在该包中创建映射文件 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.mybatis.mapper.UserMapper">
    <!-- 根据uid查询一个用户信息 -->
    <select id="selectUserById" parameterType="Integer"
        resultType="com.mybatis.po.MyUser">
        select * from user where uid = #{uid}
    </select>
    <!-- 查询所有用户信息 -->
    <select id="selectAllUser" resultType="com.mybatis.po.MyUser">
        select * from user
    </select>
    <!-- 添加一个用户,#{uname}为 com.mybatis.po.MyUser 的属性值 -->
    <insert id="addUser" parameterType="com.mybatis.po.MyUser">
        insert into user (uname,usex)
        values(#{uname},#{usex})
    </insert>
    <!--修改一个用户 -->
    <update id="updateUser" parameterType="com.mybatis.po.MyUser">
        update user set uname =
        #{uname},usex = #{usex} where uid = #{uid}
    </update>
    <!-- 删除一个用户 -->
    <delete id="deleteUser" parameterType="Integer">
        delete from user where uid
        = #{uid}
    </delete>
</mapper>

UserMapper.xml相当于实现类,只不过用xml实现,并添加需要的方法,namespace的值不固定,通过namespace.id 调用相应的增删改查

7.创建mybatis的配置文件

在 src 目录下创建 MyBatis 的核心配置文件 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>
    <settings>
        <setting name="logImpl" value="LOG4J" />
    </settings>
    <!-- 配置mybatis运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用JDBC的事务管理 -->
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <!-- MySQL数据库驱动 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <!-- 连接数据库的URL -->
                <property name="url"
                    value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!-- 将mapper文件加入到配置文件中 -->
    <mappers>
        <mapper resource="com/mybatis/mapper/UserMapper.xml" />
    </mappers>
</configuration>

8.创建测试类

在 src 目录下创建一个名为 com.mybatis.test 的包,在该包中创建 MyBatisTest 测试类

package com.mybatis.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.mybatis.po.MyUser;

public class MyBatisTest {
    public static void main(String[] args) {
        try {
            // 读取配置文件 mybatis-config.xml
            InputStream config = Resources
                    .getResourceAsStream("mybatis-config.xml");
            // 根据配置文件构建SqlSessionFactory
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder()
                    .build(config);
            // 通过 SqlSessionFactory 创建 SqlSession
            SqlSession ss = ssf.openSession();
            // SqlSession执行映射文件中定义的SQL,并返回映射结果
            /*
             * com.mybatis.mapper.UserMapper.selectUserById 为 UserMapper.xml
             * 中的命名空间+select 的 id
             */
            // 查询一个用户
            MyUser mu = ss.selectOne(
                    "com.mybatis.mapper.UserMapper.selectUserById", 1);
            System.out.println(mu);
            // 添加一个用户
            MyUser addmu = new MyUser();
            addmu.setUname("陈恒");
            addmu.setUsex("男");
            ss.insert("com.mybatis.mapper.UserMapper.addUser", addmu);
            // 修改一个用户
            MyUser updatemu = new MyUser();
            updatemu.setUid(1);
            updatemu.setUname("张三");
            updatemu.setUsex("女");
            ss.update("com.mybatis.mapper.UserMapper.updateUser", updatemu);
            // 删除一个用户
            ss.delete("com.mybatis.mapper.UserMapper.deleteUser", 3);
            // 查询所有用户
            List<MyUser> listMu = ss
                    .selectList("com.mybatis.mapper.UserMapper.selectAllUser");
            for (MyUser myUser : listMu) {
                System.out.println(myUser);
            }
            // 提交事务
            ss.commit();
            // 关闭 SqlSession
            ss.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

测试结果如下图


全局配置文件简说(mybatis-config.xml)

事务管理器(transactionManager)

type=”[JDBC|MANAGED]”

JDBC:使用JDBC原生事务管理方式

MANAGED:把事务转交给其他容器

数据源(dataSource)

type=”[UNPOOLED|POOLED|JNDI]”

POOLED:使用数据库连接池

UNPOOLED:不使用使用数据库连接池,和直接使用JDBC一样

JNDI:java命名目录接口技术

3种查询方式

1.selectList()返回值受List<resultType>属性控制,适用于查询结果都需要遍历的需求

2.selectOne()返回值object,适用于返回结果只是变量或一行数据时

3.selectMap()返回值Map,适用于需要在查询结果中通过某列的值取到这行数据的需要

查询全部

新建表并插入数据,新建项目

 jar包跟上个项目一样

package com.mybatis.po;

public class People {
    private Integer id;
    private String name;
    private Integer age;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "id=" + id + ", name=" + name + ", age=" + age;
    }
    
    
}
People.java
<?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.mybatis.mapper.PeopleMapper">
    <select id="selectAll" resultType="com.mybatis.po.People">
        select * from people
    </select>
</mapper>
PeopleMapper.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>
    <settings>
        <setting name="logImpl" value="LOG4J" />
    </settings>
    <!-- 配置mybatis运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用JDBC的事务管理 -->
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <!-- MySQL数据库驱动 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <!-- 连接数据库的URL -->
                <property name="url"
                    value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!-- 将mapper文件加入到配置文件中 -->
    <mappers>
        <mapper resource="com/mybatis/mapper/PeopleMapper.xml" />
    </mappers>
</configuration>
mybatis.xml
package com.mybatis.service;

import java.io.IOException;
import java.util.List;

import com.mybatis.po.People;

public interface PeopleService {
    /**
     * 显示全部
     */
    List<People> show ()  throws IOException;
}
PeopleService.java
package com.mybatis.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;

import com.mybatis.po.People;
import com.mybatis.service.PeopleService;

/**
 * 在数据访问层处理异常和在控制器中处理异常,service中抛出异常
 * @author Administrator
 *
 */
public class PeopleServiceImpl implements PeopleService {

    @Override
    public List<People> show() throws IOException {
        InputStream is= Resources.getResourceAsStream("mybatis.xml");
        //前面是工厂,实例化工厂对象是使用的构建者设计模式,名称标志是:后面有builder
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
        SqlSession session=factory.openSession();
        List<People> list= session.selectList("com.mybatis.mapper.PeopleMapper.selectAll");
        session.close();
        
        return list;
    }
    
}
PeopleServiceImpl.java
package com.mybatis.service;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.mybatis.po.People;
import com.mybatis.service.impl.PeopleServiceImpl;

//大部分注解都有默认属性,如果注解中只给默认属性赋值,就可以省略属性名
//否则在注解中格式为(属性名=属性值)
//如果一个属性是数组类型格式:属性名={值,值},如果该数组只有一个,可以省略大括号
//如果类不是基本数据类型或String而是一个类类型,语法:属性名=@类型
//注解中@表示引用类型
@WebServlet("/abc/d/show")
public class ShowService extends HttpServlet{
    private PeopleService peopleService=new PeopleServiceImpl();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<People> list=peopleService.show();
        req.setAttribute("list", list);
        //相对路径
        //只要路径中以/开头的都叫全路径,从项目根目录(webRoot)出发找到其他资源的过程
        //只要不以/开头的都是相对路径,相对路径是从当前资源出发找到其他资源的过程
        //如果请求转发/表示webRoot目录
        //如果是重定向,静态资源(<img src=""/>, <a href="">,<script src=""/> css ) 引用时,其中/表示的是Tomcat分webapps文件夹根目录
        //服务器根目录
        req.getRequestDispatcher("/index.jsp").forward(req, resp);
    }
    
}
ShowService
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
  <head>
    <title>显示全部</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">  
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
  </head>
  
  <body>
  <div class="table-responsive">
  <table class="table table-hover">
      <caption>人员信息表</caption>
      <thead>
      <tr>
          <th>编号</th>
          <th>姓名</th>
          <th>年龄</th>
      </tr>
      </thead>
      <c:forEach items="${list }" var ="peo">
      <tbody>
          <tr>
              <td>${peo.id }</td>
              <td>${peo.name }</td>
              <td>${peo.age }</td>
          </tr>
      </tbody>
      </c:forEach>
  </table>
  </div>
  </body>
</html>
index.jsp

注:查询全部的项目中有相对路径和绝对路径的解释,还有注解的用法的解释

在Mapper.xml中获取参数

parameterType控制参数类型

#{} 获取参数内容

使用索引,从0开始  #{0}表示第一个参数,也可以使用 #{param1}

如果只有一个参数(基本数据类型或String),对 #{} 里面内容没有要求,只要写内容即可,例 #{abc}

如果参数是对象,则 #{属性名}

如果参数是map,则 #{key},key为map的key,使用map传值,是为传多个参数

#{} 和 ${} 的区别

#{} 在sql语句中使用 占位符

${} 在sql语句拼接,不使用 ?,默认找${内容}  内容的get/set方法,如果写数字,就是一个数字,如mybatis01项目中,UserMapper.xml 中的resultType="com.mybatis.po.MyUser",${id},则找MyUser.id值

mybatis中实现mysql简单分页

在mysql数据库People表中添加多条数据

use test;

INSERT INTO people VALUES(Default,"张三2",22);
INSERT INTO people VALUES(Default,"张三3",22);
INSERT INTO people VALUES(Default,"张三4",22);
INSERT INTO people VALUES(Default,"张三5",22);
INSERT INTO people VALUES(Default,"张三6",22);
insert

在mybatis02项目中的PeopleMapper.xml,添加select

<?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.mybatis.mapper.PeopleMapper">
    <select id="selectAll" resultType="com.mybatis.po.People">
        select * from people
    </select>
    
    <select id="page" resultType="com.mybatis.po.People" parameterType="map">
        SELECT * from people LIMIT #{pageStart},#{pageSize}
    </select>
</mapper>
PeopleMapper.xml

编写测试类test.java

package com.mybatis.service;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.mybatis.po.People;

public class test {
    public static void main(String[] args) throws IOException {
        InputStream is=Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
        SqlSession ss=factory.openSession();
        
        //页码显示的条胡
        int pageSize=3;
        //第几页
        int pageNumber=1;
        
        //map传多个参数
        Map<String, Object> map=new HashMap<String, Object>();
        map.put("pageSize", pageSize);
        map.put("pageStart", pageSize*(pageNumber-1));
        
        List<People> lists=ss.selectList("com.mybatis.mapper.PeopleMapper.page",map);
        System.out.println(lists);
        
        ss.close();
    }
}
test.java

 typeAliases别名

1.系统内置别名:把类型全小写

2.给某个类起别名,例mybatis02项目中的mybatis.xml,添加typeAliases标签,注意<typeAliases>标签位置,可以鼠标放在configration上,有提示标签位置,

  修改PeopleMapper.xml中select的resultType为peo

 

 3.直接给某个包下所有类起别名,别名为类名,区分大小写

  在typeAliases标签中添加package标签,name值为包名

  修改select标签中的resultType的值为People

 

 mybatis实现新增和事务讲解

 1.概念复习

 1.1 功能:从应用程序角度出发,软件具有哪些功能

 1.2 业务:完成功能时的逻辑,对应service中的一个方法

 1.3 事务:从数据库角度出发,完成业务时需要执行的sql集合,统一一个事务

 1.3.1 事务回滚:如果在一个事务中sql执行事务,希望回归到事务的原点,保证数据库数据的完整性()

 2.在mybatis中默认是关闭JDBC的自动提交功能

 2.1 每个sqlsession默认都是不自动提交功能

 2.2 session.commit()  提交事务

 2.3 设置openSession(true) 自动提交事务

3.mybatis底层是对JDBC的封装

3.1 JDBC中executeUpdate()执行新增,删除,修改的sql返回值为int,表示受影响的行数

3.2 mybatis中<insert>,<update>,<delete>标签是没有resultType属性,默认都是int,原因是3.1

4.事务对象

4.1 在openSesion()时mybatis会在创建sqlsession的同时创建一个Transaction(事务对象),同时autoCommit都为false

4.2 如果出现异常,应该session..rollback()回滚事务

回滚事务测试:

mybatis02项目中修改PeopleMapper.xml代码,添加insert

<?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.mybatis.mapper.PeopleMapper">
    <select id="selectAll" resultType="com.mybatis.po.People">
        select * from people
    </select>
    
    <select id="page" resultType="People" parameterType="map">
        SELECT * from people LIMIT #{pageStart},#{pageSize}
    </select>
    
    <insert id="insPeople" parameterType="People">
        insert into people values(default,#{name},#{age})
    </insert>
</mapper>
PeopleMapper.xml
package com.mybatis.service;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.mybatis.po.People;

public class test {
    public static void main(String[] args) throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        SqlSession ss = factory.openSession();

        // 页码显示的条胡
        // int pageSize=3;
        // 第几页
        // int pageNumber=1;

        // map传多个参数
        // Map<String, Object> map=new HashMap<String, Object>();
        // map.put("pageSize", pageSize);
        // map.put("pageStart", pageSize*(pageNumber-1));

        // List<People>
        // lists=ss.selectList("com.mybatis.mapper.PeopleMapper.page",map);
        // System.out.println(lists);

        People people = new People();
        people.setName("小柒");
        people.setAge(19);

        People people2 = new People();
        people.setName("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        people.setAge(20);

        try {
            ss.insert("com.mybatis.mapper.PeopleMapper.insPeople", people);

            ss.insert("com.mybatis.mapper.PeopleMapper.insPeople", people2);
        } catch (Exception e) {
            System.out.println("people2的name长度过长,所以回滚事务,导致people也新增失败");
            ss.rollback();
        }

        // 提交事务
        ss.commit();
        // 关闭session
        ss.close();
    }
}
test.java

结果如下:

分页

项目结构图:

 导入jar包,在src下新建文件log4j.properties

# Global logging configuration
log4j.rootLogger=ERROR,stdout,R
# MyBatis logging configuration...
log4j.logger.com.mybatis=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:\temp\logs\qc.log   
log4j.appender.R.layout=org.apache.log4j.PatternLayout   
1log4j.appender.R.layout.ConversionPattern=%5p [%t] - %m%n
log4j.properties

复制mybatis02中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>
    <settings>
        <setting name="logImpl" value="LOG4J" />
    </settings>
    <typeAliases>
        <!-- <typeAlias type="com.mybatis.po.People" alias="peo"/> -->
        <package name="com.mybatis.po"/>
    </typeAliases>
    <!-- 配置mybatis运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用JDBC的事务管理 -->
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <!-- MySQL数据库驱动 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <!-- 连接数据库的URL -->
                <property name="url"
                    value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!-- 将mapper文件加入到配置文件中 -->
    <mappers>
        <mapper resource="com/mybatis/mapper/PeopleMapper.xml" />
    </mappers>
</configuration>
mybatis.xml

com.mybatis.po包

package com.mybatis.po;

public class People {
    private Integer id;
    private String name;
    private Integer age;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "id=" + id + ", name=" + name + ", age=" + age;
    }
    
    
}
People.java
package com.mybatis.po;

import java.util.List;

public class PageInfo {
    //每页显示的条数
    private int pageSize;
    //当前是几页
    private int pageNumber;
    //总页数
    private long total;
    //当前页的数据
    private List<?> list;
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getPageNumber() {
        return pageNumber;
    }
    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }
    public long getTotal() {
        return total;
    }
    public void setTotal(long total) {
        this.total = total;
    }
    public List<?> getList() {
        return list;
    }
    public void setList(List<?> list) {
        this.list = list;
    }
    
    
}
PageInfo.java

com.mybatis.mapper包

<?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.mybatis.mapper.PeopleMapper">
    <!-- 查询分页sql语句 -->
    <select id="selByPage" resultType="People" parameterType="map">
        SELECT * FROM people LIMIT #{pageStart},#{pageSize}
    </select>
    
    <!-- 查询数据总条数 -->
    <select id="selCount" resultType="long">
        select COUNT(1) from people
    </select>
</mapper>
People.xml

com.mybatis.service包

package com.mybatis.service;

import java.io.IOException;

import com.mybatis.po.PageInfo;

public interface PeopleService {
    /**
     * 分页显示
     * @param pageSize
     * @param pageNumber
     * @return
     * @throws IOException
     */
    PageInfo showPage(int pageSize,int pageNumber)  throws IOException;
}
PeopleService.java

com.mybatis.service.impl包

package com.mybatis.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.mybatis.po.PageInfo;
import com.mybatis.service.PeopleService;

public class PeopleServiceImpl implements PeopleService {

    @Override
    public PageInfo showPage(int pageSize, int pageNumber) throws IOException {
        InputStream is= Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
        SqlSession session=factory.openSession();
        Map<String, Object> map=new HashMap<>();
        map.put("pageStart", pageSize*(pageNumber-1));
        map.put("pageSize", pageSize);
        
        PageInfo pi=new PageInfo();
        pi.setPageSize(pageSize);
        pi.setPageNumber(pageNumber);
        pi.setList(session.selectList("com.mybatis.mapper.PeopleMapper.selByPage",map));
        long count=session.selectOne("com.mybatis.mapper.PeopleMapper.selCount");
        
        pi.setTotal(count%pageSize==0?count/pageSize:count/pageSize+1);
        return pi;
    }
    
}
PeopleServiceImpl.java

com.mybatis.servlet包

package com.mybatis.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.mybatis.po.PageInfo;
import com.mybatis.service.PeopleService;
import com.mybatis.service.impl.PeopleServiceImpl;

@WebServlet("/page")
public class ShowPageServlet extends HttpServlet {
    private PeopleService peopleService= new PeopleServiceImpl();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //第一次访问的验证,如果没有传递参数,设置默认值
        String pageSizeStr=req.getParameter("pageSize");
        int pageSize=2;
        if (pageSizeStr!=null&&!pageSizeStr.equals("")) {
            pageSize=Integer.parseInt(pageSizeStr);
        }
        
        String pageNumberStr=req.getParameter("pageNumber");
        int pageNumber=1;
        if(pageNumberStr!=null&&!pageNumberStr.equals("")){
            pageNumber=Integer.parseInt(pageNumberStr);
        }
        
        PageInfo pi=peopleService.showPage(pageSize, pageNumber);
        req.setAttribute("PageInfo", pi);
        req.getRequestDispatcher("index.jsp").forward(req, resp);
    }
    
    
}
ShowPageServlet.java

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>分页</title>
  </head>
  
  <body>
  <table border=1>
      <tr>
          <th>编号</th>
          <th>姓名</th>
          <th>年龄</th>
      </tr>
      <c:forEach items="${PageInfo.list }" var="pi">
          <tr>
              <td>${pi.id}</td>
              <td>${pi.name}</td>
              <td>${pi.age}</td>
          </tr>
      </c:forEach>
  </table>
  <a href="page?pageNumber=${PageInfo.pageNumber -1  }&pageSize=${PageInfo.pageSize } " <c:if test="${PageInfo.pageNumber<=1 }"> onclick="javascript:return false;" </c:if>>上一页</a>
  <a href="page?pageNumber=${PageInfo.pageNumber +1  }&pageSize=${PageInfo.pageSize } " <c:if test="${PageInfo.pageNumber>=PageInfo.total }"> onclick="javascript:return false;" </c:if>>下一页</a>
  </body>
</html>
index.jsp

people表数据

 运行结果如下:

转账,日志及分页案例

新建项目mybatis04,项目图结构如下

 导入jar包

<?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>
    <settings>
        <setting name="logImpl" value="LOG4J" />
    </settings>
    <typeAliases>
        <!-- <typeAlias type="com.mybatis.po.People" alias="peo"/> -->
        <package name="com.mybatis.po" />
    </typeAliases>
    <!-- 配置mybatis运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用JDBC的事务管理 -->
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <!-- MySQL数据库驱动 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <!-- 连接数据库的URL -->
                <property name="url"
                    value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!-- 将mapper文件加入到配置文件中 -->
    <mappers>
        <mapper resource="com/mybatis/mapper/AccountMapper.xml" />
        <mapper resource="com/mybatis/mapper/LogMapper.xml" />
    </mappers>
</configuration>
mybatis.xml
# Global logging configuration
log4j.rootLogger=Info,stdout,R
# MyBatis logging configuration...
log4j.logger.com.mybatis=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:\logs\log.log   
log4j.appender.R.layout=org.apache.log4j.PatternLayout
1log4j.appender.R.layout.ConversionPattern=%m %n
log4j.properties

com.mybatis.po包

package com.mybatis.po;

public class Account {
    private int id;
    private String accNo;
    private int password;
    private String name;
    private double balance;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getAccNo() {
        return accNo;
    }
    public void setAccNo(String accNo) {
        this.accNo = accNo;
    }
    public int getPassword() {
        return password;
    }
    public void setPassword(int password) {
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getBalance() {
        return balance;
    }
    public void setBalance(double balance) {
        this.balance = balance;
    }
    
    
}
Account.java
package com.mybatis.po;

public class Log {
    private int id;
    private String accIn;
    private String accOut;
    private double money;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getAccIn() {
        return accIn;
    }
    public void setAccIn(String accIn) {
        this.accIn = accIn;
    }
    public String getAccOut() {
        return accOut;
    }
    public void setAccOut(String accOut) {
        this.accOut = accOut;
    }
    public double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    
}
Log.java
package com.mybatis.po;

import java.util.List;

public class PageInfo {
    private int pageSize;
    private int pageNumber;
    private long total;
    private List<?> list;
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getPageNumber() {
        return pageNumber;
    }
    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }
    public long getTotal() {
        return total;
    }
    public void setTotal(long total) {
        this.total = total;
    }
    public List<?> getList() {
        return list;
    }
    public void setList(List<?> list) {
        this.list = list;
    }
    
    
}
PageInfo.java

com.mybatis.mapper

<?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.mybatis.mapper.AccountMapper">
    <!-- 根据账号和密码查询信息 -->
    <select id="selByAccnoPwd" resultType="Account" parameterType="Account">
        SELECT * from account where accno=#{accNo} and password =#{password}
    </select>

    <!-- 根据账号和姓名查询信息 -->
    <select id="selByAccnoName" resultType="Account" parameterType="Account">
        SELECT * from account where accno=#{accNo} and name =#{name}
    </select>

    <!-- 转账 -->
    <update id="updBalanceByAccno" parameterType="Account">
        UPDATE account set balance=balance+#{balance} where accno=#{accNo}
    </update>
</mapper>
AccountMapper.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.mybatis.mapper.LogMapper">
    <!-- 插入转账记录 -->
    <insert id="insLog" parameterType="Log">
        insert into log values(default,#{accOut},#{accIn},#{money})
    </insert>
    <!-- 转账日志表分页数据 -->
    <select id="selByPage" parameterType="map" resultType="Log">
        select * from log limit #{pageStart},#{pageSize}
    </select>
    <!-- 日志表的总条数 -->
    <select id="selCount" resultType="long">
        select count(1) from log
    </select>
</mapper>
LogMapper.xml

com.mybatis.service

package com.mybatis.service;

import java.io.IOException;

import com.mybatis.po.Account;

public interface AccountService {
    /**
     * 账号和密码不匹配码
     */
    int ACCOUNT_PASSWORD_NOT_MATCH=1;
    
    /**
     * 余额不足
     */
    int ACCOUNT_BALANCE_NOT_ENOUGH=2;
    
    /**
     * 账户姓名不匹配
     */
    int ACCOUNT_NAME_MATCH=3;
    
    /**
     * 异常,转账失败
     */
    int ERROR=4;
    
    /**
     * 转账成功
     */
    int SUCCESS=5;
    
    /**
     * 转账
     * @param accIn 收账账号
     * @param accOut 转账账号
     * @return
     */
    int transfer(Account accIn,Account accOut) throws IOException;
}
AccountService.java
package com.mybatis.service;

import java.io.IOException;

import com.mybatis.po.PageInfo;

public interface LogService {
    /**
     * 分页显示
     * @param pageSize
     * @param pageNumber
     * @return
     */
    PageInfo showPage(int pageSize,int pageNumber) throws IOException;
}
LogService.java

com.mybatis.service.impl

package com.mybatis.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;

import com.mybatis.po.Account;
import com.mybatis.po.Log;
import com.mybatis.service.AccountService;

public class AccountServiceImpl implements AccountService {

    @Override
    public int transfer(Account accIn, Account accOut) throws IOException {
        InputStream is=Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
        SqlSession session=factory.openSession();
        
        //先判断账号和密码是否配备
        Account accOutSelect=session.selectOne("com.mybatis.mapper.AccountMapper.selByAccnoPwd",accOut);
        if (accOutSelect!=null) {
            //判断余额是否大于或等于取款金额
            if(accOutSelect.getBalance()>=accOut.getBalance()){
                Account accInSelect=session.selectOne("com.mybatis.mapper.AccountMapper.selByAccnoName",accIn);
                //判断账号和姓名是否正确
                if(accInSelect!=null){
                    //设置收款账号的收入金额
                    accIn.setBalance(accOut.getBalance());
                    //设置转账账号的转出金额
                    accOut.setBalance(-accOut.getBalance());
                    int index=session.update("com.mybatis.mapper.AccountMapper.updBalanceByAccno",accOut);
                    index+=session.update("com.mybatis.mapper.AccountMapper.updBalanceByAccno",accIn);
                    if(index==2){
                        //数据库日志表记录
                        Log log=new Log();
                        log.setAccIn(accIn.getAccNo());
                        log.setAccOut(accOut.getAccNo());
                        log.setMoney(accIn.getBalance());
                        session.insert("com.mybatis.mapper.LogMapper.insLog",log);
                        //日志文件记录
                        Logger logger=Logger.getLogger(AccountServiceImpl.class);
                        logger.info(log.getAccOut()+"给"+log.getAccIn()+"在"+new Date().toLocaleString()+"转了"+log.getMoney());
                        
                        session.commit();
                        session.close();
                        return SUCCESS;
                    }else {
                        session.rollback();
                        session.close();
                        return ERROR;
                    }
                }else {
                    //账号姓名不匹配
                    session.close();
                    return ACCOUNT_NAME_MATCH;
                }
            }else {
                //余额不足
                session.close();
                return ACCOUNT_BALANCE_NOT_ENOUGH;
            }
        }else {
            //账号密码不匹配
            session.close();
            return ACCOUNT_PASSWORD_NOT_MATCH;
        }
    }
    
}
AccountServiceImpl.java
package com.mybatis.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.mybatis.po.Log;
import com.mybatis.po.PageInfo;
import com.mybatis.service.LogService;

public class LogServiceImpl implements LogService {

    @Override
    public PageInfo showPage(int pageSize, int pageNumber) throws IOException {
        InputStream is= Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
        SqlSession session=factory.openSession();
        
        Map<String, Object> param=new HashMap<String, Object>();
        param.put("pageStart", pageSize*(pageNumber-1));
        param.put("pageSize", pageSize);
        List<Log> list=session.selectList("com.mybatis.mapper.LogMapper.selByPage",param);
        long count=session.selectOne("com.mybatis.mapper.LogMapper.selCount");
        
        PageInfo pi=new PageInfo();
        pi.setList(list);
        pi.setPageNumber(pageNumber);
        pi.setPageSize(pageSize);
        pi.setTotal(count%pageSize==0?count/pageSize:count/pageSize+1);
        return pi;
    }

}
LogServiceImpl.java

com.mybatis.servlet

package com.mybatis.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.mybatis.service.LogService;
import com.mybatis.service.impl.LogServiceImpl;

@WebServlet("/show")
public class ShowServlet extends HttpServlet {
    private LogService LogService=new LogServiceImpl();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //判断是否是第一次打开,如果是,则显示第一页
        int pageSize=2;
        String pageSizeStr=req.getParameter("pageSize");
        if(pageSizeStr!=null&&!pageSizeStr.equals("")){
            pageSize=Integer.parseInt(pageSizeStr);
        }
        
        int pageNumber=1;
        String pageNumberStr=req.getParameter("pageNumber");
        if(pageNumberStr!=null&&!pageNumberStr.equals("")){
            pageNumber=Integer.parseInt(pageNumberStr);
        }
        
        req.setAttribute("pageInfo", LogService.showPage(pageSize, pageNumber));
        req.getRequestDispatcher("log.jsp").forward(req, resp);
    }
    
}
ShowServlet.java
package com.mybatis.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.mybatis.po.Account;
import com.mybatis.service.AccountService;
import com.mybatis.service.impl.AccountServiceImpl;

@WebServlet("/transfer")
public class TransferServlet extends HttpServlet {
    private AccountService accService=new AccountServiceImpl();
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        Account accOut=new Account();
        accOut.setAccNo(req.getParameter("accOutNo"));
        accOut.setPassword(Integer.parseInt(req.getParameter("accOutPwd")));
        accOut.setBalance(Double.parseDouble(req.getParameter("accOutBalance")));
        
        Account accIn=new Account();
        accIn.setAccNo(req.getParameter("accInAccNo"));
        accIn.setName(req.getParameter("accInName"));
        int index=accService.transfer(accIn, accOut);
        if(index==AccountService.SUCCESS){
            resp.sendRedirect("/mybatis04/show");
        }else {
            HttpSession session=req.getSession();
            session.setAttribute("code", index);
            resp.sendRedirect("/mybatis04/error.jsp");
        }
    }
    
}
TransferServlet.java

WebRoot

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'error.jsp' starting page</title>

  </head>
  
  <body>
  对不起操作失败:<br/>
  错误原因:
  ${ sessionScope.code }
  </body>
</html>
error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>转账记录</title>
  </head>
  
  <body>
  <table border=1>
      <tr>
          <th>转账账号</th>
          <th>收账账号</th>
          <th>转账金额</th>
      </tr>
      <c:forEach items="${pageInfo.list }" var="log">
          <tr>
              <td>${log.accOut }</td>
              <td>${log.accIn }</td>
              <td>${log.money }</td>
          </tr>
      </c:forEach>
  </table>
  <a href="show?pageSize=${pageInfo.pageSize }&pageNumber=${pageInfo.pageNumber -1 } " <c:if test="${pageInfo.pageNumber<=1 }" > onclick="javascript:return false" </c:if>>上一页</a>
  <a href="show?pageSize=${pageInfo.pageSize }&pageNumber=${pageInfo.pageNumber +1 } " <c:if test="${pageInfo.pageNumber>=pageInfo.total }"> onclick="javascript:return false" </c:if>>下一页</a>
  </body>
</html>
log.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>转账</title>
  </head>
  
  <body>
    <form action="transfer" method="post">
        转账账户:<input type="text" name="accOutNo"/><br/>
        密码:<input type="password" name="accOutPwd" /><br/>
        金额:<input type="text" name="accOutBalance" /><br/>
        
        收款账户:<input type="text" name="accInAccNo"/><br/>
        收款人姓名:<input type="text" name="accInName"/><br/>
        <input type="submit" value="转账">
    </form>
  </body>
</html>
index.jsp
原文地址:https://www.cnblogs.com/qc-wh/p/11684625.html