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。