通过ID查询一个用户的两种开发方法
数据库建表sql语句如下:https://github.com/beyondyanyu/Sayingyy/blob/master/JDBC2-数据库sql建表语句
①,原始Dao开发:
UserDao.java(接口):
package com.pdsu.mybatis.dao;import com.pdsu.mybatis.pojo.User;public interface UserDao {//通过用户ID查询一个用户public User selectUserById(Integer id);}
UserDaoImpl.java(实现接口):
package com.pdsu.mybatis.dao;import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import com.pdsu.mybatis.pojo.User;/*** * */
public class UserDaoImpl implements UserDao {//注入SQLSession工厂private SqlSessionFactory sqlsessionFactory;//构造器public UserDaoImpl(SqlSessionFactory sqlsessionFactory) {this.sqlsessionFactory = sqlsessionFactory;}//通过用户ID查询一个用户public User selectUserById(Integer id){SqlSession sqlSession = sqlsessionFactory.openSession(); return sqlSession.selectOne("user.findUserById", id);}
}
MybatisDaoTest.java测试
package com.pdsu.mybatis.junit;import java.io.InputStream;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import com.pdsu.mybatis.dao.UserDao;
import com.pdsu.mybatis.dao.UserDaoImpl;
import com.pdsu.mybatis.pojo.User;public class MybatisDaoTest {public SqlSessionFactory sqlSessionFactory;@Beforepublic void before() throws Exception{ //加载核心配置文件,加载要使用IO流进行读取String resource = "sqlMapConfig.xml";InputStream in = Resources.getResourceAsStream(resource);//创建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(in);}@Testpublic void testDao() throws Exception{UserDao userDao = new UserDaoImpl(sqlSessionFactory);User user = userDao.selectUserById(10);System.out.println(user);//输出结果就是数据库中ID为10的用户信息}
}
User.xml:
<?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:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<!--
命名空间:user.findUserById
命名空间:order.findUserById
--><mapper namespace="com.pdsu.mybatis.mapper.UserMapper"><!-- resultType:返回值parameterType:输入参数 --><!-- 通过ID查询一个用户 --><select id="findUserById" parameterType="Integer" resultType="com.pdsu.mybatis.pojo.User">select * from user where id= #{sq}</select><!-- #{} === select * from user where username= 表示占位符? sq可以随意替代=== select * from user where username= '思琪'${} === select * from user where username like '%${value}%' 表示字符串拼接 value不可以随意替代=== select * from user where username like '%琪%' sql 模糊语句查询=== select * from user where username like "%"'琪%'"%" sql 模糊语句查询=== select * from user where username like "%"#{sq}"%" --><!-- 根据用户名称模糊查询用户列表 --><select id="findUserByUsername" parameterType="String" resultType="com.pdsu.mybatis.pojo.User">select * from user where username like '%${value}%'</select><!-- 添加用户 --><insert id="insertUser" parameterType="com.pdsu.mybatis.pojo.User"><selectKey keyProperty="id" resultType="Integer" order="AFTER" >select LAST_INSERT_ID()</selectKey>insert into user(username,birthday,address,sex) values (#{username},#{birthday},#{address},#{sex})</insert><!-- 更新用户 --><update id="updateUserById" parameterType="com.pdsu.mybatis.pojo.User">update user set username = #{username},sex = #{sex},birthday = #{birthday},address = #{address}where id = #{id}</update> <!-- 删除用户 --><delete id="deleteUserById" parameterType="Integer" >delete from user where id = #{sq}</delete></mapper>
②,Mapper动态代理开发:
UserMapper.java:
package com.pdsu.mybatis.mapper;import java.util.List;import com.pdsu.mybatis.pojo.User;public interface UserMapper {/*遵循四个原则对于:public User findUserById(Integer id);接口 方法名 == User.xml中id名 === findUserById返回值类型 与 Mapper.xml文件中返回值类型(resultType)要一致 === User === com.pdsu.mybatis.pojo.User方法的入参类型 与 Mapper.xml中入参类型(parameterType)要一致 === Integer id命名空间绑定此接口<mapper namespace="com.pdsu.mybatis.mapper.UserMapper">,User.xml中的路径为该接口全路径*/public User findUserById(Integer id);}
MybatisMapperTest.java:
package com.pdsu.mybatis.mapper;import static org.junit.Assert.*;import java.io.InputStream;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import com.pdsu.mybatis.pojo.User;public class MybatisMapperTest {@Testpublic void testMapper() throws Exception {//加载核心配置文件,加载要使用IO流进行读取String resource = "sqlMapConfig.xml";InputStream in = Resources.getResourceAsStream(resource);//创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);//SqlSessionFactoryBuilder这是一个实现类需要new一下//创建SQLSessionSqlSession sqlSession = sqlSessionFactory.openSession(); //SqlSession自动生成实现类(接口需要遵循四大原则)=== UserMapper.class为遵循四大原则的接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.findUserById(30);System.out.println(user);//输出结果就是数据库中id为30的用户信息}
}
User.xml
<?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:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<!--
命名空间:user.findUserById
命名空间:order.findUserById
--><mapper namespace="com.pdsu.mybatis.mapper.UserMapper"><!-- resultType:返回值parameterType:输入参数 --><!-- 通过ID查询一个用户 --><select id="findUserById" parameterType="Integer" resultType="com.pdsu.mybatis.pojo.User">select * from user where id= #{sq}</select><!-- #{} === select * from user where username= 表示占位符? sq可以随意替代=== select * from user where username= '思琪'${} === select * from user where username like '%${value}%' 表示字符串拼接 value不可以随意替代=== select * from user where username like '%琪%' sql 模糊语句查询=== select * from user where username like "%"'琪%'"%" sql 模糊语句查询=== select * from user where username like "%"#{sq}"%" --><!-- 根据用户名称模糊查询用户列表 --><select id="findUserByUsername" parameterType="String" resultType="com.pdsu.mybatis.pojo.User">select * from user where username like '%${value}%'</select><!-- 添加用户 --><insert id="insertUser" parameterType="com.pdsu.mybatis.pojo.User"><selectKey keyProperty="id" resultType="Integer" order="AFTER" >select LAST_INSERT_ID()</selectKey>insert into user(username,birthday,address,sex) values (#{username},#{birthday},#{address},#{sex})</insert><!-- 更新用户 --><update id="updateUserById" parameterType="com.pdsu.mybatis.pojo.User">update user set username = #{username},sex = #{sex},birthday = #{birthday},address = #{address}where id = #{id}</update> <!-- 删除用户 --><delete id="deleteUserById" parameterType="Integer" >delete from user where id = #{sq}</delete></mapper>
小结(转载:黑马程序员):
selectOne和selectList
动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。
namespace
mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。