叩丁狼java学习第五天-preparedStatement、javabean、注解、mybatis

发布于 2021-03-10  1303 次阅读


1.Statement 和 PreparedStatement 的区别:

PreparedStatement 存在的优势:

  1. 更好的可读性,可维护性.
  2. 可以提供更好的性能(预编译). MySQL 不支持 PreparedStatement 性能优化.
  3. 更安全,可以防止 SQL 注入的问题
    如果使用Statement语句对象,我们是把参数直接拼接到 SQL 中然后执行,此时,如果参数会改变SQL
    的语法结构,执行的结果就会存在问题了,如,在登录查询的 SQL 中,如果用户名参数值为: ' or 1=1 or
    ', 此时,填写的密码无论是多少,登录都会成功, 这就是 SQL 注入的问题.
    叩丁狼教育这个问题可以使用预编译语句对象完美解决
  4. 预先发送带有占位符的 SQL 到数据库中进行编译, 语句结构固定下来
  5. 设置参数给对应的占位符,然后再执行 SQL
    这里无论是什么参数,都不会再改变 SQL 的语法结构,达到防止 SQL 注入问题的目的

2.javabean

无参构造器

提供一对getter和setter

私有化成员变量

类public修饰

3.注解

lombok插件安装:file -> setting -> plugins -> 搜索lombok安装

使用:在javabean中使用 常用注解:@Getter @Setter @data @AllArgsConstructor @NoArgsConstructor @ToString

4.mybatis环境搭建

mybatis官方文档:

https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#select

  1. 环境准备
    添加需要的jar包:mybatis、lombok、数据库驱动。
  2. 建表
  3. 新建实体类
  4. mybatis-config配置
  5. xxxMapper文件书写
  6. dao层
    接口IUserDao
    实体类UserDaoImpl
    dao接口
  7. 在 cn.wolfcode.mybatis.dao 包中创建 dao 接口: IUserDAO.java
  8. dao 接口实现类
  9. 在 cn.wolfcode.mybatis.dao.impl 包中创建 dao 的实现类: UserDAOImpl.java
    按以下 API 实现数据的保存操作:
    SqlSessionFactory : 对连接池(DataSource)的封装
    SqlSession openSession() : 获取SqlSession对象
    SqlSession,对连接(Connection)的封装
    int insert(String statementid, Object param);
    statementid: 有mapper配置文件中的namespace+sqlid组成
    void commit(): 提交事务
    void close() : 释放资源
  10. 测试
//2建表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(255) DEFAULT NULL,
`salary` decimal(10,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
//3新建实体类
@Getter@Setter@ToString
@NoArgsConstructor@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private BigDecimal salary;
private Date hiredate;
}
//4mybatis-config配置
//1. 在项目的resources(source folder)下创建mybatis-config.xml配置文件
//2. 拷贝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">
<?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">
//3. 添加环境配置(事务管理器 / 连接池 / 映射文件)

<?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="dev">
<environment id="dev">
<!--
MyBatis 内置的事务管理器
JDBC:org.apache.ibatis.transaction.jdbc.JdbcTransaction的别名
-->
<transactionManager type="JDBC"/>
<!--
MyBatis 内置的连接池
POOLED:org.apache.ibatis.datasource.pooled.PooledDataSource的别
名
-->
<dataSource type="POOLED">
<!--
driver:这是POOLED连接池对象的驱动类的属性名,
Druid连接池对象的驱动类属性名是driverClassName
-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<?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="dev">
<environment id="dev">
<!--
MyBatis 内置的事务管理器
JDBC:org.apache.ibatis.transaction.jdbc.JdbcTransaction的别名
-->
<transactionManager type="JDBC"/>
<!--
MyBatis 内置的连接池
POOLED:org.apache.ibatis.datasource.pooled.PooledDataSource的别
名
-->
<dataSource type="POOLED">
<!--
driver:这是POOLED连接池对象的驱动类的属性名,
Druid连接池对象的驱动类属性名是driverClassName
-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/wolfcode/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
//5xxxMapper文件书写
//mapper 映射文件: UserMapper.xml
//mybatis中,访问数据库的SQL语句是编写在mapper配置文件中的,程序员按照这个文件约定
的格式进行配置即可
在包 cn.wolfcode.mybatis.mapper 中创建配置文件: 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">

<!--
一个项目可以操作多张表
每张表都需要一个mapper配置文件来编写SQL语句
每条SQL语句都需要有一个唯一的标识
这个唯一的标识由 namespace + sqlid 组成
使用下面的namespace+sqlid就得到了保存用户信息的唯一标识:
cn.wolfcode.mybatis.mapper.UserMapper.insert
接下来,我们就可以使用上面的标识找到这条SQL语句了
-->
<mapper namespace="cn.wolfcode.mybatis.mapper.UserMapper">
<insert id="insert">
insert into user(name,age,salary,hiredate)
values(#{name}, #{age}, #{salary}, #{hiredate})
</insert>
</mapper>

<mappers>
<!--
这里是mapper文件的路径,所以使用/分割
-->
<mapper resource="cn/wolfcode/mybatis/mapper/UserMapper.xml"/>
</mappers>

注意: 一定记得在 mybatis-config.xml 配置文件中关联映射文件

6.dao

//6dao层
  接口IUserDao
  实体类UserDaoImpl
//调用 SqlSession 中的 insert 方法,执行指定的 SQL
public class UserDAOImpl implements IUserDAO {
public void insert(User u) {
try {
InputStream in = Resources.getResourceAsStream("mybatisconfig.xml");
SqlSessionFactory fac = new
SqlSessionFactoryBuilder().build(in);
SqlSession session = fac.openSession();
session.insert("cn.wolfcode.mybatis.mapper.UserMapper.insert",
u);
session.commit();
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//在测试类中测试 insert 方法
public class UserDAOTest {
private IUserDAO dao = new UserDAOImpl();
@Test
public void testInsert() {
User u = new User(null,"张三",20,new BigDecimal(20000), new Date());
dao.insert(u);
}
}

欢迎欢迎~热烈欢迎~