发表于: 2018-04-25 19:36:50

1 596


日期:4月25号

今天完成的事情:

①梳理一下昨天的内容,重新写mybatis连接数据库,实现Dao接口。

先写User实体类,对应数据库的表,最后写上toString()方法,把User对象以String返回:

package entity;

import java.text.SimpleDateFormat;

public class User {
   private Integer id;
   private String username;
   private String number;
   private Long create_at;
   private Long update_at;

   public User(Integer id, String username, String number, Long create_at, Long update_at) {
       this.id = id;
       this.username = username;
       this.number = number;
       this.create_at = create_at;
       this.update_at = update_at;
   }

   public Integer getId() {
       return id;
   }

   public void setId(Integer id) {
       this.id = id;
   }

   public String getUsername() {
       return username;
   }

   public void setUsername(String username) {
       this.username = username;
   }

   public String getNumber() {
       return number;
   }

   public void setNumber(String number) {
       this.number = number;
   }

   public Long getCreate_at() {
       return create_at;
   }

   public void setCreate_at(Long create_at) {
       this.create_at = create_at;
   }

   public Long getUpdate_at() {
       return update_at;
   }

   public void setUpdate_at(Long update_at) {
       this.update_at = update_at;
   }

   public String toString(){
       SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       return "学生:id=" + id + ", name=" + username + ", number="
               + number +", create_at:"+df.format(create_at)+", update_at:"+df.format(update_at);
   }
}

接着写UserDao接口,写上增删改查的方法:

package dao;

import entity.User;

import java.util.List;

public interface UserDao {

   //根据id查询用户信息
   User findUserById(int id) throws Exception;
   //根据用户名模糊查询
   List<User> findUserByName(String name) throws Exception;
   //添加用户信息
   void insertUser(User user) throws Exception;
   //删除用户信息
   void deleteUser(int id) throws Exception;
   //更新用户信息
   void updateUser(User user) throws Exception;
}

接着配置mybatis配置文件和mapper文件,mapper配置文件里面写上增删改查的Sql语句:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

   <properties resource="db.properties"/>

   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="${driver}"/>
               <property name="url" value="${url}"/>
               <property name="username" value="${username}"/>
               <property name="password" value="${password}"/>
           </dataSource>
       </environment>
   </environments>
   <mappers>

       <mapper resource="User.xml"/>

   </mappers>
</configuration>
<?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="test">

   <select id="findUserById" parameterType="int" resultType="entity.User">
       select * from tb_test where id=#{id}
   </select>

   <select id="findUserByName" resultType="entity.User">
       select * from tb_test where name=#{name}
   </select>

   <select id="findUsers" resultType="entity.User">
       select * from tb_test
   </select>

   <insert id="insertUser" parameterType="entity.User">
       insert into tb_test(id,name,number,create_at,update_at) values(#{id},#{name},#{number},#{create_at},#{update_at})
   </insert>

   <delete id="deleteUser" parameterType="int">
       delete from tb_test where id=#{id}
   </delete>

   <update id="updateUser" parameterType="entity.User">
       update tb_test set name =#{name},number =#{number},update_at=#{update_at} where id=#{id}
   </update>
</mapper>

接着写实现类UserDaoImpl,分别实现每种方法:

package implementation;

import dao.UserDao;
import entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

public class UserDaoImpl implements UserDao {
   private SqlSessionFactory sqlSessionFactory;

   public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
       this.sqlSessionFactory = sqlSessionFactory;
   }

   @Override
   public User findUserById(int id) throws Exception {
       SqlSession sqlSession = sqlSessionFactory.openSession();
       User user = sqlSession.selectOne("test.findUserById", id);
       //释放资源
       sqlSession.close();
       return user;
   }

   @Override
   public List<User> findUserByName(String name) throws Exception {
       SqlSession sqlSession = sqlSessionFactory.openSession();
       List<User> list = sqlSession.selectList("test.findUserByName", name);
       //释放资源
       sqlSession.close();
       return list;
   }
   public List<User> findUsers() throws Exception {
       SqlSession sqlSession = sqlSessionFactory.openSession();
       List<User> list = sqlSession.selectList("test.findUsers");
       //释放资源
       sqlSession.close();
       return list;
   }

   @Override
   public void insertUser(User user) throws Exception {
       SqlSession sqlSession = sqlSessionFactory.openSession();
       sqlSession.insert("test.insertUser", user);
       sqlSession.commit();//执行插入要先commit
       sqlSession.close();
   }

   @Override
   public void deleteUser(int id) throws Exception {
       SqlSession sqlSession = sqlSessionFactory.openSession();
       sqlSession.delete("test.deleteUser", id);
       sqlSession.commit();//执行插入要先commit
       sqlSession.close();
   }

   @Override
   public void updateUser(User user) throws Exception {
       SqlSession sqlSession = sqlSessionFactory.openSession();
       sqlSession.update("test.updateUser", user);
       sqlSession.commit();//执行插入要先commit
       sqlSession.close();
   }
}

