1.回顾mybatis环境搭建步骤
1.1:创建maven工程
1.2:导入坐标
1.3编写实体类和持久层接口
1.4编写SqlMapConfig.xml
1.5编写映射配置文件,注意包的目录需要相同
1.6编写测试类
2.实现CRUD操作
说明:
1.持久层接口和持久层接口的映射配置必须在相同的包下.
2.持久层映射配置中的mapper标签的namespace属性取值必须是持久层接口的全限定类名.
3.SQL语句的id属性必须和持久层接口的方法名相同.
2.1在IUserDao接口中加入新的方法
//在IUserDao接口中添加新的方法
//添加findById()方法
//通过Id查找User,返回类型为User
User findById(Integer userId);
//保存用户
int saveUser(User user);
//更新用户
int updateUser(User user);
//根据id删除用户
int deleterUser(Integer userId);
//根据名称模糊查询
//因为返回结果不止一个,所以用List<User>且类型是User,来进行存储
List<User> findByName(String name);
//查询总记录条数
int findTotal();
2.2在IUserDao.xml中添加映射配置文件
<!--此处使用typeAliases进行简化-->
<typeAliases>
<typeAlias alias="User" type="com.itheima.User"/>
</typeAliases>
<!--根据id查找-->
<select id="findById" parameterType="int" resultType="User">
select * from user where id = #{uid}
</select>
<!--保存用户-->
<insert id="saveUser" parameterType="User">
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#
{address})
</insert>
<!--用户更新-->
<update id="updateUser" parameterType="User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
<!--用户删除-->
<delete id="deleteUSer" parameterType="java.lang.Integer">
delete from user where id=#{uid}
</delete>
<!--根据名称进行模糊查询-->
<select id="findByName" parameterType="String" resultType="User">
select * from user where username like #{username}
</select>
<!--这是模糊查询的另外一种配置,两者不可同时存在,目前我只做列举-->
<select id="findByName" parameterType="String" resultType="User">
select * from USer wherre username like '%${value}%'
</select>
<!--查询总条数-->
<select id="findTotal" resultType="int">
select count(*) from user
</select>
解释说明:
2.2.1resultType属性:
用于指定结果集的类型
2.2.2parameterType属性:
用于指定传入参数的类型
2.2.3sql语句中使用#{}字符
{}里面的内容可以随便写,#{}它代表占位符,相当于原来的jdbc中的"?",是用于执行语句时替换实际的数据,具体内容有里面元素决定.
2.2.4#{对象.对象}
eg:#{user.username}他会先去找user对象,然后在user对象中找到username属性,并调用getUsername()取出.
2.2.5#{}和${}的区别
#{}表示一个占位符,通过他可以实现preparedStatement向占位符中设置值,自动进行jaca类型和jdbc类型的转换,可以有效防止sql注入.
#{}可以接收简单类型或pojo.如果parameterType传输简单类型值#{}括号中可以是value或者其他名称.
${}表示拼接sql串,通过${}可以讲parameterType传入的内容拼接在sql中并且不进行转换.如果parameterType传输简单类型值${}括号中只能是value
2.3测试.
public class Test{
private InputStream in;
private SqlSessionFactory factory;
private SqlSession sqlSession;
private IUserDao userDao;
//在测试方法之前执行
@Before
public void init() throws Exception(){
//1.读取配置文件
in = Resource.getResourceAsStream(SqlMapConfig.xml);
//2.创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.创建SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.创建SqlSession对象
SqlSession session = factory.openSession();
//5.创建代理对象
userDao = session.getMapper(IUserDao.class);
}
@Test
public void testFindOne(){
User user = uesrDao.findById(11);
System.out.println(user);
}
@Test
public void testSave(){
User user = new User();
user.setUsername("叶平");
user.setSex("男");
//执行保存方法
userDao.saveUser(user);
}
@Test
public void testUpdateUser() throws Exception{
//先查找
User user = userDao.findById(12);
user.setAddress("山东");
//更改
int num = userDao.updateUser(user);
System.out.println(num);
//要执行更改操作得先找到当先目标
}
@Test
public void testDeleterUser(){
int num = userDao.deleteUser(32);
System.out.println(num);
}
@Test//模糊查询重点
public void testFindByName(){
//使用第一种方式
List<User> user = userDao.findByName("%王%")
// List<User> users = userDao.findByName("王") 第二种方式
for(User user : users){
System.out.println(user);
}
}
@After
public void destroy() throws Exception(){
//事务回滚
session.commit();
session.close();
in.close();
}
}
3.resultMap结果类型
resultMap标签可以建立查询的列名和实体类的属性名称不一致时建立的对应关系.
<resultMap type="com.itheima.domain.User" id="userMap">
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="sex" property="userSex"/>
<result column="address" property="userAddress"/>
<result column="birthday" property="userBirthday"/>
</resultMap>
id标签:用于指定主键字段
result标签:用于指定非主键
column属性:用于指定数据库列名
property属性:用于知道实体类属性
此时的映射配置就可以写成
<select id="findAll" resultMap="userMap"></select>