Mybatis概念
持久层框架 用于消除Dao的实现类,简化连接操作
通过规范化的配置文件的格式,能极大的简化Dao层的实现类,让开发人员,只需要关注于程序的书写
使用方法
配置文件,搭建环境:
包括三大部分,
配置文件
Dao接口
工厂生产对象
关系:Dao来定义接口方法,而配置文件和代理工厂来帮Dao自动化书写实现类,不需要手动写了
Mybatis框架所包含的内容包括
代理工厂模式
基于配置文件
数据库的实体类
两种配置文件
-
Mybatis的主配置文件:用来连接数据库,以及指定dao实现类的映射的配置文件。这个基本固定格式,改就行了
-
dao接口配置文件:通过规范来操作数据库,并将数据自行封装到对应的类中去 dao接口的配置文件,必须与接口一一对应,位置也要一样。
配置文件的书写约束规范:
<mapper namespace="com.dao.UserDao" >
接口的全限定类名
参数:id为接口类中对应的方法名 resultType是输出的参数 parameterType是输入的参数。
都用占位符#{}代替
占位符#{}对应你输入参数(实体类)中的属性名,一一对应就好了
<select id="Findid" resultType="impl.User" parameterType="int">
select * from userTest where id=#{id}
</select>
Tip操作数据库输入和输出返回值都要以数据库的实体类的形式输入和输出
比如User类对应User表
数据库列名和类的属性,一一对应,这样在输入和输出也会很方便。
代理工厂模式
工厂模式通过代理模式来创建对象。
为什么要用工厂模式,因为所有数据都在配置文件中啊
不对,并不是我用到了工厂模式,我本身没有写工厂模式的程序啊,是Mybatis已经封装好了Session的工厂,
我只需要将配置文件导入到这个SessionFactory的工厂里,让他自行创建就行,这样也实现了解耦
最终的目的就是创建session这个对象,用它做代理,来创建dao的实现类
//其实就是为了用session这个对象,来创建dao的实现类啊
InputStream in= null;
try {
输入流读取配置文件
in = Resources.getResourceAsStream("sqlConfig.xml");
//构建创建Sqlsession工厂的创建者对象
SqlSessionFactoryBuilder facBuilder=new SqlSessionFactoryBuilder();
//创建Session(代理)工厂
SqlSessionFactory SessionFactory=facBuilder.build(in);
//通过工厂来创建Session
SqlSession sqlSession= SessionFactory.openSession();
//Session来创建实现类
userDao Dao= sqlSession.getMapper(userDao.class);
//dao的实现类创建完成,剩下的操作就直接调用方法就行了
} catch (Exception e) {
e.printStackTrace();
}
写的时候,可以从dao接口层开始写,只需要把方法定义好就行,然后去写配置文件,最后写test的工厂
直接上例子吧
主配置文件,只需要修改数据库地址账号就行
<?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="mysql">
<!-- 配置MySQL的环境-->
<environment id="mysql">
<!-- 配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池)-->
<dataSource type="POOLED">
<!-- 配置基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!-- 映射配置文件-->
<mappers>
<mapper resource="dao/userDao.xml"/>
</mappers>
</configuration>
配置文件
<?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="dao.userDao">
<!--各种mysql语句操作-->
<!-- 查询数据表所有数据,resultType输出为一个User类-->
<select id="findAll" resultType="impl.User">
select * from userTest;
</select>
<!-- 插入数据,输入为一个user对象 取到user对象中的name,age,sex属性,自动获取,但必须名称一致-->
<insert id="insertTest" parameterType="impl.User">
insert into userTest(name,age,sex) values (#{name},#{age},#{sex})
</insert>
<!-- 更新修改数据,输入为user对象,id=user中的id这个值-->
<update id="updataTest" parameterType="impl.User">
update userTest set name=#{name},age=#{age},sex=#{sex} where id=#{id};
</update>
<!-- 删除,输入为一个int数字,所以占位符名称随便-->
<delete id="DropTest" parameterType="INT">
delete from userTest where id=#{siubian}
</delete>
<!-- 输入id,查询指定数据,输出user对象-->
<select id="Findid" resultType="impl.User" parameterType="int">
select * from userTest where id=#{id}
</select>
</mapper>
对应的User实体类,这个实体类要和数据库的数据名保持一致,让他作为整个数据库的实体类
package impl;
public class User {
String name;
int age;
int id;
String sex;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
Dao接口,仅仅是定义方法而已
package dao;
import impl.User;
import java.util.List;
public interface userDao {
List<User> findAll();
void insertTest(User user);
void updataTest(User user);
void DropTest(int id);
User Findid(int id);
}
注册时类
public class MybatisTest {
static InputStream in= null;
static SqlSessionFactoryBuilder facBuilder;
static SqlSessionFactory SessionFactory;
static SqlSession sqlSession;
static userDao Dao;
//构建工厂,生产Userdao实体类对象
static public userDao initFac(){
try {
in = Resources.getResourceAsStream("sqlConfig.xml");
facBuilder=new SqlSessionFactoryBuilder();
SessionFactory=facBuilder.build(in);
sqlSession= SessionFactory.openSession();
Dao= sqlSession.getMapper(userDao.class);
return Dao;
} catch (Exception e) {
e.printStackTrace();
}
return Dao;
}
static void updata(){
User user=new User();
user.setSex("na");
user.setAge(20);
user.setName("ls");
user.setId(2);
userDao userDao=initFac();
userDao.updataTest(user);
sqlSession.commit();
}
}