Mybatis原本是apache下面的一个开源项目,后来迁到了google code旗下,并改名为Mybatis。
Mybatis封装了JDBC的操作数据的过程。可以让开发人员更加专注于代码的开发,从繁杂的数据操作中解脱出来。
话不多说惹。把过程记录一下,
Mybatis的开发步骤(?):
(1):新建一个简单的Java EE项目;
(2):新建一个目录lib,在包下导入所要用的jar包;
https://pan.baidu.com/s/1mYW3lAMV-GfHFSM4laRsUw
(我把用到的jar包存上百度云啦)
我简单的了解了一下所用到的这些jar包是干什么的。
asm,cglib,javassist:实现动态代理;
log4j:日志
mybatis:mybatis核心包
mysql-connector: 数据库驱动
因为使用的是log4j的,需要添加配置文件。在src下新建文件log4j.properties。
添加以下代码:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
(我这里没有导入junit的jar包,因为IDEA里面有junit测试插件。如何安装插件很容易搜到哈)
(3):新建一个包model,编写所要操作的实体类(User),以下是数据库
package com.zwj.model;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class User implements Serializable {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
//以下方法通过generate里面的方法生成
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
}
(4):编写全局配置文件:在src下新建文件SqlMapConfig.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">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源,采用dbcp连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--以下配置的是你自己的数据库信息-->
<!--为了防止编码错误,可以加上这一段解决问题:?useUnicode=true&characterEncoding=utf8-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatisday1?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
</mappers>
</configuration>
(5)新建一个包mapper,在包下新建一个java类UserMapper,编写mapper接口文件。这里以根据一个用户id查询用户信息作为实例:
package com.zwj.mapper;
import com.zwj.model.User;
public interface UserMapper {
public User findByid(int id);
}
(6)与UserMapper在同一个包(mapper)下,新建一个映射文件UserMapper.xml,添加以下代码:
id:映射文件中的id必须与接口中对应的方法名称一致(此处都是findByid)
parameterType:方法的参数类型
resultType:填写接口方法中返回类型。这里是返回一个用户信息Use,所以填写User模型的全限定名称(这里还没配置别名,所以写全限定名称)。如果返回类型是集合类型(List),resultType填写集合里模型的全限定名称(com.zwj.model.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文件,比如下面这一行!查询这个用到的就是UserMapper这个mapper,而且必须写全限定名!>
<mapper namespace="com.zwj.mapper.UserMapper">
<select id="findByid" parameterType="int" resultType="com.zwj.model.User">
<!--以下的sql语句就是你mapper里面所要真正实现的sql语句,建议先在数据库中跑一跑,真的能跑出来,再直接拷贝进来-->
select * from user
where id=#{id};
</select>
</mapper>
(7)在全局配置文件SqlMapConfig.xml的mapper标签中,指定mapper映射文件(UserMapper):
<mappers>
<!--资源路径是相对路径-->
<mapper resource="com/zwj/mapper/UserMapper.xml"></mapper>
</mappers>
(8)测试:因为在以后的学习中还要进行多次测试,所以我把session的建立和关闭以注解的形式写在了两个类的里面。
package com.zwj.test;
import com.zwj.mapper.UserMapper;
import com.zwj.model.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
public class Demo03 {
SqlSession session;
@Before
public void before() throws IOException{
System.out.println("before……");
//获取全局映射文件
InputStream is= Resources.getResourceAsStream("SqlMapConfig.xml");
//建立 会话工厂
SqlSessionFactory sessiomFactory=new SqlSessionFactoryBuilder().build(is);
//通过工程建立session
session=sessiomFactory.openSession();
}
@After
public void after(){
System.out.println("after……");
session.close();//关闭session
}
@Test
public void test1(){
UserMapper userMapper=session.getMapper(UserMapper.class);
System.out.println(userMapper.findByid(10));
session.commit();//提交事务
//在查询的情况下,可以不commit。但是在增删改的情况下,数据一定要commit才可以被数据库进行真实操作!!!
}
}
查询结果如下图所示:
基本上就是这样一个流程。
最后放一下目录图,因为我是学的差不多了,才开始写笔记,所以emmm目录有点多,但是大概是这个意思哈。(我没提到的都是无关的哈)
有几点想要总结一下:
(1)mapper接口文件(UserMapper)和映射文件()一定要在同一个包下!!!
(2)mappe接口文件(UserMapper)里面的方法只能有一个参数!
(3)mapper映射文件的mapper标签里面一定要写命名空间!
(4)数据的增删改操作一定要commit操作!一定要提交!
(5)映射文件里面的第一个id必须与mapper接口文件的方法名一样!
(6)接口方法返回类型为集合(List)的话,在映射文件中resultType就写集合里面元素(User)的类型(com.zwj.model.User)。
emmmm……个人笔记,可能写的很不完善,有欠缺之处。如果有大佬看到并且发现其中的错误,欢迎指正哈!