入门第二天

目的:使用Mybatis对数据库中的数据进行简单的操作。例如:增、删、改、查、

前言:同样是使用idea创建一个普通的maven工程(如何创建一个普通的Maven工程可以参考入门第一天的详解)。

   第一天:https://www.cnblogs.com/LBJLAKERS/p/11324234.html

   数据库中的表仍然使用第一天的数据库表(新建表和添加数据的sql语句见第一天的分析)。

代码来了。。。。。。。。。。。。。。

  首先看一下所有的文件的路径和结构

  1. 在pom.xml文件中导入坐标

     <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion> <groupId>zh.test.mybatis</groupId>
    <artifactId>zh_mybatis02</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
    <!-- mybatis坐标 -->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.5</version>
    </dependency>
    <!--mysql驱动包-->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.6</version>
    </dependency>
    <!--单元测试-->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <!--日志-->
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    </dependency>
    </dependencies> </project>
  2. 添加一个NBAPlaers的Java文件,对应数据库中的字段
     package zh.test.domain;
    
     import java.io.Serializable;
    import java.util.Date; /*
    编写一个User的实体类,并且实现Serializable接口,目的只是表示一个类的对象可以被序列化。
    什么是Serializable接口?
    一个对象序列化的接口,一个类只有实现了Serializable接口,他的对象才能被序列化
    */
    public class NBAPlaers implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address; @Override
    public String toString() {
    return "NBAPlaers{" +
    "id=" + id +
    ", username='" + username + '\'' +
    ", birthday=" + birthday +
    ", sex='" + sex + '\'' +
    ", address='" + address + '\'' +
    '}';
    } public Integer getId() {
    return id;
    } public void setId(Integer id) {
    this.id = id;
    } public String getUsername() {
    return username;
    } public void setUsername(String username) {
    this.username = username;
    } public Date getBirthday() {
    return birthday;
    } public void setBirthday(Date birthday) {
    this.birthday = birthday;
    } public String getSex() {
    return sex;
    } public void setSex(String sex) {
    this.sex = sex;
    } public String getAddress() {
    return address;
    } public void setAddress(String address) {
    this.address = address;
    }
    }
  3. 新建一个UserMapper的接口,里面主要是要对数据库进行的哪些操作。如下:进行了多种操作

     package zh.test.mapper;
    
     import zh.test.domain.NBAPlaers;
    
     import java.util.List;
    
     /*
    用户映射接口
    */
    public interface UserMapper {
    //查询所有的数据
    public List<NBAPlaers> findAll();
    //根据条件查询
    public NBAPlaers findById(int id);
    //插入数据
    public int insert(NBAPlaers nbaPlaers);
    //修改数据
    public int update(NBAPlaers nbaPlaers);
    //删除一条数据
    public int delete(int id);
    //模糊查询
    public List<NBAPlaers> findBylike(NBAPlaers name);
    //聚合函数查询
    public int findcount();
    }
  4. 写一个jdbc.properties的属性文件,用来编写连接数据库的配置
     driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/javaDemo?characterEncoding=utf8
    username=root
    password=root
  5. 配置SqlMapConfig.xml。读取数据库的属性配置文件,配置环境。以及加载
    Usermapper.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>
    <!--加载jdbc的属性配置文件-->
    <properties resource="jdbc.properties"/>
    <!--配置实体类的别名-->
    <typeAliases>
    <!--
    type:实体类的全路径
    alias:取的一个别名,不区分大小写,在配置文件调用这个实体类的时候就可以使用别名。
    -->
    <typeAlias type="zh.test.domain.NBAPlaers" alias="nbaers"/>
    <!--如果有多个实体类可以写为:包名。别名则就是【类名】-->
    <!--<package name="zh.test.domain"/>-->
    </typeAliases>
    <!--配置多个环境-->
    <environments default="mysql">
    <!--配置环境-->
    <environment id="mysql">
    <!--配置事物管理,使用本地的事物策略-->
    <transactionManager type="JDBC"></transactionManager>
    <!--是否要是要连接池 POOLED UNPOOLED-->
    <dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
    <!--<property name="url" value="jdbc:mysql:///javaDemo"/>-->
    </dataSource>
    </environment>
    </environments>
    <!--引入映射的配置文件-->
    <mappers>
    <mapper resource="mappers/Usermapper.xml"></mapper>
    </mappers>
    </configuration>
  6. 编写相对应的Usermapper.xml文件,用来编写有关对数据操作的配置
     <?xml version="1.0" encoding="UTF-8"?>
    <!--约束 dtd约束-->
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--
    namespace:用来区分mapper接口的,一般写mapper的全路径
    --> <mapper namespace="zh.test.mapper.UserMapper">
    <!--
    id属性:表示接口中方法的名称
    resultType:方法返回值类型,全限定路径(包名+类名)
    -->
    <select id="findAll" resultType="zh.test.domain.NBAPlaers">
    /*
    编写对应的sql语句
    */
    select * from NBAPlaers;
    </select>
    <!--根据条件查询-->
    <!--
    id:findById 方法的名称
    parameterType:方法参数的类型
    resultType:方法返回值的类型 ? 不能使用?作为占位符,使用#{} 或${}来编写,推荐使用#{}
    区别:1、#{}.
    2、${}
    以上两种,当方法的参数为【引用类型】的时候,两种都可以使用,没有区别
    当方法的参数为【普通数据类型(int double )】推荐使用#{此处的方法的名字可以随意命名},但是${此处的方法的名字的参数必须与写value}
    -->
    <select id="findById" parameterType="java.lang.Integer" resultType="zh.test.domain.NBAPlaers">
    select * from NBAPlaers where id=#{id}
    </select>
    <!--新增-->
    <!--
    #{OGNL表达式}:对象导航语言,表达式语言。语法和el表达式相似
    el表达式只能在jsp页面上使用。OGNL表达式既可以在页面上又可以在配置文件中使用。
    -->
    <insert id="insert" parameterType="zh.test.domain.NBAPlaers">
    -- keyProperty="封装数据使用的属性"
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
    select last_insert_id();
    </selectKey>
    insert into NBAPlaers (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
    </insert>
    <!--修改数据-->
    <update id="update" parameterType="zh.test.domain.NBAPlaers">
    update NBAPlaers set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id};
    </update>
    <!--删除一条数据-->
    <delete id="delete" parameterType="java.lang.Integer">
    delete from NBAPlaers where id=#{id};
    </delete>
    <!--模糊查询-->
    <select id="findBylike" parameterType="java.lang.String" resultType="zh.test.domain.NBAPlaers">
    select * from NBAPlaers where username like #{username}
    </select>
    <!--聚合函数查询-->
    <select id="findcount" resultType="java.lang.Integer">
    select COUNT(*) from NBAPlaers;
    </select>
    <!--
    resultMap:用来进行数据的封装
    id="唯一的名称,用来被引用"
    type="进行数据封装的数据的类型"
    -->
    <resultMap id="nbaMapper" type="zh.test.domain.NBAPlaers">
    <!--
    property="JavaBean中的属性"
    column="表中的字段"
    -->
    <result property="id" column="id"></result>
    <result property="username" column="_username"></result>
    <result property="sex" column="_sex"></result>
    <result property="address" column="_address"></result>
    </resultMap>
    </mapper>
  7. 最后。。。。对相应的功能进行测试
     package test;
    
     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.junit.Test;
    import zh.test.domain.NBAPlaers;
    import zh.test.mapper.UserMapper; import java.io.IOException;
    import java.io.InputStream;
    import java.net.SocketTimeoutException;
    import java.util.Date;
    import java.util.List; public class Demo { @Test
    public void findUserAll() throws IOException {
    //加载主配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    //获取到代理对象,mybatis框架生成代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    //mapper指向就是代理对象
    List<NBAPlaers> allPlayers = mapper.findAll();
    for(NBAPlaers user:allPlayers)
    {
    System.out.println(user);
    }
    sqlSession.close();
    resourceAsStream.close();
    } @Test
    public void findById() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    NBAPlaers nbaPlaer = mapper.findById(2);
    System.out.println(nbaPlaer);
    sqlSession.close();
    resourceAsStream.close();
    // 这里代码看不懂可以查看mybatis01的代码
    } // 插入数据
    @Test
    public void insert() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    NBAPlaers nba=new NBAPlaers();
    nba.setAddress("洛杉矶");
    nba.setBirthday(new Date());
    nba.setSex("男");
    nba.setUsername("裤子马");
    int insert = mapper.insert(nba);
    System.out.println(insert);
    //到这运行控制台会输入执行一行数据成功,但是但是但是这条数据并没有插入到数据库中。没有commit commit commit!!!!
    //Setting autocommit to false on JDBC Connection
    //要手动提交事物
    sqlSession.commit(); //其中sqlSession.rollback();为回滚
    //获取刚才插入数据的ID值,注意:需要在UserMapper.xml中配置文件
    Integer id = nba.getId();
    System.out.println("id:"+id);
    sqlSession.close();
    resourceAsStream.close(); }
    // 修改数据
    @Test
    public void update() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    NBAPlaers nba=new NBAPlaers();
    nba.setUsername("隆多");
    nba.setSex("男");
    nba.setBirthday(new Date());
    nba.setAddress("洛杉矶");
    nba.setId(7);
    int update = mapper.update(nba);
    //提交事物
    sqlSession.commit();
    System.out.println(update);
    sqlSession.close();
    resourceAsStream.close();
    }
    // 删除数据
    @Test
    public void delte() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    NBAPlaers nba=new NBAPlaers();
    int update = mapper.delete(7);
    //提交事物
    sqlSession.commit();
    System.out.println(update);
    sqlSession.close();
    resourceAsStream.close();
    }
    //模糊查询
    @Test
    public void findBilike() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    NBAPlaers nba=new NBAPlaers();
    nba.setUsername("%L%");
    List<NBAPlaers> bylike = mapper.findBylike(nba);
    for(NBAPlaers nba1:bylike)
    {
    System.out.println(nba1);
    }
    sqlSession.close();
    resourceAsStream.close();
    }
    //聚合函数的查询数据量
    @Test
    public void findcount() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int count = mapper.findcount();
    System.out.println(count);
    sqlSession.close();
    resourceAsStream.close();
    }
    }

