首先感谢下TechBirds大神,提供了一篇十分优秀的博客,将MyBatis介绍的十分详细,大神博客地址为:mybatis实战教程(mybatis in action),mybatis入门到精通
最近一直研究MyBatis架构,对于很多内容不是十分熟悉,具体整体介绍在MyBatis详细文档介绍,文档介绍十分详细但可能难以整体理解,所以在此稍微详细的进行描述。
- -
MyBatis
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
环境搭建
MyBatis算是上市互联网公司和业界较常用的一个数据访问框架,另外还有一个框架hibernate,但MyBatis较之更加受欢迎。
OK,简介下运行环境所需配置:
1、编译器:Eclipse
2、数据库:MySQL
3、MyBatis: mybatis-3.4.4.jar
4、数据库驱动包: mysql-connector-java-5.1.26-bin.jar
介绍完配置,首先我们在Eclipse里面创建一个Java项目,名字JavaTestDB,然后我们创建两个包,如下图所示:
创建成功以后,我们开始设置数据库文件,在Mysql命令行下创建一个数据库test,并创建一个数据库表user,创建数据库代码如下:
create database test;
use test;
Create TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(50) DEFAULT NULL,
`userAge` int(11) DEFAULT NULL,
`userAddress` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;
insert into user values('1','summer','23','shaanxi, xian');
如下图所示创建成功:
注解:
ENGINE=InnoDB使用innodb引擎,MySQL引擎之一
DEFAULT CHARSET=gbk 数据库默认编码为gbk
AUTO_INCREMENT=1 自增键的起始序号为1
- MyBatis下XML环境配置
在这里需要配置两个XML文件,如上图项目架构图所示,我们将创建两个XML配置文件,一个Configuration.xml和userMapper.xml文件,Configuration文件主要用来配置与数据库MySQL进行远端连接,静态配置地址与数据库密码,以及定位userMapper文件,具体代码如下:
<!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/test?characterEncoding=gbk" />
<property name="username" value="root"/>
<property name="password" value="数据库密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注册userMapper.xml文件,userMapper.xml位于com.gyc.mybatis.models这个包下,所以resource写成
com/gyc/mybatis/models/userMapper.xml-->
<mapper resource="com/gyc/mybatis/models/userMapper.xml"/>
</mappers>
</configuration>
PS:我们在创建表的时候设置默认DEFAULT CHARSET=gbk,为了相关汉字输入不为乱码,我们将在Configuration.xml文件里面设置同样文本编码方式。
相关函数创建
而userMapper.xml文件其主要用来设置数据库增删改查等操作,以及设置传入参数以及返回值类型,我们将以增删改查基本操作为接入点逐级介绍,但首先介绍下主函数如何打开数据库以及进行基本操作,在这里我们使用接口类进行获取userMapper.xml文件内设置到的数据库基本语法操作,需要创建的函数如下所示:
1、创建User类,在使用过程中,查找的为一个User类,则需创建一个User的实体,临时存储查找结果,如下所示:
public class User {
private int id;
private String userName;
private String userAge;
private String userAddress;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAge() {
return userAge;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
}
PS:小技巧,在Eclipse里面声明了变量以后,可以选住变量以后然后右键选择Source,然后选择Getters and Setters,编译器自动创建相关get and set函数,十分方便的操作。
2、创建接口类IUserOperation,为了更加方便安全操作,我们使用接口类,如下代码所示,我们声明了每一个函数名必须与userMapper.xml文件里面设置的id声明的名字一致,否则无法关联到userMapper进行相关操作,主函数将会调用相关函数,下文逐一介绍,代码如下:
public interface IUserOperation {
public User selectUserByID(int id);
public List<User> selectUsers(String userName);
public void addUser(User user);
public void updateUser(User user);
public void deleteUser(int id);
public List<Article> getUserArticles(int id);
}
3、创建主函数,主函数主要用来调用Configuration.xml函数,然后打开数据库连接,然后通过接口类,进行相关的增删改查操作。为了方便,所以Configuration函数创建为static类,在程序启动时自动进行加载,如下所示:
public class TestMybatis {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static{
try{
reader = Resources.getResourceAsReader("Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch(Exception e){
e.printStackTrace();
}
}
public static SqlSessionFactory getSession(){
return sqlSessionFactory;
}
/**
* 指定ID查询操作
* @param id
*/
public void selectUser(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
User user = userOperation.selectUserByID(1);
System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAge()+":"+user.getUserAddress());
} catch (Exception e) {
// TODO: handle exception
} finally {
session.close();
}
}
/**
* 指定表名查询全表操作
* @param id
*/
public void getUserList(String userName){
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
List<User> users = userOperation.selectUsers(userName);
for(User user:users){
System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAddress());
}
} finally {
session.close();
}
}
/**
* 此处为添加新User操作
* 操作添加,更新,删除操作以后,必须进行提交操作即 commit操作。
*/
public void addUser(){
User user=new User();
user.setUserAddress("测试");
user.setUserName("西安");
user.setUserAge("20");
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
userOperation.addUser(user);
session.commit();
System.out.println("当前增加的用户 id为:"+user.getId());
} finally {
session.close();
}
}
/**
* 更新某一用户数据库信息
* @param id
*/
public void updateUser(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
User user = userOperation.selectUserByID(id);
user.setUserAddress("山东");
userOperation.updateUser(user);
session.commit();
System.out.println("修改成功");
} catch (Exception e) {
// TODO: handle exception
} finally {
session.close();
}
}
/**
* 删除指定id信息
* @param id
*/
public void deleteUser(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
userOperation.deleteUser(6);
session.commit();
System.out.println("删除成功");
} catch (Exception e) {
// TODO: handle exception
} finally {
session.close();
}
}
/**
* 数据库关联数据查询
* @param userid
*/
public void getUserArticles(int userid){
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation=session.getMapper(IUserOperation.class);
List<Article> articles = userOperation.getUserArticles(userid);
for(Article article:articles){
System.out.println(article.getTitle()+":"+article.getContent()+
":作者是:"+article.getUser().getUserName()+":地址:"+
article.getUser().getUserAddress());
}
} finally {
session.close();
}
}
public static void main(String[] args) {
TestMybatis testMybatis = new TestMybatis();
testMybatis.getUserArticles(1);
}
}
以上介绍了主要函数以及配置文件,接下我们将以五个例子逐一介绍使用MyBatis以及userMapper.xml文件配置。
4、创建userMapper.xml文件,其主要声明数据库增删改查的具体操作方式,以及输入、查询结果输出类型,具体细节可以在开篇的MyBatis详细文档介绍文章中查找,在此次只是简单的进行介绍,代码如下:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gyc.mybatis.IUserOperation">
<!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型resultType="com.gyc.mybatis.models.User"就表示将查询结果封装成一个User类的对象返回User类就是users表所对应的实体类
-->
<!-- 根据id查询得到一个user对象 -->
<select id="selectUserByID" parameterType="int"
resultType="com.gyc.mybatis.models.User">
select * from user where id=#{id}
</select>
<!-- 查询整个表内容,返回值为User类的List -->
<resultMap type="com.gyc.mybatis.models.User" id="resultListUser">
<id column="id" property="id"/>
<result column="userName" property="userName"/>
<result column="userAge" property="userAge"/>
<result column="userAddress" property="userAddress"/>
</resultMap>
<select id="selectUsers" parameterType="string" resultMap="resultListUser">
select * from user
</select>
<!- 添加新的User类的数据 -->
<insert id="addUser" parameterType="com.gyc.mybatis.models.User" useGeneratedKeys="true" keyProperty="id">
insert into user(userName, userAge, userAddress) values(#{userName}, #{userAge}, #{userAddress})
</insert>
<!- 修改某一ID的数据库内信息 -->
<update id="updateUser" parameterType="com.gyc.mybatis.models.User">
update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}
</update>
<!- 删除指定ID的数据库内信息 -->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
<!- 进行相关数据表关联查询 -->
<resultMap id="resultUserArticleList" type="com.gyc.mybatis.models.Article">
<id property="id" column="a_id" />
<result property="title" column="title" />
<result property="content" column="content" />
<association property="user" javaType="com.gyc.mybatis.models.User">
<id property="id" column="id" />
<result property="userName" column="userName" />
<result property="userAddress" column="userAddress" />
</association>
</resultMap>
<select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">
select user.id,user.userName,user.userAddress,article.a_id,article.title,article.content from user,article
where user.id=article.userid and user.id=#{id}
</select>
</mapper>
MyBatis数据库添加操作
首先进行数据库查询操作,先在userMapper.xml文件添加代码(上文中userMapper代码段已经将以下代码添加入,以下只是进行逐一分析):
<!-- 根据id查询得到一个user对象 -->
<select id="selectUserByID" parameterType="int"
resultType="com.gyc.mybatis.models.User">
select * from user where id=#{id}
</select>
然后在接口类IUserOperation添加相关函数,函数名必须与id声明的名称一样,以便在主函数进行调用,返回值类型为查询结果类型,在上文类接口函数创建中以描述,具体如下所示:
public User selectUserByID(int id);
主函数内编写添加操作函数如下所示:
/**
* 指定ID查询操作
* @param id
*/
public void selectUser(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
User user = userOperation.selectUserByID(1);
System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAge()+":"+user.getUserAddress());
} catch (Exception e) {
// TODO: handle exception
} finally {
session.close();
}
}
最后在主函数中实例化TestMybatis,并进行相关函数调用,如下所示:
public static void main(String[] args) {
TestMybatis testMybatis = new TestMybatis();
testMybatis.selectUser(1);
}
OK,添加操作完成。
MyBatis数据库查询全表操作
查询全表内容时,因为返回类型为user类的一个集合,所以我们可以采取返回为List链表的形式,并逐一输出整个表。在userMapper里面,我们需编写一个返回集合,以便查询结果存储,即resultMap,具体代码如下:
<resultMap type="com.gyc.mybatis.models.User" id="resultListUser">
<id column="id" property="id"/>
<result column="userName" property="userName"/>
<result column="userAge" property="userAge"/>
<result column="userAddress" property="userAddress"/>
</resultMap>
<select id="selectUsers" parameterType="string" resultMap="resultListUser">
select * from user
</select>
然后在接口类IUserOperation添加相关函数,如下所示:
public List<User> selectUsers(String userName);
主函数内添加相关操作函数:
public void getUserList(String userName){
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
List<User> users = userOperation.selectUsers(userName);
for(User user:users){
System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAddress());
}
} finally {
session.close();
}
}
MyBatis数据库添加操作
数据库添加操作,先在userMapper.xml文件添加代码(上文中userMapper代码段已经将以下代码添加入,以下只是进行逐一分析):
<insert id="addUser" parameterType="com.gyc.mybatis.models.User" useGeneratedKeys="true" keyProperty="id">
insert into user(userName, userAge, userAddress) values(#{userName}, #{userAge}, #{userAddress})
</insert>
然后在接口类IUserOperation添加相关函数,函数名必须与id声明的名称一样,以便在主函数进行调用,返回值类型为查询结果类型,在上文类接口函数创建中以描述,具体如下所示:
public void addUser(User user);
主函数内编写添加操作函数如下所示:
/**
* 操作添加,更新,删除操作以后,必须进行提交操作即 commit操作。
*/
public void addUser(){
User user=new User();
user.setUserAddress("测试");
user.setUserName("西安");
user.setUserAge("20");
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
userOperation.addUser(user);
session.commit();
System.out.println("当前增加的用户 id为:"+user.getId());
} finally {
session.close();
}
}
MyBatis数据库更新操作
数据库更新操作,先在userMapper.xml文件添加代码(上文中userMapper代码段已经将以下代码添加入,以下只是进行逐一分析):
<update id="updateUser" parameterType="com.gyc.mybatis.models.User">
update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}
</update>
然后在接口类IUserOperation添加相关函数,函数名必须与id声明的名称一样,以便在主函数进行调用,返回值类型为查询结果类型,在上文类接口函数创建中以描述,具体如下所示:
public void updateUser(User user);
主函数内编写添加操作函数如下所示:
/**
* 更新某一用户数据库信息
* @param id
*/
public void updateUser(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
User user = userOperation.selectUserByID(id);
user.setUserAddress("山东");
userOperation.updateUser(user);
session.commit();
System.out.println("修改成功");
} catch (Exception e) {
// TODO: handle exception
} finally {
session.close();
}
}
MyBatis数据库删除操作
数据库删除操作,先在userMapper.xml文件添加代码(上文中userMapper代码段已经将以下代码添加入,以下只是进行逐一分析):
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
然后在接口类IUserOperation添加相关函数,函数名必须与id声明的名称一样,以便在主函数进行调用,返回值类型为查询结果类型,在上文类接口函数创建中以描述,具体如下所示:
public void deleteUser(int id);
主函数内编写添加操作函数如下所示:
/**
* 删除指定id信息
* @param id
*/
public void deleteUser(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
userOperation.deleteUser(6);
session.commit();
System.out.println("删除成功");
} catch (Exception e) {
// TODO: handle exception
} finally {
session.close();
}
}
MyBatis数据库关联查询操作
数据库关联查询操作,我们先创建新的一个关联数据表,创建代码如下:
Create TABLE `article` (
`a_id` int(11) NOT NULL auto_increment,
`userid` int(11) NOT NULL,
`title` varchar(100) NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=gbk;
insert into article values('1','1','Where are you','Who are you?');
创建成功如下所示:
在userMapper.xml文件添加代码,其中需要编写返回类型resultMap,与此同时,我们还需编写关联数据类型
<resultMap id="resultUserArticleList" type="com.gyc.mybatis.models.Article">
<id property="id" column="a_id" />
<result property="title" column="title" />
<result property="content" column="content" />
<association property="user" javaType="com.gyc.mybatis.models.User">
<id property="id" column="id" />
<result property="userName" column="userName" />
<result property="userAddress" column="userAddress" />
</association>
</resultMap>
<select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">
select user.id,user.userName,user.userAddress,article.a_id,article.title,article.content from user,article
where user.id=article.userid and user.id=#{id}
</select>
然后在接口类IUserOperation添加相关函数,函数名必须与id声明的名称一样,以便在主函数进行调用,返回值类型为查询结果类型,在上文类接口函数创建中以描述,具体如下所示:
public List<Article> getUserArticles(int id);
主函数内编写添加操作函数如下所示:
/**
* 数据库关联数据查询
* @param userid
*/
public void getUserArticles(int userid){
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation=session.getMapper(IUserOperation.class);
List<Article> articles = userOperation.getUserArticles(userid);
for(Article article:articles){
System.out.println(article.getTitle()+":"+article.getContent()+
":作者是:"+article.getUser().getUserName()+":地址:"+
article.getUser().getUserAddress());
}
} finally {
session.close();
}
}
小总结
这是这几天从网上查找的资料的小总结,并不是自己的原创,但是感觉还是有些难度的对于新手,所以先暂时更新这么多,随后再继续修改,再次很感谢文章开头的大神TechBirds写的博客,还在学习过程中,如有错误欢迎指正,同时欢迎交流。