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
  • 相关阅读:
    poj 2528 Mayor's posters (线段树+离散化)
    poj 1201 Intervals (差分约束)
    hdu 4109 Instrction Arrangement (差分约束)
    poj 1195 Mobile phones (二维 树状数组)
    poj 2983 Is the Information Reliable? (差分约束)
    树状数组 讲解
    poj 2828 Buy Tickets (线段树)
    hdu 1166 敌兵布阵 (树状数组)
    Ubuntu网络配置
    Button控制窗体变量(开关控制灯的状态)
  • 原文地址:https://www.cnblogs.com/qc-wh/p/11684625.html
Copyright © 2011-2022 走看看