分享之路,欢迎交流

解析Mybatis入门第二天的更多相关文章

  1. 解析Mybatis入门第一天

    MyBatis是一个基于Java的持久层框架,内部对JDBC做了封装,使开发者只需要关注SQL语句,而不用关注JDBC的代码,使开发变得更加的简单. MyBatis通过XML或者注解的方式将要执行的各 ...

  2. MyBatis入门基础(一)

    一:对原生态JDBC问题的总结 新项目要使用mybatis作为持久层框架,由于本人之前一直使用的Hibernate,对mybatis的用法实在欠缺,最近几天计划把mybatis学习一哈,特将学习笔记记 ...

  3. 【转载】 mybatis入门系列四之动态SQL

    mybatis 详解(五)------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when, ...

  4. Mybatis系列(一):Mybatis入门

    一.Mybatis是什么 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改 ...

  5. Mybatis入门及Dao开发方式

    本节内容: Mybatis介绍 使用jdbc编程问题总结 Mybatis架构 Mybatis入门程序 Dao的开发方式 SqlMapConfig.xml文件说明 一.Mybatis介绍 MyBatis ...

  6. MyBatis入门基础

    转自http://www.cnblogs.com/selene/p/4604605.html 话不多说,先看看原始的JDBC程序代码,看看这样的代码存在什么样子的问题. package com.uti ...

  7. 写给新手看的 MyBatis 入门

    目录 MyBatis 使用前的准备 什么是 MyBatis 使用Maven 进行 MyBatis 开发环境搭建 MyBatis 入门 项目整体结构一览 MyBatis 的简单生命周期 1.获取 Sql ...

  8. mybatis入门案例自定义实现

    mybatis入门案例自定义实现 一.需要实现的类和接口 public static void main(String[] args) throws Exception{ //1.读取配置文件 Inp ...

  9. Mybatis入门(一)------基本概念操作

    Mybatis简介 Mybatis是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置 ...

随机推荐

  1. 5-MySQL-Ubuntu-操作数据库的基本操作语句

    注意: (1)每一条sql语句都是以分号(;)结尾! (2)数据库的默认charset不支持中文,所以每次在创建数据库的时候要指定字符集charset=utf8; (一) 查看当前时间: select ...

  2. vue-cli 利用moment.js转化时间格式为YYYY年MM月DD日,或者是YYYY-MM-DD HH:MM:SS 等格式

    1.在mian.js引入moment import moment from 'moment' Vue.prototype.$moment = 'moment' 2. 在main.js 设置全局过滤器 ...

  3. Html+css编写太阳星系

    我们都知道太阳系是以太阳为中心的,和所有受到太阳的引力约束天体的集合体.包括八大行星(由离太阳从近到远的顺序:水星.金星.地球.火星.木星.土星.天王星.海王星),而我用html和css所写的就是八大 ...

  4. drop,delete与truncate的区别

    drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字句. (1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将 ...

  5. CodeForces祝贺上紫

    还是靠手速了. 不少比赛,经常差几分钟/一个细节就能AC一道比较难的题目. 加油! P.S 只能当成休闲性质,不能再当成正业了.迈向科研...

  6. vue-组件之间的通信:

    组件之间的通信:一个组件被调用,那么里面的数据就需要从前者调用,因为在开发中组件时重复调用的,在页面中会反复使用,但是里面的数据是不一样的,谁调用这个组件谁就传递数据给这个组件,所以就要暴露一些接口, ...

  7. DELPHI 异常处理2

    今天在写用ADO从EXCEL导入数据的程序时,出现个错误,弄了很久都弄不好,最后还是用异常处理解决掉了. 数据中日期在导入之前要转换成日期格式,虽然说一个strtodate就可以转好了,但是数据中的日 ...

  8. NX二次开发-UFUN选择草图对话框UF_UI_select_sketch

    #include <uf.h> #include <uf_ui.h> UF_initialize(); //选择草图对话框 char sMessage[] = "选择 ...

  9. NX二次开发-打开弹出当前part所在的文件夹

    #include <uf.h> #include <uf_part.h> #include <atlstr.h> #include <iostream> ...

  10. hdu多校第九场 1002 (hdu6681) Rikka with Cake 树状数组维护区间和/离散化

    题意: 在一块长方形蛋糕上切若干刀,每一刀都是从长方形某条边开始,垂直于这条边,但不切到对边,求把长方形切成了多少块. 题解: 块数=交点数+1 因为对于每个交点,唯一且不重复地对应着一块蛋糕. 就是 ...