本文章是下面文章的扩充
映射配置文件
insert标签:编写insert语句
update标签:编写update语句
delete标签:编写delete语句
select标签:编写select语句
select标签
属性:
属性名 | 说明 | 是否必须 |
id | 这条sql语句的唯一标识,和接口的方法名一致 | 是 |
parameterType | 入参类型 | 否 |
resultType/resultMap | 返回值类型 | 是 |
注意:resultType/resultMap只能存在一个
案例:查询id=1的user的信息
在Mapper中书写方法
public interface UserMapper {
/**
* 功能:查询所有用户数据
* @return
*/
public List<user1> findAllUser();
/**
* 返回id=id的用户信息
* @param id 要查询的用户id
* @return
*/
public user1 findUserById(int id);
}
在映射文件中添加select标签
<!--利用username把当前映射文件与Mapper接口关联-->
<mapper namespace="com.hhh.dao.UserMapper">
<!--编写sql查询语句-->
<select id="findAllUser" resultType="user1">/*返回的结果封装到user1对象*/
select id, name, sex, address from user1
</select>
<select id="findUserById" parameterType="_int"(可以不写) resultType="user1">
select id, name, sex, address
from user1
where id = #{id} //拿到方法传入的值
</select>
</mapper>
测试:
@Test
public void testFindUserById() throws IOException {
//配置核心文件路径
String resource="mybatis-config.xml";
//基于配置文件路径,创建字节输入流对象
InputStream asStream = Resources.getResourceAsStream(resource);
//创建工厂类对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);
//获取一个SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//利用SqlSession创建一个代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
user1 user = userMapper.findUserById(1);
System.out.println(user);
}
结果:
insert标签
属性:
属性 | 说明 | 是否必须 |
id | 这条sql语句的唯一标识,和接口的方法名一致 | 是 |
在Mapper接口中添加方法:
/**
* 添加用户
* @param user:用户对象
* @return 返回受影响的行数
*/
public int addUser(user1 user);
映射文件:
<!--编写插入语句-->
<insert id="addUser">
insert into user1 (name, sex, address)
VALUE (#{name},#{sex},#{address});
</insert>
测试:
@Test
public void testAddUser() throws IOException {
//配置核心文件路径
String resource="mybatis-config.xml";
//基于核心文件路径,生成字节输入流对象
InputStream asStream = Resources.getResourceAsStream(resource);
//创建工厂类对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);
//获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//我们也可以把手动提交变成自动提交事务
// SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
//创建一个代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用方法
int i = userMapper.addUser(new user1(null, "象可", "男", "河南"));
//注意在mybatis中,事务是手动提交的
if(i>0)
{
sqlSession.commit();
System.out.println("插入数据成功");
}
sqlSession.close();
}
注意:
在Mybatis中,事务是手动提交的,也可以设置事务为自动提交
SqlSession sqlSession1 = sqlSSessionFactory.openSession(true);
update标签
属性:
属性 | 说明 | 是否必须 |
id | 这条sql语句的唯一标识,和接口的方法名一致 | 是 |
Mapper接口
/**
* 修改用户信息
* @param user 用户对象
* @return 返回受改变的行数
*/
public int updateUser(user1 user);
映射文件
<update id="updateUser">
update user1
set name=#{name},sex=#{sex},address=#{address}
where id=#{id}
</update>
测试
@Test
public void testUpdateUser() throws IOException {
//配置核心文件路径
String resource="mybatis-config.xml";
//基于核心配置文件路径,生成字节输入流对象
InputStream asStream = Resources.getResourceAsStream(resource);
//创建工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);
//获取一个对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);//设置为自动提交事务
//获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
user1 user = userMapper.findUserById(1);//根据id查询用户信息
user.setName("莱奥");
user.setSex("男");
user.setAddress("黑龙江");
int i = userMapper.updateUser(user);//修改
if(i>0)
{
System.out.println("修改成功");
}
sqlSession.close();
}
delete标签
属性:
属性 | 说明 | 是否必须 |
id | 这条sql语句的唯一标识,和接口的方法名一致 | 是 |
Mapper接口
/**
* 删除用户通过id
* @param id 要删除的用户id
* @return 返回受影响的行数
*/
public int deleteUser(int id);
映射文件
<delete id="deleteUser">
delete from user1 where id=#{id}
</delete>
测试
@Test
public void testDeleteUser() throws IOException {
//配置核心文件路径
String resource="mybatis-config.xml";
//基于核心配置文件路径,生成字节输入流对象
InputStream asStream = Resources.getResourceAsStream(resource);
//创建工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);
//获取一个对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int i = userMapper.deleteUser(5);
if(i>0)
{
sqlSession.commit();//提交事务
System.out.println("删除成功");
}
sqlSession.close();
}
Mybatis工具类的编写
通过上面的代码,我们发现有很多代码是重复的,所以上面可以下一个工具类
//工具类:私有化构造方法和静态代码块
public class MybatisUtil {
private MybatisUtil() {
}
private static SqlSessionFactory sqlSessionFactory = null;
static//静态代码块只能访问静态的成员变量
{
//随着类的加载,只会加载一次
InputStream asStream = null;
try {
asStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//静态方法:返回一个SqlSession对象
public static SqlSession openSession() {
return sqlSessionFactory.openSession();//默认是手动事务
}
public static SqlSession openSession(boolean flag) {
return sqlSessionFactory.openSession(flag);//true为自动提交事务
}
//静态方法:关闭SqlSession
public static void closeSqlSession(SqlSession s) {
if (s != null) {
s.close();
}
}
}
测试:
@Test
public void testMybatisUtil()
{
//直接通过工具类获取SqlSeeion对象
SqlSession sqlSession = MybatisUtil.openSession();
//获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
user1 user = userMapper.findUserById(1);
System.out.println(user);//user1{id=1, name='莱奥', sex='男', address='黑龙江'}
//关闭sqlSession对象
MybatisUtil.closeSqlSession(sqlSession);
}
方法传递的参数有两个该怎么办
例如:
public int updateUserByName(String name,String address);
方法:使用 Param注解,@Param("key")的方法来绑定一个参数名字(在映射文件中使用)
public int updateUserByName(@Param("sname") String name,
@Param("saddress") String address);
反射文件
<update id="updateUserByName">
update user1
set address=#{saddress}
where name=#{sname};
</update>