今天把mybatis基础学差不多了,总结一下。
从配置文件开始:
mybatis一共有两种配置文件,一个叫总配置文件(下文的Config.xml),一个是映射的配置文件(user.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>
<typeAliases>
<typeAlias alias="User" type="com.ljf.mybatis.User" />
</typeAliases>
<!-- 配置开发环境,可以配置多个,在具体用时再做切换 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/struts_tutorial?useUnicode=true&useSSL=true" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 mapper -->
<mappers>
<mapper resource="com/ljf/mybatis/User.xml" />
</mappers>
</configuration>
其中<typeAliases>标签的作用就是把很长的类文件目录简化,上面就可以直接有User代替com.ljf.mybatis.User,后面在有需要这个User直接用就行,比如后面的返回值类型resultType=“User”,就是简化后的,很方便,<environments中的都是数据库基本配置文件,不需要再多讲,根据自己的数据库进行配置,<mappers>中的是映射文件,其中可以有多个,并列就行,并且切记,第一一定要完整的路径名,第二不能用“.”而是用“/”进行分隔。是不是很简单。
下面放上映射文件:
<?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.ljf.mybatis.inter.IUserOperation">
<select id="selectUserByUsername" parameterType="String" resultType="User">
select * from `user` where username = #{username}
</select>
<insert id="insert" parameterType="User">
insert into user(username,password) values(#{username},#{password})
</insert>
<update id="update" parameterType="User">
update user set password=#{password}
where username=#{username}
</update>
<delete id="delete" parameterType="String">
delete from user
where username=#{username};
</delete>
</mapper>
我分别进行了更删改查的简单示范。下面详细进行说明
mapper命名空间可以随便起名,只要不重复就行,我这里对应了接口的路径,作用一会再说,先说配置文件:
增删该查操作分别对应<select、<insert、<update、<delete 。 parameterType 是你要传入参数的类型,比如id等,也可以是list,map,User等。
resultType 对应查询返回的类型,同上。
SQL语句就不用说太多了,就一点#{},相当于SQL中的id=?的意思。
下面说一下面向接口的编程方式:
首先建一个包,写一个接口,对应四个方法:
package com.ljf.mybatis.inter;
import com.ljf.mybatis.User;
public interface IUserOperation {
public User selectUserByUsername(String username);
public void insert(User user);
public void update(User user);
public void delete(String username);
}
有没有发现什么?我来总结以下相同点:
1.接口文件路径和User配置文件的mapper 的namespace相同;
2.接口中的方法名和User.xml中的方法名(也就是id)相同;
3.接口方法的返回值和参数类型与User.xml的parameterType和resultType相同;
这几点掌握你就会使用接口编程了,第一点很重要,其实三点错一个都不行的。
下面附上测试代码:
package com.ljf.test;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import com.ljf.mybatis.User;
import com.ljf.mybatis.inter.IUserOperation;
class test {
@Test
void testSELECT() {
String resource = "/Config.xml";
InputStream inputStream = this.getClass().getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sessionFactory.openSession();
try {
IUserOperation userOperation= sqlSession.getMapper(IUserOperation.class);
User user = userOperation.selectUserByUsername("James");
System.out.println(user.getUsername());
System.out.println(user.getPassword());
}catch(Exception e) {
e.printStackTrace();
}
}
@Test
void testINSERT() {
String resource = "/Config.xml"; //定位核心配置文件
InputStream inputStream = this.getClass().getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUsername("wbd");
user.setPassword("12778");
IUserOperation userOperation= sqlSession.getMapper(IUserOperation.class);
userOperation.insert(user);
sqlSession.commit();
}
@Test
void testUPDATE() {
String resource = "/Config.xml"; //定位核心配置文件
InputStream inputStream = this.getClass().getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
IUserOperation userOperation= sqlSession.getMapper(IUserOperation.class);
User user = userOperation.selectUserByUsername("ljf");
user.setPassword("778899");
userOperation.update(user);
sqlSession.commit();
}
@Test
void testDELETE() {
String resource = "/Config.xml"; //定位核心配置文件
InputStream inputStream = this.getClass().getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
IUserOperation userOperation = sqlSession.getMapper(IUserOperation.class);
userOperation.delete("ljf");
sqlSession.commit();
}
}
我分别对四个方法进行测试,全都能运行
IUserOperation userOperation = sqlSession.getMapper(IUserOperation.class);
这一步是面向接口编程特殊的一步,经过上面直接可以通过接口调用对应的方法执行sql语句了。
以上就是我的总结,希望能帮到你们。有问题可以一起讨论。