最后写测试类,测试实现类是否正常:

package test;

import dao.UserDao;
import implementation.UserDaoImpl;
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 java.io.InputStream;
import java.util.Iterator;

public class UserDaoImplTest {
   private SqlSessionFactory sqlSessionFactory;

   @Before
   public void setUp() throws Exception {
       //创建sqlSessionFactory
       String resource = "mybatis-config.xml"; //mybatis配置文件

       //得到配置文件的流
       InputStream inputStream = Resources.getResourceAsStream(resource);

       //创建会话工厂SqlSessionFactory,要传入mybatis的配置文件的流
       sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

   }
   @Test
   public void testFindUserById() throws Exception {
       //创建UserDao的对象
       UserDao userDao = new UserDaoImpl(sqlSessionFactory);
       System.out.println(userDao.findUserById(1));
   }
   @Test
   public void testFindUsers() throws Exception {
       //创建UserDao的对象
       UserDao userDao = new UserDaoImpl(sqlSessionFactory);
       Iterator users=((UserDaoImpl) userDao).findUsers().iterator();
       while (users.hasNext()){
           System.out.println(users.next());
       }
   }
}

分别运行2个测试方法,都能正常运行,没有出现昨天的null:

学生:id=1, name=万全林, number=123456, create_at:2018-04-24 14:10:49, update_at:2018-04-24 14:10:49

学生:id=2, name=李宗赢, number=234567, create_at:2018-04-24 14:10:49, update_at:2018-04-24 16:37:26

学生:id=3, name=曹樾, number=345678, create_at:2018-04-24 14:10:49, update_at:2018-04-24 14:10:49

学生:id=4, name=乱世枭雄, number=456789, create_at:2018-04-24 14:10:49, update_at:2018-04-24 14:10:49

学生:id=5, name=宋晓胜, number=16438, create_at:2018-04-24 14:10:49, update_at:2018-04-24 18:23:33

Process finished with exit code 0

用mybatis连接数据库实现原始的Dao接口就做到这里


②接着往下,mapper代理方法开发dao!

首先了解mapper.xml里namespace的作用,namespace的作用是对sql进行管理化分类,即sql隔离;使用mapper代理开发的话,namespace就有特殊重要作用了;namespace=mapper接口地址!

回想一下,之前写的mapper配置文件里,namespace可以随意写,现在必须写成接口地址。

编写mapper接口要遵循以下四个开发规范:

1、在mapper.xml中,使namespace等于mapper接口的地址(完全限定名)

2、mapper.java接口中的方法名和mapper.xml中statement的id一致

3、mapper.java接口中方法的输入参数类型和mapper.xml中statement的parameterType指定的类型一致

4、mapper.java接口中方法返回值类型和mapper.xml中statement的resultType指定的类型一致

编写mapper接口,跟之前的UserDao接口类似,如下

package dao;

import entity.User;

import java.util.List;

public interface UserMapper {

   //根据id查询用户信息
   User findUserById(int id) throws Exception;
   //根据用户名模糊查询
   List<User> findUserByName(String name) throws Exception;
   //查询所有用户
   List<User> findUsers() throws Exception;
   //添加用户信息
   void insertUser(User user) throws Exception;
   //删除用户信息
   void deleteUser(int id) throws Exception;
   //更新用户信息
   void updateUser(User user) throws Exception;
}

