一. 通过dao和映射文件的关联来完成操作---企业开发模式
思考: 我们之前使用SqlSession封装的一些方法可以完成crud操作,但是SqlSession封装的方法,传递的参数statement, 传递占位符的参数只能传递一个。而且他的方法名称都是固定。而真实在开发环境下我们不使用SqlSession封装的方法,而是习惯自己定义方法,自己调用自己的方法。
(1)创建一个dao接口并定义自己需要的方法
public interface UserDao {
public List<User> userFindAll();
public User userIdFind(int id);
public int userInsert(User user);
public int userDelete(int id);
public int userUpdate(User user);
}
(2)创建映射文件
<?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">
<!--namespace:命名空间
必须和dao相同
-->
<mapper namespace="com.tym.dao.UserDao">
<insert id="userInsert" parameterType="com.tym.entity.User">
insert into t_user values(null,#{username},#{name})
</insert>
<delete id="userDelete" parameterType="int">
delete from t_user where id=#{id}
</delete>
<update id="userUpdate" parameterType="com.tym.entity.User">
update t_user set username=#{username},name=#{name} where id=#{id}
</update>
<select id="userFindAll" resultType="com.tym.entity.User">
select * from t_user
</select>
<select id="userIdFind" resultType="com.tym.entity.User">
select * from t_user where id=#{id}
</select>
<select id="userFindTwo" resultType="com.tym.entity.User">
select * from t_user where username=#{username} and name=#{name}
</select>
</mapper>
注意: namespace必须和dao接口一样,而且标签的id必须和你接口的方法名一样。
(3)测试
public class Test01 {
@Test
public void testInsert()throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
//获取相应接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
User user = new User();
user.setUsername("xl");
user.setName("小李");
int insert = userDao.userInsert(user);
System.out.println(insert);
session.commit();
session.close();
}
@Test
public void testDelete()throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
userDao.userDelete(3);
session.commit();
session.close();
}
@Test
public void testUpdate()throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = new User(2,"xg","小刚");
int i = userDao.userUpdate(user);
System.out.println(i);
session.commit();
session.close();
}
@Test
public void testFindAll()throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
List<User> users = userDao.userFindAll();
System.out.println(users);
session.close();
}
@Test
public void testIdFind()throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.userIdFind(4);
System.out.println(user);
session.close();
}
@Test
public void testFindTwo()throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user1 = userDao.userFindTwo("xg", "小刚");
System.out.println(user1);
session.close();
}
}
二. 传递多个参数。
我们需要在参数处使用@Param()为参数起名。
public interface UserDao {
public List<User> userFindAll();
public User userIdFind(int id);
public int userInsert(User user);
public int userDelete(int id);
public int userUpdate(User user);
public User userFindTwo(@Param("username")String username,@Param("name") String name);
}
三. 添加时如何返回递增的主键值。
<!--添加用户
useGeneratedKeys:设置使用生成的主键
keyProperty: 赋值给哪个属性
-->
<insert id="userInsert" parameterType="com.tym.entity.User" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null,#{username},#{name})
</insert>
四. 解决列名和属性名不一致。
可以有两种解决办法:
第一种: 为查询的列起别名,而别名和属性名一致。
<!--根据id查询学生信息-->
<select id="findOne" resultType="com.tym.entity.Student">
select t_id id,t_name name,t_age age from s_student where t_id=#{id}
</select>
第二种: 使用resultMap完成列和属性之间的映射关系。
<resultMap id="StudentMapper" type="com.tym.entity.Student">
<!--主键的映射关系 column:列名 property:属性名-->
<id column="t_id" property="id"/>
<!--普通列的映射关系-->
<result column="t_name" property="name"/>
<result column="t_age" property="age"/>
</resultMap>
<!--resultType和ResultMap二者只能用一个-->
<select id="findOne" resultMap="StudentMapper">
select * from s_student where t_id=#{id}
</select>
如果列名和属性名有些一致的,可以在resultMap中不写映射关系
五. 动态sql
5.1 if标签--单条件判断
public interface StudentDao {
public List<Student> studentFinds(@Param("name")String name,@Param("age")Integer age);
}
<select id="studentFinds" resultMap="studentMap">
select * from t_student
<where>
<if test="name!=null and name!=''">
and t_name=#{name}
</if>
<if test="age!=null">
and age=#{age}
</if>
</where>
</select>
<resultMap id="studentMap" type="com.tym.entity.Student">
<!--主键的映射关系 column:列名 property:属性名-->
<id column="t_id" property="id"/>
<!--普通列的映射关系-->
<result column="t_name" property="name"/>
</resultMap>
5.2choose标签 多条件分支判断
<select id="studentFinds" resultMap="studentMap">
select * from t_student where 1=1
<choose>
<when test="name!=null and name!=''">
and t_name=#{name}
</when>
<when test="age!=null">
and age=#{age}
</when>
</choose>
</select>
<resultMap id="studentMap" type="com.tym.entity.Student">
<!--主键的映射关系 column:列名 property:属性名-->
<id column="t_id" property="id"/>
<!--普通列的映射关系-->
<result column="t_name" property="name"/>
</resultMap>
5.3where标签
我们观察到上面的sql都加了 where 1=1 ,如果不使用where 1=1 那么你的动态sql可能会出错。 我们能不能不加where 1=1呢! 可以 那么我们就可以使用where标签,作用:可以自动为你添加where关键字,并且可以帮你去除第一个and |or
<select id="findss" resultType="com.tym.entity.Student">
select * from account
<where>
<if test="name!=null and name!=''">
and name=#{name}
</if>
<if test="money!=null">
and money=#{money}
</if>
</where>
</select>