MyBatis应用
目录
实验目的
掌握MyBatis的实质;掌握MyBatis的两大类型配置文件;掌握MyBatis进行CRUD操作的实现方式。
实验内容
(1) 配置Mybatis的核心配置文件以及映射文件;
(2) 应用Mybatis实现一张表的增、删、改、查。
(3) 测试增、删、改、查
实验步骤
导入mybatis的依赖和数据库的驱动依赖
<!--mybatis-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- <scope>test</scope>-->
</dependency>
</dependencies>
编写mybatis的核心配置文件(mybatis-config.xml)
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/bank"/>
<property name="username" value="root"/>
<property name="password" value="mysql"/>
</dataSource>
</environment>
</environments>
</configuration>
建立实体类User,属性要和数据库表名对应
public class User {
private int id;
private String account;
private double balance;
private String password;
public User() {
}
public User(String account, double balance, String password) {
this.account = account;
this.balance = balance;
this.password = password;
}
public User(int id, String account, double balance, String password) {
this.id = id;
this.account = account;
this.balance = balance;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", account='" + account + '\'' +
", balance=" + balance +
", password='" + password + '\'' +
'}';
}
}
建立UserMapper接口
public interface UserMapper {
public User selectUserById(int id);
/*添加用户*/
public int insertUser(User user);
/*修改用户*/
public int updateUser(User user);
/*删除用户*/
public int deleteUserById(int id);
建立UserMapper接口的实现 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">
<!--namespace绑定一个Mapper接口-->
<mapper namespace="com.txq.bmms.dao.UserMapper">
<select id="selectUserById" resultType="com.txq.bmms.pojo.User" parameterType="int">
select * from user where id = #{id}
</select>
<!--形参user对象的属性可以直接用-->
<insert id="insertUser" parameterType="com.txq.bmms.pojo.User">
insert into user values(null,#{account},#{balance},#{password})
</insert>
<update id="updateUser" parameterType="com.txq.bmms.pojo.User">
update user set account =#{account}, balance = #{balance}, password = #{password} where id = #{id} ;
</update>
<delete id="deleteUserById" parameterType="int">
delete from user where id = #{id}
</delete>
</mapper>
编写MyBatis的工具类
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static{
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
SqlSessionFactoryBuilder:
一旦创建了 SqlSessionFactory,就不再需要它了
局部变量
SqlSessionFactory:
。说自了就是可以想象为: 数据库连接池
·SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
。因此SqlSessionFactory 的最佳作用域是应用作用域
。最简单的就是使用单例模式或者静态单例模式
SqlSession
连接到连接池的一个请求!
SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用
用完之后需要赶紧关闭,否则资源被占用!
测试CRUD
@Test //测试查找selectUserById
public void test(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.selectUserById(3);
// User user = userMapper.selectUserById(4); //此时表中无此条记录
System.out.println(user);
sqlSession.close();
}
@Test //测试增加,注意增删改需要提交事务
public void test1(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int res = userMapper.insertUser(new User("xixi",1000,"xx"));
System.out.println(res);
sqlSession.commit();
sqlSession.close();
}
@Test //测试修改,注意增删改需要提交事务
public void test2(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int res = userMapper.updateUser(new User(3,"xixi",1000,"xx"));
System.out.println(res);
sqlSession.commit();
sqlSession.close();
@Test //测试删除,注意增删改需要提交事务
public void test3(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int res = userMapper.deleteUserById(12);
System.out.println(res);
sqlSession.commit();
sqlSession.close();
用注解方法实现:
public interface UserDAO {
@Select("select * from user")
List<User> getUserList();
@Select("select * from user where id =#{id}")
public User selectUserById(int id);
/*添加用户*/
@Insert("insert into user values(null,#{account},#{balance},#{password})")
public int insertUser(User user);
/*修改用户*/
@Update("update user set account=#{account},balance=#{balance},password=#{password} where id =#{id}")
public int updateUser(User user);
/*删除用户*/
@Delete("delete from user where id =#{id}")
public int deleteUserById(int id);
/*修改余额*/
@Update("update user set balance=balance-#{balance} where id=#{id}")
public int updateBalance(@Param("balance") double balance, @Param("id") int id);
}
/*根据account查询用户*/
@Select("select * from user where account =#{account}")
List< User> selectUserByAccount(@Param("account")String account);
测试:
public void selectUserByAccount() {
SqlSession session =MyBatisUtil.getSqlSession();
UserDAO userDAO =session.getMapper(UserDAO.class);
System.out.println(userDAO.selectUserByAccount("txq"));
配置映射文件:
实验总结
遇到的问题:
解决方法:
因为maven默认只拷贝resources下的xml及小配置文件。现在我们的配置文件放在了java源文件的包中,因此出错。需要在pom文件中设置resources以及resource,让maven去拷贝我们需要的文件到classpath路径下。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
问题2:
解决方法:
总结
本次实验学习了Mybatis框架的基本使用,包括配置核心配置文件和映射文件,并且应用Mybatis实现了一张表的增、删、改、查操作。
在配置核心配置文件时,需要指定数据库连接信息、事务管理器、mapper映射器等信息。同时还可以设置一些全局属性,如驼峰命名规则、缓存配置等。
在配置映射文件时,需要定义SQL语句以及参数映射规则。通过使用#{}占位符来指定参数,Mybatis会根据参数类型自动进行类型转换。
对于增、删、改操作,需要在映射文件中定义相应的SQL语句,并且在Java代码中调用Mapper接口中相应的方法来执行。在执行完SQL语句后,Mybatis会自动将返回结果映射到Java对象中。
对于查询操作,同样需要在映射文件中定义SQL语句,并且在Java代码中调用Mapper接口中相应的方法来执行。查询操作可以返回单个对象、集合对象或者分页对象等。在执行查询操作时,Mybatis会根据映射文件中定义的结果集映射规则,自动将查询结果映射到Java对象中。
总体来说,Mybatis框架简化了数据访问层的开发,提高了开发效率,同时也降低了代码耦合度。在实际项目中,可以根据需要选择不同的ORM框架来进行数据访问层的开发。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!