mybatis增删改查
第一步:创建maven工程
在pom.xml里添加
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
第二步创建mysql表
create table account
(
id int auto_increment
primary key,
name varchar(11) not null,
password varchar(100) not null,
age int null
);
第三步:根据MySQL创建pojo类 可以使用lombok插件
import lombok.Data;
@Data
lombok插件可以省去大量的getter, setter
第四步:在resources底下建立一个file名为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="mysql">
<environment id="mysql">
<!--指定事务管理的类型,这里简单使用Java的JDBC的提交和回滚设置-->
<transactionManager type="JDBC"></transactionManager>
<!--dataSource 指连接源配置,POOLED是JDBC连接对象的数据源连接池的实现-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="617123807"></property>
</dataSource>
</environment>
</environments>
</configuration>
这里要注意dtd
第五步:mybatis需要开发者自定义SQL,写在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">
<!--namespace:AccountMapper.xml的路径 包.xml-->
<mapper namespace="mapper.AccountMapper">
<!--这里面些对数据库的操作-->
<insert id="save" parameterType="bean.Account">
-- insert into account(username,password,age) values('gy','234',21)
insert into account(username,password,age) values(#{username},#{password},#{age})
</insert>
<update id=""></update>
<delete id=""></delete>
<select id=""></select>
</mapper>
第六步:在config.xml里加上 mappers标签
<!--注册accountMapper.xml-->
<mappers>
<mapper resource="mapper/AccountMapper.xml"></mapper>
</mappers>
注意这里的mapper.xml的路径 路径里不能用.而用/
方法一:调用mybatis的原生接口来执行添加操作
public class Test {
public static void main(String[] args) {
//加载mybatis配置文件
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
//创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//创建SqlSessionFactory
SqlSessionFactory build = factoryBuilder.build(inputStream);
//SqlSession
SqlSession sqlSession = build.openSession();
//AccountMapple.xml里的namespace.id
String statement = "mapper.AccountMapper.save";
Account account = new Account(1,"gy","123",20);
sqlSession.insert(statement,account);
sqlSession.commit();
}
}
注意这里加载的是config.xml
而且千万注意 AccountMapper.xml里的插入属性不能写错了
还有:
//AccountMapple.xml里的namespace.id
String statement = "mapper.AccountMapper.save";
Account account = new Account(1,"gy","123",20);
sqlSession.insert(statement,account);
sqlSession.commit();
这部分的跟AccountMapper.xml里的id有关系
方法二:mapper代理实现自定义接口
自定义接口,写接口就好了 不需要写实现类
public interface AccountRepository {
public int save(Account account);
public int update(Account account);
public int delete(int id);
public List<Account> findAll();
public Account findById(int id);
}
编写与方法相对应的mapper.xml即可 创建接口对应的Mapper.xml 定义接口对应的SQL语句
statement标签会根据sql执行的业务选择insert,update,delete,select mybatis会根据规则自动创建接口实现类的代理对象
规则:
Mapper.xml中namespace为接口的全类名
Mapper.xml中statement的id为接口对应方法的方法名
mapper.xml中statement的parameterType和接口中对应方法的参数类型一致
mapper.xml中 statement的result Type和接口中对应方法的返回值类型一致
只有select才有resultType
repository.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="repository.AccountRepository">
<insert id="save" parameterType="bean.Account">
insert into account(name,password,age) value (#{name},#{password},#{age})
</insert>
<update id="update" parameterType="bean.Account">
update account set name=#{name},password=#{password},age=#{age} where id=#{id}
</update>
<delete id="delete" parameterType="int">
delete from account where id = #{id}
</delete>
<!--注意这里不是写List 而是写List后面的泛型-->
<select id="findAll" resultType="bean.Account">
select * from account
</select>
<select id="findById" parameterType="int" resultType="bean.Account">
select * from account where id = #{id}
</select>
</mapper>
注意这里的dtd
别忘了要在config.xml里注册该xml
追加mapper标签就好 不需要重新写mappers标签
test测试
public class Test2 {
public static void main(String[] args) {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactory build = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = build.openSession();
//实现接口的代理对象
//AccountRepository是接口
AccountRepository repository = sqlSession.getMapper(AccountRepository.class);
List<Account> list = repository.findAll();
for (Account account:
list ) {
System.out.println(account);
}
sqlSession.close();
}
}
注意对增删改查之后一定要commit提交,否则数据库里没变化