MyBatis框架
本次内容:参数形式、增删改
接口方法参数是单个
通过一个参数查询数据,参考入门案例.支持常见的简单的数据类型,(8种基本类型,String,Date等)
直接在给实参即可,且UserMapper文件中的参数用#{随意},单个参数时,内容随意
接口方法参数是多个
两种处理方案
1:接口处注解 2:sql语句中参数内容写#{param1}、#{param2}
在接口处方法处添加注解并定义参数类型,注解内容对应#{}中的内容
public interface UserMapper {
// 注解中的参数是映射文件#{}内的值
User findUserByLogin(@Param("username") String username, @Param("password") String password);
}
在sql语句中的参数中写#{param1}、#{param2}、… 系统会自动吧第一个参数赋值给param1,第二个参数赋值给param2,以此类推
还是推荐使用注解!!!
<!--当接口方法的参数列表有多个参数时,此处标签中就不再设置parameterType-->
<select id="findUserByLogin" resultType="com.qf.model.User">
<!--
当接口方法的参数列表有多个参数时,此处#{}内的写法
方案一: 按照顺序写#{param1},#{param2},....
方案二: 在接口的参数上加注解 【推荐方案】
-->
<!-- select * from user where username = #{param1} and password = #{param2} -->
select * from user where username = #{username} and password = #{password}
</select>
接口方法参数是对象类型
//接口方法
User findUserByUser(User user)
<select id="findUserByUser" resultType="com.qf.model.User" parameterType="com.qf.model.User">
<!--
当参数类型是对象时,#{}内必须要是对象的属性名
-->
select * from user where username = #{username} and password = #{password}
</select>
接口方法的参数是Map
//接口方法
User findUserByLoginMap(Map<String,String> map);
<select id="findUserByLoginMap" resultType="com.qf.model.User" parameterType="Map">
<!--当参数是Map时,#{}内写的是Map的key-->
select * from user where username = #{uname} and password = #{pwd}
</select>
在test中测试一下,参数是Map集合
/**
* 测试参数是Map
*/
@Test
public void testMapParameter() throws IOException {
// 加载配置文件,变成流
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 通过流获得工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder( ).build(inputStream);
// 通过工厂SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession( );
// 通过SqlSession获得接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, String> map = new HashMap<String, String>( );
map.put("uname","root");
map.put("pwd","123456");
// 调用方法
User user = mapper.findUserByLoginMap(map);
System.out.println(user);
}
接口方法参数是List集合
//接口方法
List<User> findUserByList(List<Integer> ids);
<!--参数类型是List时,参数固定写List-->
<select id="findUserByList" parameterType="List" resultType="User">
select * from user where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
接口方法的返回值是List
//接口方法
List<User> findAllUser();
<!--
查询返回一个对象,还是List集合,resultType指定的都是要封装的实体类类型
特别注意:不是List
-->
<select id="findAllUser" resultType="com.qf.model.User">
select * from user
</select>
删除【重要】
需求: 根据id删除数据
int deleteUserById(int id);
<!--
删除使用<delete>标签
没有resultType属性,默认返回int类型数据
-->
<delete id="deleteUserById" parameterType="int">
delete from user where id = #{id}
</delete>
// 通过工厂SqlSession,默认是false,指定为true就会自动提交
SqlSession sqlSession = sqlSessionFactory.openSession( true);
// 通过SqlSession获得接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
/**
* mybatis在执行增,删,改的时候默认开启事务,但是没有自动提交
* 如果在获得SqlSession时,指定了开启自动提交,那么执行增删改时就会自动提交
*/
int i = mapper.deleteUserById(46);
System.out.println(i );
// 没有自动提交事务,就需要手动提交
// sqlSession.commit();
更新【重要】
需求: 更新用户信息
int updataUserById(User user);
<update id="updataUserById" parameterType="com.qf.model.User">
<!-- #{}内写的是对象的属性名 -->
update user set username = #{username},password = #{password},birthday = #{birthday},
phone = #{phone},address = #{address}
where id = #{id}
</update>
// 通过工厂SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession( );
// 通过SqlSession获得接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 更新,如果对象某个属性为空,将会把直接置空
User user = new User( );
user.setId(29);
user.setUsername("圆圆");
user.setPassword("654321");
int i = mapper.updataUserById(user);
System.out.println(i );
// 记得提交
sqlSession.commit();
插入【重要】
需求: 向User表插入一条数据
int insertUser(User user);
<insert id="insertUser" parameterType="com.qf.model.User">
insert into user (username,password,birthday,phone,address)
values(#{username},#{password},#{birthday},#{phone},#{address})
</insert>
@Test
public void testInsert() throws IOException {
// 加载配置文件,变成流
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 通过流获得工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder( ).build(inputStream);
// 通过工厂SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession( );
// 通过SqlSession获得接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User( );
user.setUsername("喻去子");
user.setPassword("123456");
user.setAddress("中国 贵州 黔南布依族苗族自治州");
user.setBirthday(new Date());
int i = mapper.insertUser(user);
System.out.println(i );
sqlSession.commit();
}
插入后,主键回填【熟悉】
场景: 下订单,返回订单号
需求: 插入数据后,要得到数据库自增的id
实现: mysql提供一个sql语句select last_insert_id();
可以获得上次自增的id
int insertUser(User user);
<insert id="insertUser" parameterType="com.qf.model.User">
insert into user (username,password,birthday,phone,address)
values(#{username},#{password},#{birthday},#{phone},#{address})
<!--
keyProperty : 装载id的属性
order : 顺序,是指在insert前或者后执行该句话
resultType : 结果类型
解释: 在插入数据后,执行该句话,将主键查询到
将其赋值给User类的id属性
-->
<selectKey keyProperty="id" order="AFTER" resultType="int">
select last_insert_id()
</selectKey>
</insert>
/**
* 测试更新
*/
@Test
public void testInsert() throws IOException {
// 加载配置文件,变成流
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 通过流获得工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder( ).build(inputStream);
// 通过工厂SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession( );
// 通过SqlSession获得接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 创建一个对象
User user = new User( );
user.setUsername("喻去子");
user.setPassword("123456");
user.setAddress("中国 贵州 黔南布依族苗族自治州");
user.setBirthday(new Date());
// 执行插入,其中会有主键回填
System.out.println("插入前: " +user );
int i = mapper.insertUser(user);
System.out.println(i );
// 提交
sqlSession.commit();
// 再次打印对象,此时对象中的id有值
System.out.println("插入后: " +user );
}