一、基本概念
- What for
JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statment, ResultSet 这些其实只是手段的辅助类。 不仅如此,访问不同的表,还会写很多雷同的代码,显得繁琐和枯燥。
Mybatis之后只需要自己提供SQL语句。其他的工作,诸如建立连接,Statement, JDBC相关异常处理等等都交给Mybatis去做了,那些重复性的工作Mybatis也给做掉了,我们只需要关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。
- 原 理
- 应用程序找Mybatis要数据
- mybatis从数据库中找来数据
a)通过mybatis-config.xml 定位哪个数据库 (mybatis-config.xml配置数据库连接信息)
b) 通过Category.xml执行对应的select语句 (Category.xml将sql语句与实体建立对应关系)
c) 基于Category.xml把返回的数据库记录封装在Category对象中
d) 把多个Category对象装在一个Category集合中 -
返回一个Category集合
Mybatis基本原理图.png
二、配置方式Crud
两个配置文件:
mybatis-config.xml:建立数据库连接
Category.xml:将sql语句与实体建立对应关系
- mybatis-config.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>
<typeAliases>
<package name="com.how2java.pojo"/>
</typeAliases>
<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/how2java?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/how2java/pojo/Category.xml"/>
</mappers>
</configuration>
下面分别列出增删改查中,Category.xml 及 java 代码片段:
1.增
addCategory对应的插入sql语句,#{name}会自动获取c对象的name属性值
- Category.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="com.how2java.pojo">
<!-- 增 -->
<insert id="addCategory" parameterType = "Category" >
insert into category_ (name) values (#{name})
</insert>
</mapper>
- TestMybatis.java
Category c = new Category();
c.setName("新增加的Category");
session.insert("addCategory",c); // 第一个参数为sql语句的id,第二个参数类型与sql中的parameterType一致
2.删
- Category.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="com.how2java.pojo">
<!-- 增 -->
<insert id="addCategory" parameterType = "Category" >
insert into category_ (name) values (#{name})
</insert>
</mapper>
- TestMybatis.java
Category c = new Category();
c.setName("新增加的Category");
session.insert("addCategory",c); // 第一个参数为sql语句的id,第二个参数类型与sql中的parameterType一致
3.改
- Category.xml
<update id="updateCategory" parameterType="Category" >
update category_ set name=#{name} where id=#{id}
</update>
- TestMybatis.java
Category c= session.selectOne("getCategory",3);
c.setName("修改了的Category名稱");
session.update("updateCategory",c);
4.查
查询所有
- Category.xml
<select id="listCategory" resultType="Category">
select * from category_
</select>
- TestMybatis.java
List<Category> cs = session.selectList("listCategory");
三、注解方式Crud
一个配置文件:
mybatis-config.xml:建立数据库连接
CategoryMapper 取代了Category.xml
- mybatis-config.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>
<typeAliases>
<package name="com.how2java.pojo"/>
</typeAliases>
<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/how2java?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.how2java.mapper.CategoryMapper"/>
</mappers>
</configuration>
- CategoryMapper.java
public interface CategoryMapper {
@Insert(" insert into category_ ( name ) values (#{name}) ")
public int add(Category category);
@Delete(" delete from category_ where id= #{id} ")
public void delete(int id);
@Select("select * from category_ where id= #{id} ")
public Category get(int id);
@Update("update category_ set name=#{name} where id=#{id} ")
public int update(Category category);
@Select(" select * from category_ ")
public List<Category> list();
}
- TestMybatis.java
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
CategoryMapper mapper = session.getMapper(CategoryMapper.class);
// add(mapper);
// delete(mapper);
// get(mapper);
// update(mapper);
listAll(mapper);
session.commit();
session.close();
}
private static void update(CategoryMapper mapper) {
Category c= mapper.get(8);
c.setName("修改了的Category名稱");
mapper.update(c);
listAll(mapper);
}
private static void get(CategoryMapper mapper) {
Category c= mapper.get(8);
System.out.println(c.getName());
}
private static void delete(CategoryMapper mapper) {
mapper.delete(2);
listAll(mapper);
}
private static void add(CategoryMapper mapper) {
Category c = new Category();
c.setName("新增加的Category");
mapper.add(c);
listAll(mapper);
}
private static void listAll(CategoryMapper mapper) {
List<Category> cs = mapper.list();
for (Category c : cs) {
System.out.println(c.getName());
}
}