整合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&useSSL=false&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&useSSL=false&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&useSSL=false&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&useSSL=false&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());
}


浙公网安备 33010602011771号