今日内容:Mybatis数据持久层的一种表现,在一定程度上,取代了jdbc。
MyBatis开发的大体步骤:
1.建maven......在pom.xml中进行配置,添加Mybatis包,junit测试jar包,添加连接mysql的数据库包
2.在resources中配置SqlMapperConfig.xml文件,它的作用是配置数据库连接相关信息,主要用于数据库中不变的信息,另外里面有个mappers标签,再里面有个userMapper.xml,里面可以有多个表。
3.userMapper.xml主要用于一些变化的信息,主要是操作信息,如增删改查。
4.建库建表。
5.建一个bean包,依据数据库中的表的字段来定义对应属性的类(实体类、即数据存储的模型),用于存储数据库中的内容,和数据库的表对应,在一定程度上也和前端页面对应。
6.建一个dao包,定义个接口UserDao,里面定义了一些抽象方法,主要是增删改查等。
package cn.sjl.dao; /**在UserDao接口中定义方法*/ import java.util.List; import cn.sjl.bean.User; public interface UserDao{ void insertUser(User user); void updateUser(User user); void deleteUserById(Integer id); //删除对象 依据id User selectUserById(Integer id); //查询对象 依据id; 返回值为User类数据类型 List<User> selectAll(); //查询所有集合对象记录里所有的数据 }
7.同时在dao包中,定义一个实现UserDaoImpl类,里面主要是实现类,实现接口中的抽象方法,如
public class UserDaoImpl implements UserDao{ public void insertUser(User user) { //sqlSession(有点类似Connection) SqlSession session=SqlSessionUtil.getSession(); //去工厂拿?再看看书关于SqlSession session.insert("userDao.addUser",user); //找到固定节点并插入值(记录对象) ??看看书,并看看代码底层方法; session.commit(); //手动提交 session.close(); //结束session会话 } }
8.其中的共有的,不变的部分抽出来了,并用static修饰,即当类被加载时就可以执行。
//语法结构等价于DBUtils
package cn.sjl.util; import java.io.InputStream; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import cn.sjl.dao.UserDaoImpl; public class SqlSessionUtil { private static SqlSessionFactory ssf; static { //读配置文件 InputStream in=UserDaoImpl.class.getClassLoader().getResourceAsStream("SqlMapperConfig.xml"); //SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(in);//??10:52 } //返回sqlSession对象 public static SqlSession getSession() { return ssf.openSession(); } }
//看一下旧书和厚书;
9.编写映射文件,如下面这个插入操作:
<mapper namespace="userDao"> <!-- 插入user对象 --> <!-- void insertUser(User user) --> <!-- 1.insert表示定义insert语句的节点 2.id表节点的名称,值唯一 3.parameterType表示定义的是参数的类型 4.#{name}表示从user对象中取出name属性值, 给username字段赋值 --> <insert id="insertUser" parameterType="cn.sjl.bean.User"> insert into t_user( username,password,phone,email ) values ( #{name},#{password},#{phone},#{email} ) </insert>
------------------------------------------------------------------------------------------------------
package test; import org.junit.Test; import cn.sjl.bean.User; import cn.sjl.dao.UserDao; import cn.sjl.dao.UserDaoImpl; public class TestUser { @Test public void testInsert() { UserDao userDao=new UserDaoImpl(); User user=new User(); user.setUsername("张三"); user.setPassword("146557"); user.setEmail("zhangsan@sjl.cn"); user.setPhone("153646646"); userDao.insertUser(user); } }
//单元测试,写一点测试一点,不建议所有的都到最后再测试。
//多练习
//另外还有一种方法不用写实现类,mybatis框架自动添加
##10.测试类中
public void testInsert(){ SqlSession session = SqlSessionUitl.getSession(); //通过getMapper获取AddressDao的实现类对象 AddressDao addressDao = session.getMapper(AddressDao.class); //namespace.id Address address = new Address(); address.setProvince("北京市"); address.setCity("市辖区"); address.setArea("海淀区"); address.setUserAddress("中鼎大厦7层"); addressDao.insert(address); //提交事务 session.commit(); //关闭session session.close(); }
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#{ }、${ } 的区别:
#{ }中的参数是一个动态的占位符,${ }中的参数是一个固定的值;