入门第二天
目的:使用Mybatis对数据库中的数据进行简单的操作。例如:增、删、改、查、
前言:同样是使用idea创建一个普通的maven工程(如何创建一个普通的Maven工程可以参考入门第一天的详解)。
第一天:https://www.cnblogs.com/LBJLAKERS/p/11324234.html
数据库中的表仍然使用第一天的数据库表(新建表和添加数据的sql语句见第一天的分析)。
代码来了。。。。。。。。。。。。。。
首先看一下所有的文件的路径和结构
- 在pom.xml文件中导入坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>zh.test.mybatis</groupId>
<artifactId>zh_mybatis02</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- mybatis坐标 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<!--日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies> </project> - 添加一个NBAPlaers的Java文件,对应数据库中的字段
package zh.test.domain; import java.io.Serializable;
import java.util.Date; /*
编写一个User的实体类,并且实现Serializable接口,目的只是表示一个类的对象可以被序列化。
什么是Serializable接口?
一个对象序列化的接口,一个类只有实现了Serializable接口,他的对象才能被序列化
*/
public class NBAPlaers implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address; @Override
public String toString() {
return "NBAPlaers{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
} 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 Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
}
} 新建一个UserMapper的接口,里面主要是要对数据库进行的哪些操作。如下:进行了多种操作
package zh.test.mapper; import zh.test.domain.NBAPlaers; import java.util.List; /*
用户映射接口
*/
public interface UserMapper {
//查询所有的数据
public List<NBAPlaers> findAll();
//根据条件查询
public NBAPlaers findById(int id);
//插入数据
public int insert(NBAPlaers nbaPlaers);
//修改数据
public int update(NBAPlaers nbaPlaers);
//删除一条数据
public int delete(int id);
//模糊查询
public List<NBAPlaers> findBylike(NBAPlaers name);
//聚合函数查询
public int findcount();
}- 写一个jdbc.properties的属性文件,用来编写连接数据库的配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/javaDemo?characterEncoding=utf8
username=root
password=root - 配置SqlMapConfig.xml。读取数据库的属性配置文件,配置环境。以及加载
Usermapper.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>
<!--加载jdbc的属性配置文件-->
<properties resource="jdbc.properties"/>
<!--配置实体类的别名-->
<typeAliases>
<!--
type:实体类的全路径
alias:取的一个别名,不区分大小写,在配置文件调用这个实体类的时候就可以使用别名。
-->
<typeAlias type="zh.test.domain.NBAPlaers" alias="nbaers"/>
<!--如果有多个实体类可以写为:包名。别名则就是【类名】-->
<!--<package name="zh.test.domain"/>-->
</typeAliases>
<!--配置多个环境-->
<environments default="mysql">
<!--配置环境-->
<environment id="mysql">
<!--配置事物管理,使用本地的事物策略-->
<transactionManager type="JDBC"></transactionManager>
<!--是否要是要连接池 POOLED UNPOOLED-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<!--<property name="url" value="jdbc:mysql:///javaDemo"/>-->
</dataSource>
</environment>
</environments>
<!--引入映射的配置文件-->
<mappers>
<mapper resource="mappers/Usermapper.xml"></mapper>
</mappers>
</configuration> - 编写相对应的Usermapper.xml文件,用来编写有关对数据操作的配置
<?xml version="1.0" encoding="UTF-8"?>
<!--约束 dtd约束-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace:用来区分mapper接口的,一般写mapper的全路径
--> <mapper namespace="zh.test.mapper.UserMapper">
<!--
id属性:表示接口中方法的名称
resultType:方法返回值类型,全限定路径(包名+类名)
-->
<select id="findAll" resultType="zh.test.domain.NBAPlaers">
/*
编写对应的sql语句
*/
select * from NBAPlaers;
</select>
<!--根据条件查询-->
<!--
id:findById 方法的名称
parameterType:方法参数的类型
resultType:方法返回值的类型 ? 不能使用?作为占位符,使用#{} 或${}来编写,推荐使用#{}
区别:1、#{}.
2、${}
以上两种,当方法的参数为【引用类型】的时候,两种都可以使用,没有区别
当方法的参数为【普通数据类型(int double )】推荐使用#{此处的方法的名字可以随意命名},但是${此处的方法的名字的参数必须与写value}
-->
<select id="findById" parameterType="java.lang.Integer" resultType="zh.test.domain.NBAPlaers">
select * from NBAPlaers where id=#{id}
</select>
<!--新增-->
<!--
#{OGNL表达式}:对象导航语言,表达式语言。语法和el表达式相似
el表达式只能在jsp页面上使用。OGNL表达式既可以在页面上又可以在配置文件中使用。
-->
<insert id="insert" parameterType="zh.test.domain.NBAPlaers">
-- keyProperty="封装数据使用的属性"
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select last_insert_id();
</selectKey>
insert into NBAPlaers (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
</insert>
<!--修改数据-->
<update id="update" parameterType="zh.test.domain.NBAPlaers">
update NBAPlaers set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id};
</update>
<!--删除一条数据-->
<delete id="delete" parameterType="java.lang.Integer">
delete from NBAPlaers where id=#{id};
</delete>
<!--模糊查询-->
<select id="findBylike" parameterType="java.lang.String" resultType="zh.test.domain.NBAPlaers">
select * from NBAPlaers where username like #{username}
</select>
<!--聚合函数查询-->
<select id="findcount" resultType="java.lang.Integer">
select COUNT(*) from NBAPlaers;
</select>
<!--
resultMap:用来进行数据的封装
id="唯一的名称,用来被引用"
type="进行数据封装的数据的类型"
-->
<resultMap id="nbaMapper" type="zh.test.domain.NBAPlaers">
<!--
property="JavaBean中的属性"
column="表中的字段"
-->
<result property="id" column="id"></result>
<result property="username" column="_username"></result>
<result property="sex" column="_sex"></result>
<result property="address" column="_address"></result>
</resultMap>
</mapper> - 最后。。。。对相应的功能进行测试
package test; 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.Test;
import zh.test.domain.NBAPlaers;
import zh.test.mapper.UserMapper; import java.io.IOException;
import java.io.InputStream;
import java.net.SocketTimeoutException;
import java.util.Date;
import java.util.List; public class Demo { @Test
public void findUserAll() throws IOException {
//加载主配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
//获取到代理对象,mybatis框架生成代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//mapper指向就是代理对象
List<NBAPlaers> allPlayers = mapper.findAll();
for(NBAPlaers user:allPlayers)
{
System.out.println(user);
}
sqlSession.close();
resourceAsStream.close();
} @Test
public void findById() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
NBAPlaers nbaPlaer = mapper.findById(2);
System.out.println(nbaPlaer);
sqlSession.close();
resourceAsStream.close();
// 这里代码看不懂可以查看mybatis01的代码
} // 插入数据
@Test
public void insert() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
NBAPlaers nba=new NBAPlaers();
nba.setAddress("洛杉矶");
nba.setBirthday(new Date());
nba.setSex("男");
nba.setUsername("裤子马");
int insert = mapper.insert(nba);
System.out.println(insert);
//到这运行控制台会输入执行一行数据成功,但是但是但是这条数据并没有插入到数据库中。没有commit commit commit!!!!
//Setting autocommit to false on JDBC Connection
//要手动提交事物
sqlSession.commit(); //其中sqlSession.rollback();为回滚
//获取刚才插入数据的ID值,注意:需要在UserMapper.xml中配置文件
Integer id = nba.getId();
System.out.println("id:"+id);
sqlSession.close();
resourceAsStream.close(); }
// 修改数据
@Test
public void update() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
NBAPlaers nba=new NBAPlaers();
nba.setUsername("隆多");
nba.setSex("男");
nba.setBirthday(new Date());
nba.setAddress("洛杉矶");
nba.setId(7);
int update = mapper.update(nba);
//提交事物
sqlSession.commit();
System.out.println(update);
sqlSession.close();
resourceAsStream.close();
}
// 删除数据
@Test
public void delte() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
NBAPlaers nba=new NBAPlaers();
int update = mapper.delete(7);
//提交事物
sqlSession.commit();
System.out.println(update);
sqlSession.close();
resourceAsStream.close();
}
//模糊查询
@Test
public void findBilike() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
NBAPlaers nba=new NBAPlaers();
nba.setUsername("%L%");
List<NBAPlaers> bylike = mapper.findBylike(nba);
for(NBAPlaers nba1:bylike)
{
System.out.println(nba1);
}
sqlSession.close();
resourceAsStream.close();
}
//聚合函数的查询数据量
@Test
public void findcount() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int count = mapper.findcount();
System.out.println(count);
sqlSession.close();
resourceAsStream.close();
}
}
分享之路,欢迎交流