1、mybaits是什么?
mybatis是一个基于jdbc的持久化框架,
什么叫持久化,我们吧数据分为两种:一种瞬时数据,一种叫永久数据, 就是指的吧瞬时数据编程持久化数据的一个过程。mybatis就是基于jdbc吧我们的数据从瞬时变为持久化,mybatis底层是基于jdbc实现的。
2、mybatis入门案例
新建一个maven项目
1、pom.xml导入maven依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
2、编写mybatis的配置文件,
在项目中com.config下新建一个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>
<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/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml" />
</mappers>
</configuration>
mybatis引入了数据库连接池的概念, 在原生的jdbc中,我们数据库链接是使用的时候就创建,使用完毕就销毁,这样对我们程序性能消耗,hiberante首先提出使用数据库连接池的概念,mybatis也是用了这个技术,所以我们mybatis自带一个数据库连接池,我们做测试可以使用,到那时生产环境我们需要使用第三方专业的数据库连接池框架。
3、获取mybatis和数据库链接 Connection,但是在mybatis他补交connection叫sqlsession, 而且mybatis由于使用了数据库连接池,所以我们应该先拿到数据库连接池,在从池子里面拿到sqlsession,数据库连接池是以工厂设计模式,我们的数据库连接池实际山就是一个生产数据库链接的工厂。
所以我们先获取mybatis的数据库连接池,”会话工厂“ SqlSessionFactory
然后在从会话工厂里面能拿到数据库会话 SqlSession
代码如下:
package com.xingxue.utils;
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 MyBatisUtils {
public static void main(String[] args) throws IOException {
//获取会话工厂
InputStream is = Resources.getResourceAsStream("com/config/mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
System.out.println(factory);
//获取会话
SqlSession session = factory.openSession();
System.out.println(session);
}
}
我们发现mybatis的包都是ibatis的名字,那是因为我们mybatis3.0以前都叫ibatis
4、利用mybatis查询数据
根据mybatis的架构配置,可以使用实体类来进行数据交互,也可以不使用实体类。
使用实体类:
表:
1、我们需要为对应的数据表创建一个实体类类
package com.xingxue.entity;
import java.util.Date;
public class TypeBean {
private int id;
private String name;
private String statu;
private Date createdate;
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 getStatu() {
return statu;
}
public void setStatu(String statu) {
this.statu = statu;
}
public Date getCreatedate() {
return createdate;
}
public void setCreatedate(Date createdate) {
this.createdate = createdate;
}
}
2、创建一个dao,此时的dao不是我们的java的类了,因为mybatis就是我们的dao,所以我们只需要按照mybtais的规则去创建dao的文件可以了。 mybatis吧dao抽象成了一个xml文件,然后在xml文件编写sql语句,后面mybatis提供了特定的方法去调用这个xml文件里面的sql片段,支持我们需要吧路径配置正确:
<?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.xingxue.entity.TypeDao">
<select id="selectType" resultType="com.xingxue.entity.TypeBean">
select * from type where id = 1
</select>
</mapper>
namespace:表示该xml文件对外的名字
select上面又一个id,表示mybatis对外调用sql片段的唯一标记,resultType表示返回的数据类型
3、吧该实体类对应的xml文件用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/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/xingxue/entity/TypeMapper.xml"/>
</mappers>
</configuration>
利用mappers配置引入该sql片段的xml文件,如果又多个,就在里面增加mapper配置即可
4、利用mybatis的sqlsession调用该sql片段
TypeBean type = session.selectOne("com.xingxue.entity.TypeDao.selectType");
System.out.println(type.getName());
com.xingxue.entity.TypeDao.selectType及对应xml里面的namespace.id ,mybaits就会根据这个路径找到对应的sql执行之后返回结果。
总结:mybatis通过吧sql代码和java代码分开管理,能让我们程序最高程度的高类聚低耦合。
查询多条数据就需要调用selectList,返回值就直接是List:
sql配置如下:
<!-- 分页查询数据 -->
<select id="selectTypeByPage" resultType="com.xingxue.entity.TypeBean">
select * from type
</select>
java代码写法:
List<TypeBean> list = session.selectList("com.xingxue.entity.TypeDao.selectTypeByPage");
System.out.println(list);
mybatsi会吧查询到的数据自动封装成我们的实体类类型,然后在装入一个list集合,然后在返回给我们的调用者
增删该操作基本一样,只是需要注意mybatis不自动提交事务,需要我们调用commit方法去手动提交事务
<insert id="insertType" parameterType="com.xingxue.entity.TypeBean">
INSERT INTO `test`.`type` (
`id`,
`name`,
`statu`,
`createDate`
)
VALUES
(
null,
#{name},
#{statu},
now()
);
</insert>
<update id="updateType" parameterType="com.xingxue.entity.TypeBean">
UPDATE `test`.`type`
SET
`name` = #{name}
WHERE
(`id` = #{id});
</update>
<delete id="deleteType" parameterType="com.xingxue.entity.TypeBean">
delete from type where id = #{id}
</delete>
java代码:
TypeBean bean = new TypeBean(0, "衣服", "1", null);
int result = session.insert("com.xingxue.entity.TypeDao.insertType", bean);
session.commit();
System.out.println(result);
bean.setId(7);
bean.setName("女装");
int result2 = session.update("com.xingxue.entity.TypeDao.updateType", bean);
session.commit();
bean.setId(7);
int result3 = session.delete("com.xingxue.entity.TypeDao.deleteType", bean);
session.commit();
mybatis基本操作就是这个样子,参数,我们利用parameterType来标记参数类型,
写法如下:如果是基本数据类型直接写类型名字:
<update id="updateType" parameterType="int">
UPDATE `test`.`type`
SET
`name` = #{name}
WHERE
(`id` = #{id});
</update>
如果是复杂数据类型就是包名.类名
参数采用占位符来获取, 语法规则是 #{属性名} 如下面的#{id}, id是该TypeBean对象的属性
<delete id="deleteType" parameterType="com.xingxue.entity.TypeBean">
delete from type where id = #{id}
</delete>