发表于: 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连接数据库的两种方式有了深入了解,还补脑了一些其他知识
评论