MyBatis-入门

1、项目结构:

├── pom.xml
├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── xh
│       │           └── mybatisLearn
│       │               ├── bean
│       │               │   └── User.java
│       │               ├── dao
│       │               │   └── UserMapper.java
│       │               └── Test.java
│       ├── resources
│       │   ├── mapper
│       │   │   └── UserMapper.xml
│       │   └── mybatis
│       │       └── mybatis-config.xml

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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.xh.mybatisLearn</groupId>
  <artifactId>mybatisLearn</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>mybatisLearn Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.0</version>
    </dependency>

    <dependency>
      <groupId>org.wisdom-framework</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.34_1</version>
    </dependency>

  </dependencies>
  <build>
    <finalName>mybatisLearn</finalName>
  </build>
</project>

 

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>
    <typeAliases>
        <typeAlias type="com.xh.mybatisLearn.bean.User" alias="User"/>
    </typeAliases>

    <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://localhost/mybatisLearn"/>
                <property name="username" value="mysql"/>
                <property name="password" value="mysql"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

</configuration>

 

User.java:

package com.xh.mybatisLearn.bean;

/**
 * Created by root on 2/27/18.
 */
public class User {
    private int id;
    private String username;
    private int age;

    //TODO
    //没有这个构造方法会报错,而且int要改为Integer
    public User(Integer id, String username, Integer age) {
        this.id = id;
        this.username = username;
        this.age = age;
    }

    public User(String username, int age) {
        this.username = username;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
}

 后来发现不是一定要有这个这个构造器,因为如果属性非常多的话不是很蛋疼,而且有涉及基本类型向引用类型转化的问题。猜想可能是MyBatis利用反射在创建对象或是操作对象属性。那么就一定要有无参的构造器。所以把User(Integer id, String username, Integer age)改成无参就可以啦。

 

UserMapper.java :

package com.xh.mybatisLearn.dao;

import com.xh.mybatisLearn.bean.User;

import java.util.List;

/**
 * Created by root on 2/27/18.
 */
public interface UserMapper {
    List<User> getAll();

    void addUser(User user);
}

 

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.xh.mybatisLearn.dao.UserMapper">
    <select id="selectUser" resultType="User">
        select * from user_tb where id = #{id}
    </select>

    <select id="getAll" resultType="User">
        select * from user_tb
    </select>

    <insert id="addUser" useGeneratedKeys="true"
            keyProperty="id">
        insert into user_tb (username,age) VALUES (#{username},#{age})
    </insert>
</mapper>

注意: namespace="com.xh.mybatisLearn.dao.UserMapper",这个对应接口,下面的id对应方法名。

 

Test.java:

package com.xh.mybatisLearn;


import com.xh.mybatisLearn.bean.User;
import com.xh.mybatisLearn.dao.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * Created by root on 2/27/18.
 */
public class Test {
    private static SqlSessionFactory sqlSessionFactory;

    private static SqlSessionFactory getSqlSessionFactory() {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        return sqlSessionFactory;
    }

    public static void main(String[] args) {
        sqlSessionFactory = getSqlSessionFactory();
        addOne();
        getAll();

    }

    private static void getAll() {
        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = userMapper.getAll();
            for (User u : userList
                    ) {
                System.out.println("getAll>>" + u.toString());
            }

        } finally {
            sqlSession.close();
        }
    }

    private static void addOne() {
        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User u1 = new User("u1", 21);
            userMapper.addUser(u1);
            //TODO
            sqlSession.commit();
        } finally {

            sqlSession.close();
        }
    }
}

 注意:sqlSession.commit();

 

源码:DefaultSqlSessionFactory.class

    public SqlSession openSession() {
        return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
    }

    public SqlSession openSession(boolean autoCommit) {
        return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, autoCommit);
    }

autoCommit 默认是false,我们可以指定true。

posted @ 2018-02-28 09:35  懒企鹅  阅读(211)  评论(0编辑  收藏  举报