本文章是下面文章的扩充
Mybatis入门-CSDN博客文章浏览阅读432次,点赞6次,收藏10次。Mapper接口创建在java代码块中//dao层/*** 功能:查询所有用户数据* @return*/https://blog.csdn.net/luosuss/article/details/138420052
映射配置文件
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, addressfrom user1where id = #{id} //拿到方法传入的值</select>
</mapper>
测试:
@Testpublic 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>
测试:
@Testpublic 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 user1set name=#{name},sex=#{sex},address=#{address}where id=#{id}</update>
测试
@Testpublic 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>
测试
@Testpublic 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为自动提交事务}//静态方法:关闭SqlSessionpublic static void closeSqlSession(SqlSession s) {if (s != null) {s.close();}}
}
测试:
@Testpublic 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 user1set address=#{saddress}where name=#{sname};</update>