按照编写mapper接口要遵循的规范编写mapper.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="dao.UserMapper">

   <select id="findUserById" parameterType="int" resultType="entity.User">
       select * from tb_test where id=#{id}
   </select>

   <select id="findUserByName" resultType="entity.User">
       select * from tb_test where name like '%${value}%'
   </select>

   <select id="findUsers" resultType="entity.User">
       select * from tb_test
   </select>

   <insert id="insertUser" parameterType="entity.User">
       insert into tb_test(id,name,number,create_at,update_at) values(#{id},#{name},#{number},#{create_at},#{update_at})
   </insert>

   <delete id="deleteUser" parameterType="int">
       delete from tb_test where id=#{id}
   </delete>

   <update id="updateUser" parameterType="entity.User">
       update tb_test set name =#{name},number =#{number},update_at=#{update_at} where id=#{id}
   </update>
</mapper>

此时一定要把mapper接口的接口地址贴在mybatis配置文件mybatis-config.xml里面:

<mappers>

   <mapper resource="User.xml"></mapper>
   <mapper resource="UserMapper.xml"></mapper>

</mappers>

测试类:

package test;

import dao.UserMapper;
import entity.User;
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.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

public class UserMapperTest {
   private SqlSessionFactory sqlSessionFactory;

   @Before //创建sqlSessionFactory
   public void setUp() throws Exception {
       String resource = "mybatis-config.xml"; //mybatis配置文件
       //得到配置文件的流
       InputStream inputStream = Resources.getResourceAsStream(resource);
       //创建会话工厂SqlSessionFactory,要传入mybatis的配置文件的流
       sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
   }

   @Test
   public void testFindUserById() throws Exception {

       SqlSession sqlSession = sqlSessionFactory.openSession();
       //创建UserMapper对象,mybatis自动生成mapper代理对象
       UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
       User user = userMapper.findUserById(1);
       System.out.println(user);
   }

   @Test
   public void testFindUserByName() throws Exception {

       SqlSession sqlSession = sqlSessionFactory.openSession();
       //创建UserMapper对象,mybatis自动生成mapper代理对象
       UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
       List<User> list = userMapper.findUserByName("李宗赢");
       sqlSession.close();
       System.out.println(list);
   }

   @Test
   public void testFindUser() throws Exception {

       SqlSession sqlSession = sqlSessionFactory.openSession();
       //创建UserMapper对象,mybatis自动生成mapper代理对象
       UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
       List<User> list = userMapper.findUsers();
       sqlSession.close();
       Iterator users = list.iterator();
       while (users.hasNext()) {
           System.out.println(list);
       }
   }
}

测试正常运行。

不过有一个问题,mapper配置文件要放在resource包下面,放在自己建的包下面在测试的时候,虽然在mybatis-config.xml里面添加的路径是对的,但是还是会找不到。百度很多人说的是idea不会读取src\main\java下面的文件,在pom.xml里面添加下面的代码可以实现:

<build>
   <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.xml</include>
           </includes>
       </resource>
   </resources>
</build>

但是这样做了以后还是同样的找不到文件,还有用中方法是在mybatis-config.xml里面指定mapper接口的包名,mybatis自动扫描包下面所有的mapper接口进行加载,不知道是不是idea版本的问题,两个方法都试了都不行!

任务1.17完成!编写DAO,分别JdbcTemplate和Mybatis连接数据库,注意使用JDBCTemplate的时候分离Interface和Impl,使用Mybatis的时候注意理解为什么不需要Impl,注意遵守命名规范。

还有不足的地方就就是在连接数据库的时候resource的读取和用到的方法和函数,这方面的InputStream和SqlSessionFactory需要继续去学习。


明天计划:

学习JUnit,尝试自己写单元测试

遇到的问题:

写在日报里了

收获:对mybatis连接数据库的两种方式有了深入了解,还补脑了一些其他知识


返回列表 返回列表
评论

    分享到