整合Mybatis框架相关

【参考文档】
mybatis官网
http://www.mybatis.org/mybatis-3/zh/index.html
教程
https://www.yiibai.com/mybatis/mybatis-curd.html
【Maven工程】





【添加依赖】
mybatis.xx.jar mysql-connector-java.xx.jar
手动改下版本号,再从maven依赖网站下载对应jar,放到本地


【查询demon】
新增resources/config目录

Configure.xml
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。后面的测试类会读取Configure.xml,构建SqlSessionFactory,获取session。url中的&为了满足格式要求,具体是时区和SSL配置。通过读取User.xml配置mapper。

<?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/likailun?verifyServerCertificate=false&amp;useSSL=false&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="admin123"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="config/User.xml"/>
  </mappers>
</configuration>

User.xml
UserMapper命名空间,测试类会调用,likailun.Mybatis.User对应结果集。

<?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="GetUserByID" parameterType="int" resultType="likailun.Mybatis.User">
		select * from user where id = #{id}
    </select>
</mapper>

User.java

package likailun.Mybatis;

public class User {
	private int id;
	private String name;
	private String dept;
	private String phone;
	private String website;
	
	public String getWebsite() {
		return website;
	}
	public void setWebsite(String website) {
		this.website = website;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDept() {
		return dept;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	
}

UserTest.java
首先读取Configure.xml,通过SqlSessionFactoryBuilder构建sqlSessionFactory,读取对应mapper方法,进行查询。

package likailun.Mybatis;

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class UserTest {
	private static SqlSessionFactory sqlSessionFactory;
	private static Reader reader;

	static {
		try {
			reader = Resources.getResourceAsReader("config/Configure.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			User user = (User) session.selectOne("UserMapper.GetUserByID", 1);
			if (user != null) {
				System.out.println(user);
			}
		} catch (Exception e) {
			System.out.println(e);
		} finally {
			session.close();
		}
	}

}

运行UserTest

【注解方式】
换用注解方式,之前mapper是通过Configure.xml添加,User.xml配置的。新增加UserTest1.java UserMapper.java Configure1.xml

Configure1.xml注释掉了UserMapper

<?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/likailun?verifyServerCertificate=false&amp;useSSL=false&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="admin123"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <!-- <mapper resource="config/User.xml"/> -->
  </mappers>
</configuration>

UserMapper.java 增加注解方法

import org.apache.ibatis.annotations.*;
public interface UserMapper {	
	@Select("select * from user where id = #{id}")
	User getUserByID(int id);
}

UserTest1.java
sqlSessionFactory增加mapper改用

sqlSessionFactory.getConfiguration().addMapper(UserMapper.class);

调用mapper则用

UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserByID(1);
public class UserTest1 {
	private static SqlSessionFactory sqlSessionFactory;
	private static Reader reader;

	static {
		try {
			reader = Resources.getResourceAsReader("config/Configure1.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
			sqlSessionFactory.getConfiguration().addMapper(UserMapper.class);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			UserMapper mapper = session.getMapper(UserMapper.class);
			User user = mapper.getUserByID(1);
			if (user != null) {
				System.out.println(user);
			}
		} catch (Exception e) {
			System.out.println(e);
		} finally {
			session.close();
		}
	}
}

【实际应用】
实际应用时,UserMapper中主要写接口,User.xml主要写语句,且保证namespace和UserMapper相同,mybatis才能找到。

Configure2.xml中com.mysql.cj.jdbc.Driver时6之后新驱动

<?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.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/likailun?verifyServerCertificate=false&amp;useSSL=false&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="admin123"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="config/User2.xml"/>
  </mappers>
</configuration>

User2.xml中likailun.Mybatis.UserMapper2和UserMapper2.java的路径相同,之后可以试下不相同时,报错信息。

<?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="likailun.Mybatis.UserMapper2">
	<select id="getUserByID" parameterType="int" resultType="likailun.Mybatis.User">
		select * from user where id = #{id}
    </select>
</mapper>   

UserMapper2.java注解去掉

public interface UserMapper2 {

	User getUserByID(int id);
}

UserTest2.java中,原先addMapper部分不需要,因为配置文件已经添加,后面仍调用mapper方法。

public class UserTest2 {
	private static SqlSessionFactory sqlSessionFactory;
	private static Reader reader;

	static {
		try {
			reader = Resources.getResourceAsReader("config/Configure2.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			UserMapper2 mapper = session.getMapper(UserMapper2.class);
			User user = mapper.getUserByID(1);
			if (user != null) {
				System.out.println(user);
			}
		} catch (Exception e) {
			System.out.println(e);
		} finally {
			session.close();
		}
	}
}

【增删改查CURD】

UserMapper.java

public interface UserMapper {

	public User getUserByID(int id);
	
    public List<User> getUserList();

    public void insertUser(User user);

    public void updateUser(User user);

    public void deleteUser(int id);
}

Configure.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.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/likailun?verifyServerCertificate=false&amp;useSSL=false&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="admin123"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="config/User.xml"/>
  </mappers>
</configuration>

User.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="likailun.Mybatis.UserMapper">
	<select id="getUserByID" parameterType="int" resultType="likailun.Mybatis.User">
		select * from user where id = #{id}
    </select>

    <insert id="insertUser" parameterType="likailun.Mybatis.User">
        insert into user(name, dept, website,phone) values(#{name}, #{dept}, #{website}, #{phone})
    </insert>

    <select id="getUserList" resultType="likailun.Mybatis.User">
        select * from user
    </select>

    <update id="updateUser" parameterType="likailun.Mybatis.User">
        update user set name = #{name}, dept = #{dept}, website = #{website}, phone = #{phone} where id = #{id}
    </update>

    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{id}
    </delete>
</mapper>

UserTest.java

public class UserTest {
	private static SqlSessionFactory sqlSessionFactory;
	private static Reader reader;

	static {
		try {
			reader = Resources.getResourceAsReader("config/Configure.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		deleteUser();
	}
	
    public static void insertUser()
    {
        try
        {
            SqlSession session = sqlSessionFactory.openSession();
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = new User();
            user.setName("Google");
            user.setDept("Tech");
            user.setWebsite("http://www.google.com");
            user.setPhone("120");
            mapper.insertUser(user);
            session.commit();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    
    public static void deleteUser()
    {
        try
        {
            SqlSession session = sqlSessionFactory.openSession();
            UserMapper mapper = session.getMapper(UserMapper.class);
            printUsers(mapper.getUserList());
            mapper.deleteUser(2);
            session.commit();
            printUsers(mapper.getUserList());
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    

    public static void updateUser()
    {
        try
        {
            SqlSession session = sqlSessionFactory.openSession();
            UserMapper mapper = session.getMapper(UserMapper.class);
            printUsers(mapper.getUserList());
            User user = mapper.getUserByID(1);
            user.setName("New name");
            mapper.updateUser(user);
            session.commit();
            printUsers(mapper.getUserList());
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    
    public static void getUserList() {
        try {
            SqlSession session = sqlSessionFactory.openSession();
            UserMapper mapper = session.getMapper(UserMapper.class);
            printUsers(mapper.getUserList());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private static void printUsers(final List<User> users) {
        for (User user : users) {
            System.out.println(user.getId() + user.getName() + user.getDept() + user.getWebsite());
        }
    }
    
}

配置文件中parameterType和resultType的说明:parameterType不填接口正常,resultType得填

<?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="likailun.Mybatis.UserMapper">
	<select id="getUserByID" resultType="likailun.Mybatis.User">
		select * from user where id = #{id}
    </select>

    <insert id="insertUser" parameterType="likailun.Mybatis.User">
        insert into user(name, dept, website,phone) values(#{name}, #{dept}, #{website}, #{phone})
    </insert>

    <select id="getUserList" resultType="likailun.Mybatis.User">
        select * from user
    </select>

    <update id="updateUser">
        update user set name = #{name}, dept = #{dept}, website = #{website}, phone = #{phone} where id = #{id}
    </update>

    <delete id="deleteUser">
        delete from user where id = #{id}
    </delete>
</mapper>

【多表查询】
association单个collection多个
association

Configure.xml添加mapper

  <mappers>
    <mapper resource="config/User.xml"/>
    <mapper resource="config/Post.xml"/>
  </mappers>

Post.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="likailun.Mybatis.PostMapper">

	<resultMap type="likailun.Mybatis.Post" id="resultPostsMap">
		<result property="postid" column="postid" />
		<result property="title" column="title" />
		<result property="content" column="content" />
		<!-- property="user"与post对象的属性一致  likailun.Mybatis.User对应的User对象 -->
		<association property="user" javaType="likailun.Mybatis.User">  
	        <id property="id" column="id"/>   
	        <result property="name" column="name"/>   
	        <result property="dept" column="dept"/> 
	        <result property="phone" column="phone"/>  
	        <result property="website" column="website"/>  
        </association> 
	</resultMap>
	
	<select id="getPostByID" resultMap="resultPostsMap">
		select u.*,p.* from user u, post p where u.id=p.userid and p.postid=#{post_id} 
    </select>
    
</mapper>

Post.java

public class Post{

	private int postid;
	private int userid;
	private String title;
	private String content;
	private Date created;
	private User user;
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public int getPostid() {
		return postid;
	}
	public void setPostid(int postid) {
		this.postid = postid;
	}
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public Date getCreated() {
		return created;
	}
	public void setCreated(Date created) {
		this.created = created;
	}	
}

PostMapper.java

public interface PostMapper {
	public Post getPostByID(int id);
}

Test.java

	public static void main(String[] args) {
        SqlSession session = sqlSessionFactory.openSession();
        PostMapper mapper = session.getMapper(PostMapper.class);
        Post post = mapper.getPostByID(1);
        System.out.println(post.getUser().getName());
	}

collection
User.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="likailun.Mybatis.UserMapper">

	<resultMap type="likailun.Mybatis.User" id="resultUsersMap">
		<result property="id" column="id" />
		<result property="name" column="name" />
		<result property="dept" column="dept" />
		<!-- property="user"与post对象的属性一致  likailun.Mybatis.User对应的User对象 -->
		<collection property="posts" ofType="likailun.Mybatis.Post">  
	        <id property="postid" column="postid"/>   
	        <result property="title" column="title"/>   
	        <result property="content" column="content"/> 
        </collection> 
	</resultMap>

	<select id="getUserByID" resultMap="resultUsersMap">
		select u.*,p.* from user u, post p where u.id=p.userid and p.userid=#{userid}
    </select>
</mapper>

Test.java


	public static void main(String[] args) {
        SqlSession session = sqlSessionFactory.openSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        User user = mapper.getUserByID(1);
        System.out.println(user.getPosts().get(0).getTitle());
	}

posted @ 2018-07-18 17:22  李凯伦  阅读(313)  评论(0)    收藏  举报