首页 > 技术文章 > Java web开发(12)Mybatis入门

legion 2018-08-27 16:05 原文

入门案例操作一个单表,user,在数据库hello中

表结构

  Field Type Comment
id int(11) NOT NULL  
  username varchar(32) NOT NULL 用户名称
  birthday date NULL 生日
  sex char(1) NULL 性别
  address varchar(256) NULL 地址

对应的User.java文件,包名com.legion.hello

public class User {
    
    //属性名和数据库表的字段对应
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
//getter and setter
...
}

本节简单目标:通过id查询一行数据。

操作步骤:

1.新建一个简单Maven 普通jar工程。

pom.xml内容如下

<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>com.nothing</groupId>
    <artifactId>MyBatisDay01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
</project>

2.

新建一个source folder ,config,里面新建2个log4j.properties和SqlMapConfig.xml

# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# 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

 别名定义

在SqlMapConfig.xml中使用标签,<typeAliases>,提供包名,那么Mapper配置文件中,对于POJO类,使用类名代替类的完整路径,

比如user代替com.legion.ssm.dao.User

    <!-- 别名定义 -->
    <typeAliases>
        

        <!-- 批量别名定义 
        指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)
        -->
        <package name="cn.itcast.ssm.po"/>
        
    </typeAliases>

 

<?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>

    
    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事务管理,事务控制由mybatis-->
            <transactionManager type="JDBC" />
        <!-- 数据库连接池,由mybatis管理-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/hello" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!-- 加载 映射文件 -->
    <mappers>
        
        <package name="com.legion.mapper"/>

    </mappers>
    
</configuration>

3.编写DAO接口UserMapper.java和其映射文件UserMapper.xml。

package com.legion.mapper;

import com.legion.hello.User;

public interface UserMapper {
    public User findUserById(int id) throws Exception;
}

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.legion.mapper.UserMapper">
    <select id="findUserById" parameterType="int"
        resultType="com.legion.hello.User">
        select * from user where id=#{value}
    </select>
</mapper>

 

注意:遵循下述规范,MyBatis会为UserMapper接口生成代理对象

1.两个文件都属于包com.legion.mapper,已经在SqlMapperConfig中配置,通过搜索包名加载所有映射文件。

2.mapper.xml中的namespace就是UserMapper接口全路径。

3.UserMapper.java 中的 方法名和UserMapper.xml中的statement id一致。

4.接口方法输入参数类型和xml中的对应statement 的parameterType类型一致。

5.接口方法的返回值类型和xml中的对应statement的resultType类型一致。

 

测试代码

public class MyTest {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setup() throws Exception{
        String resource = "SqlMapConfig.xml";
        // 得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 创建会话工厂,传入mybatis的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
    }
    @Test
    public void testFindUserByName() throws Exception{
        SqlSession session=sqlSessionFactory.openSession();
        UserMapper userMapper=session.getMapper(UserMapper.class);
        User user=userMapper.findUserById(25);
        System.out.println(user);
    }
}

 

 

 

推荐阅读