myBatis_动态***
使用和不使用动态***的区别
- 不适用动态*** , 需要手动获取Session
private SqlSessionFactory factory; public UserDaoImpl(SqlSessionFactory factory){ this.factory = factory; } public List<User> findAll() { //1.获取sqlSession对象 SqlSession sqlSession = factory.openSession(); //2.调用selectList方法 List<User> list = sqlSession.selectList("com.example.dao.UserDao.findAll"); //3.关闭流 sqlSession.close(); return list; } - 使用动态***,自动获取session
//3.获取SqlSession对象 SqlSession session = factory.openSession(); //4.获取dao的***对象 UserDao mapper = session.getMapper(UserDao.class); //5.执行查询所有的方法 List<User> list = mapper.findAll();
这里的关键代码 List<user> list = sqlSession.selectList("com.example.dao.UserDao.findAll"),需要我们自己手动调用SqlSession里面的方法,基于动态***的方式最后的目标也是成功的调用到这里。</user>
mapper动态***开发四大原则
- 接口方法名需要与mapper.xml的要调用的sql语句的id一致
- 接口的形参需要与mapper.xml parameterType 一致
- 接口的返回值需要与mapper.xml resultType一致
- mapper.xml中的namespace要与接口的全包名一直
- 实现类由mybatis动态完成
- 不用手动写实现类
sqlSession类的代码
package com.test.ServiceFactory;
import org.apache.ibatis.session.SqlSession;
public class sqlSession {
public static SqlSession getSqlSession(){
return sqlSessionFactory.getSqlSessionFactory().openSession();
}
}sqlSessionFactory 实现类
package com.test.ServiceFactory;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class sqlSessionFactory {
private static SqlSessionFactory ssf =null;
public static SqlSessionFactory getSqlSessionFactory(){
InputStream in ; //局部变量就好了
String resource = "sqlMapConfig.xml";
try {
in = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
ssf = ssfb.build(in);
} catch (IOException e) {
System.out.println("读取配置文件出现异常");
e.printStackTrace();
}
return ssf;
}
}test类代码
package com.test.test;
import java.util.LinkedList;
import java.util.List;
import org.junit.Test;
import com.test.ServiceFactory.sqlSession;
import com.test.bean.user;
import com.test.mapper.userMapper;
public class userdaoTest {
//通过Id进行模糊查询
// @Test
// public void DaoTest() {
// userMapper mapper = new sqlSession().getSqlSession().getMapper(userMapper.class);
// user user = mapper.selectUserById(1);
// System.out.println(user);
// }
//通过名字模糊查询
@Test
public void DaoTest1() {
userMapper mapper = new sqlSession().getSqlSession().getMapper(userMapper.class);
List<user> ls = mapper.selectUserByName("老");
System.out.println(ls);
}
}userMapper.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">
<mapper namespace="com.test.mapper.userMapper">
<!-- 通过id查询用户 -->
<select id="selectUserById" parameterType="Integer" resultType="com.test.bean.user">
select * from user where u_id = #{id}
</select>
<!-- 通过名字进行模糊查询 -->
<select id="selectUserByName" parameterType="String" resultType="com.test.bean.user">
<!-- 这里用用value 来接收 用其他单词会出问题 -->
<!--select * from user where u_username like "%${value}%" -->
<!-- ${}占位符易产生sql注入问题 尽可能多使用#{}占位符 -->
select * from user where u_username like "%"#{name}"%"
</select>
<!--添加用户-->
<insert id="insertuser" parameterType="com.test.bean.user">
<!-- 通过占位符+字段可以得到一个属性值 -->
insert into user values(null,#{u_username},#{u_password},#{u_sex},#{u_createTime},#{u_cid})
<!-- 虽然运行了代码,但是数据库中不会显示保存进去,需要提交事务(jdbc)session提交 -->
</insert>
<!-- 修改用户 -->
<update id="updateuser" parameterType="com.test.bean.user">
update user set u_username = #{u_username} where u_id =#{u_id}
</update>
<!-- 删除用户 -->
<delete id="deleteuserbyId" parameterType="com.test.bean.user">
delete from user where u_id = #{id}
</delete>
</mapper>
华为HUAWEI公司福利 439人发布