刚刚接触了MyBatis感觉难以理解的点还是不多,更多的是需要记忆以及总结MyBatis操作数据库的步骤和方法。记录学习笔记希望自己可以理解框架知识并达到学以致用,做到知其然知其所以然。
我自己根据视频老师将MyBatis框架搭建分了如下步骤,并且记录应该注重的易错点。
梳理步骤:
1:导包(mybatis-3.5.5.jar)
2:准备核心配置文件(用于连接数据库)
3:创建会话工厂(封装有连接,执行,返回结果集的方法)
4:配置映射文件(sql语句)
5:在会话工厂里执行sql语句
实现第一步:导包
1:我的mybatis-3.5.5.jar是在官网上下载了,百度即有。
2:将mybatis-3.5.5.jar放在将包放入:WebCountent下的WEB-INF-lib包下,直接复制黏贴可。
实现第二步:配置核心文件夹
1:在scr的目录下添加xml核心配置文件,建议起名mybatis-config.xml,当然这是自定义的。
2:mybatis的核心配置文件夹内容不需要你死记硬背,你可以在官网也可以在你下载的mybatis文件里找帮助文档即可。内容如下:
<?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://localhost:3306/school" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mapper/TeacherMapper.xml"/>
</mappers>
</configuration>
释:你只需要修改几个属性的值即可,//后都是我的注释,如下是官方样板
<?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"> //一个environment就是一个数据库。 deveopment:开发
<transactionManager type="JDBC"/> //事务管理器
<dataSource type="POOLED"> //数据源:连接池
<property name="driver" value="${driver}"/> //指明驱动类:写在value里,mysql的value值是com.mysql.jdbc.Driver
<property name="url" value="${url}"/> //vslue:jdbc:mysql://localhost:3306/数据库名
<property name="username" value="${username}"/> //value:root
<property name="password" value="${password}"/> //value:123456
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers>
</configuration>
释:你只需要修改几个属性的值即可,//后都是我的注释,如下是我根据自己的数据库进行响应的配置
<?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://localhost:3306/school" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mapper/TeacherMapper.xml"/>
</mappers>
</configuration>
注:1:核心文件夹主要用于连接数据库的,当然也需要在这里完成映射文件的注册工作。
2:配置文件是environments容器里可以包裹多个environment容器,这是因为可能会出现多个数据库连接,一般的理解就是一个项目连接一个数据库就行了,那为什么要用到多个数据库是因为我们开发用的一个数据库,开发完之后就有测试数据库,发布后会有一个真实的数据库。所以再不同情况下需要使用不同的数据库喽,最后决定用哪个,再environments标签的default里用environment的id指明就好了
实现第三步:创建会话工厂
1:如何创建如下代码解释如下:
public class Test2 {
public static void main(String[] args) throws Exception {
//第一步:连接数据库
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session= sqlSessionFactory.openSession();
//第二步:做增删改查操作:sql语句不写在这里,配置在xml文件中:新建一个mapper包
//第三步:执行sql语句
int count= session.selectOne("TeacherMapper.countTeacher");
//查询结果一条记录就叫selectOne 多条就叫selectList 传入的参数就是mapper中的id值
//参数命名:命名空间.id属性,为了避免重复
//第四步:在核心配置文件中配置
System.out.println(count);
session.close();
}
}
实现第四步:配置映射完成增删改查
1:配置映射文件
a、新建一个包:com.mapper专门放对表进行操作的xml文件
b、xml文件起名:表名Mapper.xml 首字母大写
c、复制下面配置信息导xml文件中
2:映射文件内容和核心配置文件一样,去MyBatis官网或者帮助文档找就行了,找到并实现如下:
<?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="TeacherMapper" resultType="int"> //namespace:命名空间,就是起名字地方,为了防止名字重复就起成:表名+Mapper
//resultType="int"要讲清楚你查询结果返回的是什么类型(必填)
//mapper里写增删改查
<select id="countTeacher">
select count(1) from Teacher //注意这里的sql语句不能加分号结束
</select>
</mapper>
3:执行sql语句:在会话工厂里;代码如下:
public class Test2 {
public static void main(String[] args) throws Exception {
//第一步:连接数据库
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session= sqlSessionFactory.openSession();
//第二步:做增删改查操作:sql语句不写在这里,配置在xml文件中:新建一个mapper包
//第三步:执行sql语句
int count= session.selectOne("TeacherMapper.countTeacher");
//查询结果一条记录就叫selectOne 多条就叫selectList 传入的参数就是mapper中的id值
//参数命名:命名空间.id属性,为了避免重复
//第四步:在核心配置文件中配置
System.out.println(count);
session.close();
}
}
4:非常重要的一点,要在核心配置文件中完成映射文件的注册,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://localhost:3306/school" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mapper/TeacherMapper.xml"/>
</mappers>
</configuration>
释:在核心配置文件mybatis-config.xml中用mapper标签配置映射文件,就是告诉数据库你要操作什么表,做什么事
<mappers>
<mapper resource="com/mapper/TeacherMapper.xml"/> //注:1文件夹用/分隔 2.要加.xml 3: 用resource而不是url
</mappers>
考虑连接需要不停的每次操作一个表就要创建一次连接的问题,我们在之前的基础做以修改,创建一个专门负责连接的类。
梳理思路:
1:需要建立的包:
a、工具包:com.dao放BaseDAO和表的接口
b、接口包:com.dao.impl的实现类
c、测试包:com.dao.test
d、实现包:com.dao.entity
d、映射文件包:com.dao.mapper
2:创建一个com.dao包再创建BaseDAO类来获取连接
3:在接口内添加方法
4:创建一个com.entity包再创建实体类
5:配置映射实现方法文件
6:测试
实现第二步:com.dao包在创建BaseDAO类来获取连接
package com.dao;
import java.io.IOException;
import java.io.InputStream;
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 BaseDAO {
/*
* 这个类就是为了生成Session工厂会话的:连接对象
* 注意连接成功后不能释放资源
* 单例模式:饿汉模式,线程安全
*/
private static SqlSessionFactory sqlSessionFactory; //此操作为了实现单例模式;如果在方法构建会话工厂就会形成每次调用方法就产生一个新的工厂,耗费资源
private static final String CONFIG_FILE = "mybatis-config.xml"; //静态常量要大写
static {
try {
InputStream inputStream= Resources.getResourceAsStream(CONFIG_FILE);
sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//建立连接的方法,返回连接对象
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
实现第三步:创建一个com.entity包再创建实体类
package com.entity;
import java.util.Date;
/*
* 实体类:封装Teacher表
* 1:私有属性 2:get/set方法 3:有参构造 4:无参构造 5:重写toString()方法
*/
public class Teacher {
private Integer teaId;
private String teaName;
private Integer teaAge;
private Date createDate; //注意导包时用util包
public Teacher() {
super();
// TODO Auto-generated constructor stub
}
public Teacher(Integer teaId, String teaName, Integer teaAge, Date createDate) {
super();
this.teaId = teaId;
this.teaName = teaName;
this.teaAge = teaAge;
this.createDate = createDate;
}
public Integer getTeaId() {
return teaId;
}
public void setTeaId(Integer teaId) {
this.teaId = teaId;
}
public String getTeaName() {
return teaName;
}
public void setTeaName(String teaName) {
this.teaName = teaName;
}
public Integer getTeaAge() {
return teaAge;
}
public void setTeaAge(Integer teaAge) {
this.teaAge = teaAge;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
@Override
public String toString() {
return "Teacher [teaId=" + teaId + ", teaName=" + teaName + ", teaAge=" + teaAge + ", createDate="
+ createDate + "]";
}
}
实现第四步:在com.dao包创建增删改查的接口
package com.dao;
import java.util.List;
import com.entity.Teacher;
/*
* 操作表的接口
*
*/
public interface TeacherDAO {
public List<Teacher> getAll(); //查全部方法
}
实现第五步:配置映射文件
注:resultType的值,解释在注释
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.TeacherDAO"> <!-- namespace要跟接口的完整限定名一样,不带.java后缀。保证唯一就行了 -->
<select id="getAll" resultType="com.entity.Teacher">
<!-- id的属性要跟接口的方法名一致;记住一定要写resultType,
1:系统可判断返回的是否是集合,所以不用指明list,只需要告诉它集合里装的是什么元素类型
2:如果写的是实体类的类型,就要写实体类的完整限定名,我这里是这里是Teacher,要写包名.Teacher
-->
select * from teacher
</select>
</mapper>
实现第六步:测试
package com.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.dao.BaseDAO;
import com.dao.TeacherDAO;
import com.entity.Teacher;
/*
* 测试类
*/
public class Test {
public static void main(String[] args) {
SqlSession session = BaseDAO.getSession(); //1:拿到session对象,获得连接
TeacherDAO dao = session.getMapper(TeacherDAO.class); //2:拿到映射文件返回对应接口
List<Teacher> tealist= dao.getAll(); //3:执行接口中的方法
System.out.println(tealist.size());
//4:循环遍历
for (Teacher t : tealist) {
System.out.println(t); //我这里是重写了toString()方法
}
//5:关
session.close();
}
}
梳理思路:
1:先将对应数据库的驱动和MyBatis的jar包加入项目内,位置放在eclipse的Webcount下的WEB-INF下的lib文件夹。
2:根据数据库信息配置核心配置文件。
3:在com.dao包下建立BaseDAO用于专门连接创建session对象。
4:前三步已经在第二章时已经操作过了,我们直接从接口内添加方法开始,注意接口内的每一个方法都要在映射文件内实现。
5:在接口继续添加增删改的方法
6:在映射文件补充实现方法;
7:测试包内的测试类
实现第五步:在接口添加方法
直接上代码,内有注释;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.entity.Teacher;
/*
* 操作表的接口
*
*/
public interface TeacherDAO {
public List<Teacher> getAll(); //查全部方法
public void delect(Integer teaId);
//1:根据id删除 2:返回值可以是int,但是不用在映射文件中指明resultType,再被方法调用的时候可以用int接收,拿到受影响行数
public int add(@Param("tea") Teacher tea); //当在映射文件的sql语句传入多个参数就需要用到注解@Param("tea") 传一个就无需注解
}
实现第六步:在映射文件中实现接口方法
直接上代码,内有注释;
<?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.dao.TeacherDAO"> <!-- namespace要跟接口的完整限定名一样,不带.java后缀。保证唯一就行了 -->
<select id="getAll" resultType="com.entity.Teacher">
<!-- id的属性要跟接口的方法名一致;记住一定要写resultType,
1:系统可判断返回的是否是集合,所以不用指明list,只需要告诉它集合里装的是什么元素类型
2:如果写的是实体类的类型,就要写实体类的完整限定名,我这里是这里是Teacher,要写包名.Teacher
-->
select * from teacher
</select>
<delete id="delect" >
delete from teacher where teaId=#{teaId)} <!-- #{}传入的参数是接口里方法需要传入的参数名 -->
</delete>
<insert id="add">
insert into Teacher value(null,#{tea.teaName},#{tea.teaAge},#{tea.createDate})
</insert>
</mapper>
实现第七步:测试类
测试删类;
package com.test;
import org.apache.ibatis.session.SqlSession;
import com.dao.BaseDAO;
import com.dao.TeacherDAO;
public class Test2 {
public static void main(String[] args) {
SqlSession session= BaseDAO.getSession();
TeacherDAO dao = session.getMapper(TeacherDAO.class);
dao.delect(2);
session.commit(); //这里需要我们自己完成事务的提交
session.close();
}
}
测试添加;
package com.test;
import java.util.Date;
import org.apache.ibatis.session.SqlSession;
import com.dao.BaseDAO;
import com.dao.TeacherDAO;
import com.entity.Teacher;
public class Teat3 {
public static void main(String[] args) {
SqlSession session= BaseDAO.getSession();
TeacherDAO dao = session.getMapper(TeacherDAO.class);
Teacher tea = new Teacher(4,"仙女",18,new Date());
int num= dao.add(tea); //只要接口里的方法返回值是int类型就可以在这里拿到受影响行数,无需了resultType
System.out.println(num);
session.commit(); //这里需要我们自己完成事务的提交
session.close();
}
}