1. 用Mybatis实现对user表的增删改查操作(XML配置):
接口名:
public interface IUserDao
①:查询所有findAll()
——XML配置信息:
<select id="findAll" resultType="cn.xupt.domain.User">
select * from user
</select>
——执行方式:
@Test
public void findAllTest() throws IOException {
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
}
②:添加用户操作addUser(User user)
——XML配置信息:
<insert id="addUser" parameterType="cn.xupt.domain.User">
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
select last_insert_id()
</selectKey>
insert into user (username,birthday,sex,address)values (#{username},#{birthday},#{sex},#{address})
</insert>
——执行方式:
public void addUserTest() throws IOException {
User userDemo = new User();
userDemo.setUsername("孙悟空");
userDemo.setBirthday(new Date());
userDemo.setSex("男");
userDemo.setAddress("水帘洞");
System.out.println("执行前:"+userDemo);
userDao.addUser(userDemo);
session.commit();
System.out.println("执行后:"+userDemo);
}
③:根据id更新用户updateUser(User user)
——XML配置:
<update id="updateUser" parameterType="cn.xupt.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
——执行方式:
@Test
public void updateUserTest(){
User userDemo = new User();
userDemo.setId(50);
userDemo.setUsername("猪八戒");
userDemo.setBirthday(new Date());
userDemo.setSex("男");
userDemo.setAddress("水帘洞");
userDao.updateUser(userDemo);
session.commit();
}
④:根据id删除用户deleteUser(int id)
——XML配置:
<delete id="deleteUser" parameterType="int">
delete from user where id=#{uid}
</delete>
——执行方式:
@Test
public void deleteUserTest(){
userDao.deleteUser(50);
session.commit();
}
⑤:根据id查询用户findById(int id)
——XML配置:
<select id="findById" parameterType="int" resultType="cn.xupt.domain.User">
select * from user where id=#{uid}
</select>
——执行方式:
@Test
public void findByIdTest(){
User user = userDao.findById(48);
System.out.println(user);
session.commit();
}
⑥:根据username模糊查询用户findByUsername(String username)
——XML配置:
<select id="findByUsername" parameterType="String" resultType="cn.xupt.domain.User">
select * from user where username like #{username}
</select>
——执行方式:
@Test
public void findByUsernameTest(){
List<User> users = userDao.findByUsername("%王%");
for (User user : users){
System.out.println(user);
}
session.commit();
}
2. 参数深入(传值不仅仅为一个):
组合查询,将查询条件组装成一个查询对象作为parameterType的值传入findByQueryVo(QueryVo vo)
——XML配置:
<select id="findByQueryVo" parameterType="cn.xupt.domain.QueryVo" resultType="cn.xupt.domain.User">
select * from user where username like #{user.username}
</select>
——执行方式:
@Test
public void findByQueryVoTest(){
User user = new User();
user.setUsername("%王%");
QueryVo vo = new QueryVo();
vo.setUser(user);
List<User> users = userDao.findByQueryVo(vo);
for (User u : users){
System.out.println(u);
}
session.commit();
}
3. 设置实体类和数据库里的类一一对应:
<resultMap id="userMap" type="cn.xupt.domain.User">
<!--对应列名-->
<id property="id" column="id"></id>
<result property="usernaem" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
</resultMap>
4. 使用dao实现类实现查询所有的分析过程:
实现类UserDaoImpl:
public List<User> findAll() {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SqlSession中的方法,实现查询列表
List<User> users = session.selectList("com.itheima.dao.IUserDao.findAll");//参数就是能获取配置信息的key
//3.释放资源
session.close();
return users;
}
①:执行后进入DefaultSqlSession执行selectList();
②:selectList()方法会执行executor.query()方法,CachingExecutor是executor接口对象的实现类,它里面有query()方法;
③:CacheExecutor的query()方法中返回delegate执行doquery()方法后的对象,delegate接口对象是BaseExecutor类的对象,BaseExecutor中的doquery()方法是一个抽象方法,它的子类SimpleExecutor类重载了这个方法,所以delegate对象是SimpleExecutor类的实例化;
④:doquery()方法中有handler接口对象,其实现类是RoutingStatementHandler,它又执行了query()方法,query()方法又执行了delegate接口对象另一个实现类PrepareStatementHandler中的query()方法(此处执行了execute()方法);
⑤:实现结果集的封装;
5. 使用代理dao实现查询所有:
①:DefaultSqlSession实现的sqlSession接口对象执行getMapper()方法,这个方法调用Configuration类中的getMapper()方法;
②:Configuration类中的getMapper()方法调用MapperRegistry类中的getMapper()方法;
③:MapperRegistry类中的getMapper()方法调用MapperProxyFactory类中的newInstance()方法;
④:MapperProxyFactory类中的newInstance()方法使用动态代理,在MapperProxy类(实现InovationHandler接口)中调用invoke方法;
⑤:invoke()方法里面执行了MapperMethod类里的execute()方法,这个方法就是dao的执行,其中有个方法里面又执行了selectList()方法,也就是说又回到了dao实现类的执行方式了。
小知识点:windows里的mysql在将实体类和数据库里的列名对应时不区分大小写。