在之前的web项目中,我们是用的基本的jdbc的进行sql操作,现在我们来使用mybatis来进行操作.
1.导依赖包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
导入之后,我们就可以在使用里面的方法了,在这之前,先进行一下基础操作,写他的配置文件:
<?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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--映射文件-->
<mappers>
<mapper resource="UserMapper.xml地址"/>
...
<mapper resource="UserMapper.xml地址"/>
</mappers>
</configuration>
这其中,driver,url,username,password都和jdbc的操作是一致的,jdbc是怎么写的,这里的配置文件也是怎么写的,然后映射文件中的内容写的是到时候写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="userMapper定义唯一的名称">
<!--自定义sql语句-->
<insert id="insert唯一">
insert into users(u_id,u_name,u_pass) values(1,'test','666')
</insert>
<update id="update">
update users set u_name='hello' where u_id=1
</update>
<delete id="deleteByid">
delete 语句....
</deletre>
<select id=""></select>
</mapper>
这样就把两个配置文件配置好了,现在在后端测试一下我们的mybatis方法
InputStream resourceAsStream = Resources.getResourceAsStream( "mybatis.xml" );
//getResourceAsStream()中的形参就是mybatis的配置文件文件名,会获取到配置文件的文件流
SqlSessionFactory build = new SqlSessionFactoryBuilder().build( resourceAsStream );
//通过流创建SqlSessionFaction对象
SqlSession sqlSession = build.openSession();
//获取此次会话对象,openSession的形参默认为false手动提交,可以改为true自动提交
int insert = sqlSession.insert( "usermapper.insert" );
//insert()里的形参是映射文件的namespace中的xx方法
sqlSession.commit();
//因为是默认false,所以要手动提交
sqlSession.close();
注意一下,查询语句,select的时候,也就是dql语句的时候,和dml语句是不一样的,dml可以直接在映射路径中写好sql语句,然后后端直接sqlSession.insert/delete/update()方法就可以了,但是查询的时候select要先写一个实体类来进行操作的,不然没有实体类,返回的值需要一个实体类,那么具体写法,首先要在pojo包里添加实体类,注意实体类要和数据库的字段名一致
/* resultType表示将查询的结果映射为一个或多个实体对象 ,且实体类的字段名和实体类的属性名一致
resultMap表示将查询的结果映射为一个或多个实体对象,但是需在xml文件里自定义一个resultMap */
<select id="selectBlog" resultType="com.bxq.pojo.User" resultMap="user">
select * from user limit 0,2
</select>
<resultMap id="user" type="com.bxq.pojo.User">
<!-- <id property="实体类属性名" column="主键字段名"/>-->
<!--表示主键字段-->
<result property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</resultMap>
现在基本的写法已经写好了,现在在基本的基础上来进行mvc操作,首先controller,pojo,service,utils这些包没有差别,唯独有区别的就是dao包的区别了,在用jdbc的时候,dao里的实现类是为了进行sql语句的操作,但是现在我们的sql语句已经在映射文件里实现了,那么就已经没有在dao里实现方法的必要了,那么此时的dao包就只需要在里面写接口方法,然后和映射文件进行交互,此时的映射文件书写方法就要发生改变了:
<?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.bxq.dao.UserDao">
//此时的namespace的值就是dao的全路径
<update id="update">
//此时的id就是dao里的方法名
update user set username='bxq' where id=2
</update>
<select id="select" resultType="com.bxq.pojo.User">
/* resultType表示将查询的结果映射为一个或多个实体对象 ,且实体类的字段名和实体类的属性名一致
resultMap表示将查询的结果映射为一个或多个实体对象,但是需在xml文件里自定义一个resultMap */
select * from user
</select>
<insert id="addUser">
insert into user values(4,'华子','123456')
</insert>
<delete id="delete">
delete from user where id=3
</delete>
</mapper>
然后因为dao里的实现方法已经不用写了,所以我们在service里的书写方式也要有所改变,在之前我们是new dao的impl对象,来调用方法,现在不存在书写impl方法了,那么就不用去new对象了,则书写方式就要改变为:
public List<User> select() {
try {
InputStream resourceAsStream = Resources.getResourceAsStream( "mybatis.xml" );
SqlSessionFactory build = new SqlSessionFactoryBuilder().build( resourceAsStream );
SqlSession sqlSession = build.openSession( true );
UserDao mapper = sqlSession.getMapper( UserDao.class );
//getMapper()里的参数就是写你的dao的接口的字节码文件,此时获取到的就是dao对象
List<User> select = mapper.select();
//调用方法
return select;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}