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>