zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Qt 的插件制作遇到的问题
    Qt实现原生Flow实现不了的Item错误排列效果,类似淘宝商品展示
    通过pro文件使Qt的build目录更清爽
    No rule to make target
    Qtcreator中printf()/fprintf()不显示问题处理方法
    QtCreator集成的MSVC套件有问题
    启动程序失败,路径或者权限错误
    图数据库 Nebula Graph 的数据模型和系统架构设计
    NLP(十六)轻松上手文本分类
    NLP(十五)让模型来告诉你文本中的时间
  • 原文地址:https://www.cnblogs.com/qc-wh/p/11684625.html
Copyright © 2011-2022 走看看