天天看点

MyBatis初体验(一)

MyBatis初体验(一)

    • 准备工作
      • 数据库建表
      • 目录结构
      • POJO类
      • pom文件
      • 全局配置文件SQLMapConfig.xml
    • 测试
      • 映射文件UserMapper.xml
      • 测试类

这里先简单搭建一个基于MySQL数据库的MyBatis框架,只要照抄,就能体验MyBatis的增删改查,话不多说,直接上干货(详细的以后慢慢讲)

准备工作

数据库建表

DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(32) NOT NULL COMMENT '用户名称',
      `birthday` date DEFAULT NULL COMMENT '生日',
      `sex` char(1) DEFAULT NULL COMMENT '性别',
      `address` varchar(256) DEFAULT NULL COMMENT '地址',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
    INSERT INTO `user` VALUES ('1', '张三', '2018-07-10', '男', '北京');
    INSERT INTO `user` VALUES ('2', '李四', '2018-07-10', '男', '上海');
    INSERT INTO `user` VALUES ('3', '王五', '2018-07-10', '男', '广州');
    INSERT INTO `user` VALUES ('4', '王六', '2018-07-10', '男', '深圳');
           

目录结构

先创建一个空(不使用骨架)的maven项目

MyBatis初体验(一)

POJO类

POJO(plain old java object):(译)普通的java对象,一般只有属性和get、set方法。

public class User {
        private Integer id;
        private String username;
        private String birthday;
        private String sex;
        private String address;
        //get、set方法自行添加
    }
           

pom文件

<dependencies>
        <!--mybatis的jar包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!--单元测试的jar包-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--mysql的驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
    </dependencies>
           

全局配置文件SQLMapConfig.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>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybase?characterEncoding=utf8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="com/kouankeji/mapper/UserMapper.xml"/>
        </mappers>
    </configuration>
           

测试

映射文件与测试类对应着看

映射文件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="userMapper">
        <!--查询全部-->
        <select id="findAll" resultType="com.kouankeji.domain.User">
            select * from user;
        </select>
        <!--通过id查询-->
        <select id="findById" parameterType="java.lang.Integer" resultType="com.kouankeji.domain.User">
            <!--也可以使用${value},但括号里只能写value;#{}可以防注入,自动转换类型,里面随便写也能对应上(所以我写abc没有写id)-->
            select * from user where id = #{abc};
        </select>
        <!--通过用户名模糊查询-->
        <select id="findByUserNameLike" parameterType="java.lang.String" resultType="com.kouankeji.domain.User">
            select * from user where username like "%"#{username}"%"
        </select>
        <!--添加用户-->
        <insert id="save" parameterType="com.kouankeji.domain.User">
    --      主键映射===>将主键自增长的列映射到要添加的数据中,否则获取不到数据
    --      keyProperty: 映射的pojo中的属性
    --      keyColumn: 映射数据库中的主键
    --      resultType: 返回值类型
    --      order: 在insert之前获取还是在insert之后获取
            <selectKey keyProperty="id" keyColumn="id" resultType="java.lang.Integer" order="AFTER">
                select last_insert_id();
            </selectKey>
            insert into user values (null,#{username},#{birthday},#{sex},#{address})
        </insert>
        <!--更新用户-->
        <update id="update" parameterType="com.kouankeji.domain.User">
            update user set username = #{username} ,address = #{address},sex = #{sex},birthday = #{birthday} where id = #{id};
        </update>
        <!--删除用户-->
        <delete id="del" parameterType="java.lang.Integer">
            delete from user where id = #{abc};
        </delete>
    </mapper>
           

测试类

private SqlSession sqlSession;
    @Before
    public void init() {
        /**
         * InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
         * 通过此方法也可以获得输入流,与下面方法的区别:会抛出异常
         */
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("SqlMap
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream
        sqlSession = sqlSessionFactory.openSession();
    }
                                                                                   
    @Test//查询全部
    public void testFindAll(){
        List<User> list = sqlSession.selectList("userMapper.findAll");
        for (User user : list) {
            System.out.println(user);
        }
    }
                                                                                   
    @Test//通过id查询
    public void findById() {
        User user = sqlSession.selectOne("userMapper.findById", 2);
        System.out.println(user);
    }
                                                                                   
    @Test//通过姓名模糊查询
    public void findByUserNameLike() {
        List<User> list = sqlSession.selectList("userMapper.findByUserNameLike", "王");
        for (User user : list) {
            System.out.println(user);
        }
    }
                                                                                   
    @Test//新增用户
    public void save() {
        User user = new User();
        user.setUsername("王老二");
        user.setAddress("中国");
        user.setBirthday("2013-08-23");
        user.setSex("男");
        sqlSession.insert("userMapper.save", user);
        System.out.println(user);//如果不进行主键映射,打印出的user没有id
        sqlSession.commit();//对表进行修改后记得提交事务,否则无效
    }
                                                                                   
    @Test//修改用户
    public void update() {
        User user = new User();
        user.setId(5);
        user.setSex("女");
        user.setUsername("王强");
        user.setBirthday("2003-08-23");
        user.setAddress("吉林");
        sqlSession.update("userMapper.update", user);
        System.out.println(user);
        sqlSession.commit();//对表进行修改后记得提交事务,否则无效
    }
                                                                                   
    @Test//删除用户
    public void delete() {
        int delete = sqlSession.delete("userMapper.del", 5);
        sqlSession.commit();//对表进行修改后记得提交事务,否则无效
        System.out.println(delete);//1\0;删除成功\失败
    }
                                                                                   
    @After//释放资源
    public void close() {
        sqlSession.close();
    }
           

这里简单说一下Junit的几个常用注解

  • @BeforeClass : 表示在类中的任意public static void方法执行之前执行
  • @AfterClass : 表示在类中的任意public static void方法执行之后执行
  • @Before : 表示在任意使用@Test注解标注的public void方法执行之前执行
  • @After : 表示在任意使用@Test注解标注的public void方法执行之后执行
  • @Test : 使用该注解标注的public void方法会表示为一个测试方法

继续阅读