“基础:Dao开发”的版本间差异
跳到导航
跳到搜索
无编辑摘要 |
|||
第5行: | 第5行: | ||
使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。<br/> | 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。<br/> | ||
== | == 原始Dao开发 == | ||
原始Dao开发方法需要程序员编写Dao接口和Dao实现类。 | 原始Dao开发方法需要程序员编写Dao接口和Dao实现类。 | ||
[[File:原始Dao开发.png|400px]] | |||
=== User.java === | |||
<syntaxhighlight lang="java"> | |||
public class User { | |||
//属性名和数据库表的字段对应 | |||
private int id; | |||
private String username;// 用户姓名 | |||
private String sex;// 性别 | |||
private Date birthday;// 生日 | |||
private String address;// 地址 | |||
public int getId() { | |||
return id; | |||
} | |||
public void setId(int id) { | |||
this.id = id; | |||
} | |||
public String getUsername() { | |||
return username; | |||
} | |||
public void setUsername(String username) { | |||
this.username = username; | |||
} | |||
public String getSex() { | |||
return sex; | |||
} | |||
public void setSex(String sex) { | |||
this.sex = sex; | |||
} | |||
public Date getBirthday() { | |||
return birthday; | |||
} | |||
public void setBirthday(Date birthday) { | |||
this.birthday = birthday; | |||
} | |||
public String getAddress() { | |||
return address; | |||
} | |||
public void setAddress(String address) { | |||
this.address = address; | |||
} | |||
@Override | |||
public String toString() { | |||
return "User [id=" + id + ", username=" + username + ", sex=" + sex | |||
+ ", birthday=" + birthday + ", address=" + address + "]"; | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== User.xml === | |||
<syntaxhighlight lang="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="test"> | |||
<!-- 在 映射文件中配置很多sql语句 --> | |||
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> | |||
SELECT * FROM USER WHERE id=#{value} | |||
</select> | |||
<!-- 根据用户名称模糊查询用户信息,可能返回多条 --> | |||
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> | |||
SELECT * FROM USER WHERE username LIKE '%${value}%' | |||
</select> | |||
<!-- 添加用户 --> | |||
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> | |||
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> | |||
SELECT LAST_INSERT_ID() | |||
</selectKey> | |||
insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) | |||
</insert> | |||
<!-- 删除 用户 --> | |||
<delete id="deleteUser" parameterType="java.lang.Integer"> | |||
delete from user where id=#{id} | |||
</delete> | |||
<!-- 根据id更新用户 --> | |||
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> | |||
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} | |||
where id=#{id} | |||
</update> | |||
</mapper> | |||
</syntaxhighlight> | |||
* 需要在SqlMapConfig.xml中添加映射文件。 | |||
=== UserDao.java === | |||
<syntaxhighlight lang="java"> | |||
public interface UserDao { | |||
//根据id查询用户信息 | |||
public User findUserById(int id) throws Exception; | |||
//根据用户名列查询用户列表 | |||
public List<User> findUserByName(String name) throws Exception; | |||
//添加用户信息 | |||
public void insertUser(User user) throws Exception; | |||
//删除用户信息 | |||
public void deleteUser(int id) throws Exception; | |||
} | |||
</syntaxhighlight> | |||
=== UserDaoImpl.java === | |||
<syntaxhighlight lang="java"> | |||
public class UserDaoImpl implements UserDao { | |||
// 需要向dao实现类中注入SqlSessionFactory | |||
// 这里通过构造方法注入 | |||
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; | |||
} | |||
@Override | |||
public void insertUser(User user) throws Exception { | |||
SqlSession sqlSession = sqlSessionFactory.openSession(); | |||
//执行插入操作 | |||
sqlSession.insert("test.insertUser", user); | |||
// 提交事务 | |||
sqlSession.commit(); | |||
// 释放资源 | |||
sqlSession.close(); | |||
} | |||
@Override | |||
public void deleteUser(int id) throws Exception { | |||
SqlSession sqlSession = sqlSessionFactory.openSession(); | |||
//执行插入操作 | |||
sqlSession.delete("test.deleteUser", id); | |||
// 提交事务 | |||
sqlSession.commit(); | |||
// 释放资源 | |||
sqlSession.close(); | |||
} | |||
} | |||
</syntaxhighlight> | |||
# 实现UserDao接口方法; | |||
# 注入sqlSessionFactory(构造方法或其他方法注入)到私有属性sqlSessionFactory; | |||
# 方法体中,通过sqlSession(线程不安全,方法体内)实现数据交互; | |||
#* (“SqlSession sqlSession = sqlSessionFactory.openSession();”会读取相应配置及映射文件内容;) | |||
# 资源的关闭与释放(最好添加try-catch块???); | |||
=== 测试 UserDaoImplTest.java === | |||
<syntaxhighlight lang="java" line highlight="3,7,23,26"> | |||
public class UserDaoImplTest { | |||
private SqlSessionFactory sqlSessionFactory; | |||
// 此方法是在执行testFindUserById之前执行 | |||
@Before | |||
public void setUp() throws Exception { | |||
// 创建sqlSessionFactory | |||
// mybatis配置文件 | |||
String resource = "SqlMapConfig.xml"; | |||
// 得到配置文件流 | |||
InputStream inputStream = Resources.getResourceAsStream(resource); | |||
// 创建会话工厂,传入mybatis的配置文件信息 | |||
sqlSessionFactory = new SqlSessionFactoryBuilder() | |||
.build(inputStream); | |||
} | |||
@Test | |||
public void testFindUserById() throws Exception { | |||
// 创建UserDao的对象 | |||
UserDao userDao = new UserDaoImpl(sqlSessionFactory); | |||
// 调用UserDao的方法 | |||
User user = userDao.findUserById(1); | |||
System.out.println(user); | |||
} | |||
} | |||
</syntaxhighlight> | |||
# 业务代码中应该先获取配置文件流,并由sqlSessionFactoryBuilder(一次性,方法局部变量)生成sqlSessionFactory对象(共用,应用运行期内); | |||
# 用sqlSessionFactory做为参数,创建接口实现类的对象; | |||
#: UserDao userDao = new UserDaoImpl(sqlSessionFactory); 多态,向上转型 | |||
== Mapper动态代理方式 == | == Mapper动态代理方式 == |
2020年10月10日 (六) 01:27的版本
关于
使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。
原始Dao开发
User.java
public class User {
//属性名和数据库表的字段对应
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
}
User.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="test">
<!-- 在 映射文件中配置很多sql语句 -->
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE id=#{value}
</select>
<!-- 根据用户名称模糊查询用户信息,可能返回多条 -->
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 删除 用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<!-- 根据id更新用户 -->
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
</mapper>
- 需要在SqlMapConfig.xml中添加映射文件。
UserDao.java
public interface UserDao {
//根据id查询用户信息
public User findUserById(int id) throws Exception;
//根据用户名列查询用户列表
public List<User> findUserByName(String name) throws Exception;
//添加用户信息
public void insertUser(User user) throws Exception;
//删除用户信息
public void deleteUser(int id) throws Exception;
}
UserDaoImpl.java
public class UserDaoImpl implements UserDao {
// 需要向dao实现类中注入SqlSessionFactory
// 这里通过构造方法注入
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;
}
@Override
public void insertUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行插入操作
sqlSession.insert("test.insertUser", user);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
@Override
public void deleteUser(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行插入操作
sqlSession.delete("test.deleteUser", id);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
}
- 实现UserDao接口方法;
- 注入sqlSessionFactory(构造方法或其他方法注入)到私有属性sqlSessionFactory;
- 方法体中,通过sqlSession(线程不安全,方法体内)实现数据交互;
- (“SqlSession sqlSession = sqlSessionFactory.openSession();”会读取相应配置及映射文件内容;)
- 资源的关闭与释放(最好添加try-catch块???);
测试 UserDaoImplTest.java
public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory;
// 此方法是在执行testFindUserById之前执行
@Before
public void setUp() throws Exception {
// 创建sqlSessionFactory
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
// 创建UserDao的对象
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
// 调用UserDao的方法
User user = userDao.findUserById(1);
System.out.println(user);
}
}
- 业务代码中应该先获取配置文件流,并由sqlSessionFactoryBuilder(一次性,方法局部变量)生成sqlSessionFactory对象(共用,应用运行期内);
- 用sqlSessionFactory做为参数,创建接口实现类的对象;
- UserDao userDao = new UserDaoImpl(sqlSessionFactory); 多态,向上转型