文章目录
MyBatis:创建web项目
作用:对底层的JDBC进行封装
优点:使用 MyBatis 不用编写Dao实现类,只用写sql命令就好
该项目的目录:
一、环境搭建
1. 导jar包
2. 在src下新建全局配置文件mybatis.xml(编写JDBC)
mybatis对配置文件的文件名没有要求。
2.1 在全局配置文件中引入dtd或schema(通俗来说:就是不导入就没提示)
如果导入网络dtd没提示,执行如下操作:导入本地的dtd、xsd文件:
2.2 mybatis.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>
<!-- default引用environment的id,当前所使用的环境 -->
<environments default="default">
<!-- 声明可以使用的环境 -->
<environment id="default">
<!-- 使用原生JDBC事务 -->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/people"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 这里添加的是执行CRUD操作的接口对应的配置文件(xml文件) -->
<mappers>
<mapper resource="com/bjsxt/mapper/UserMapper.xml"/>
</mappers>
</configuration>
事务对jdbc进行管理:
事务默认是“自动提交”,通过 conn.setAutoCommit(false); 进行手动提交。
src下的代码全会编译到classes文件夹下,之所以所有代码都往src下放,因为在classes文件下,可以快速通过classpath:快速找到xx文件夹。
3. 建数据库表
create table `user`(
`id` varchar(64) NOT NULL COMMENT 'ID',
`name` varchar(255) NOT NULL COMMENT '姓名',
`age` int NOT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
4. 编写实体类
public class UserEntity {
private String id; // ID
private String name; // 姓名
private String age; // 年龄
//set、get、toString方法
......
}
5. 编写 “实体类名+Mapper.xml” 文件
文件作用:编写需要执行的SQL命令
反射机制:要书写类的全路径,才能反射到。
在框架的 mybatis.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">
<!-- namesapce:理解成实现类的全路径(包名+类名) -->
<mapper namespace="a.b" >
<!-- id:方法名; parameterType:定义参数类型; resultType:返回值类型;
如果方法返回值是list,在resultType中写List的泛型,因为mybatis
对jdbc封装,一行一行读取数据
-->
<select id="selAll" resultType="com.xxsxt.pojo.User">
select * from user
</select>
</mapper>
6. 在mybatis.xml中加载“实体类+Mapper.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>
<!-- default引用environment的id,当前所使用的环境 -->
<environments default="default">
<!-- 声明可以使用的环境 -->
<environment id="default">
<!-- 使用原生JDBC事务 -->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/people"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 这里添加的是执行CRUD操作的接口对应的配置文件(xml文件) -->
<mappers>
<mapper resource="com/bjsxt/mapper/UserMapper.xml"/>
</mappers>
</configuration>
7. 测试文件
public class Test {
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("myabtis.xml");
//使用工厂设计模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//生产SqlSession
SqlSession session=factory.openSession();
List<User> list = session.selectList("a.b.selAll");
for (Useruser: list) {
System.out.println(user.toString());
}
session.close();
}
}
二、全局配置文件属性详解
mybatis将数据库表中的列名通过反射找同名属性,就是找实体类中的set( xx ) 方法;这就是mybatis中的重要过程 “自动映射” (autoMapping),通过同名进行自动映射;
mybatis3.2之前找set() 方法;mybatis3.2之后直接找属性。
反射也可以给私有属性赋值。
1. < transactionManager/ > type 属性可取值
JDBC:事务管理使用 JDBC 原生事务管理方式
MANAGED: 把事务管理转交给其他容器(Spring容器)。原生 JDBC 事务 setAutoMapping(false);
2. < dataSouce/ > type 属性
POOLED: 使用数据库连接池
UNPOOLED: 不实用数据库连接池,和直接使用 JDBC 一样
JNDI:java 命名目录接口技术.(使用java语言调用其他语言写的接口)
三、数据库连接池
- 数据库连接池:在内存中开辟一块空间,在该空间中存放多个数据库连接对象。
JDBC Tomcat Pool:直接由 tomcat 产生数据库连接池。
c3p:
dbcp:
druid:
使用数据库连接池的目的:在高频率访问数据库时,使用数据库连接池可以降低服务器的系统压力,提升程序的运行效率。
- 实现JDBC tomcat Pool的步骤:
2.1 在 web 项目中的 META-INF 中存放 context.xml
编写数据库连接池的相关属性。
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- 资源对象Resource --><!-- -->
<!-- JDBC连接数据库的4个属性:driverClassName,url,username,password -->
<!-- 对象状态:maxActive:最大连接数,
maxIdle :最大等待数
-->
<!-- name:该资源的名字,给其他程序给其他程序调用
auth:数据库连接池由应用程序管理还是tomcat管理;默认是tomcat管理
maxWait:超时时间
type:返回类型
-->
<Resource
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ssm"
username="root"
password="root"
maxActive="50"
maxIdle="20"
name="test"
auth="Container"
maxWait="10000"
type="javax.sql.DataSource"
/>
</Context>
2.2 把项目发布到tomcat中,数据库连接池产生了
启动 tomcat 就会生成数据库连接池
- 可以再 java 程序中使用 JNDI 获取数据库连接池中的对象
3.1 Context :上下文接口 context.xml 文件对象类型
@WebServlet("/pool")
public class DemoServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
try {
Context cxt = new InitialContext();
DataSource ds = (DataSource) cxt.lookup("java:comp/env/test"); //通过全路径获取数据库连接池
Connection conn = ds.getConnection(); //从连接池中获取连接对象
PreparedStatement ps = conn.prepareStatement("select * from flower");
ResultSet rs = ps.executeQuery();
res.setContentType("text/html;charset=utf-8");
PrintWriter out = res.getWriter();
while(rs.next()){
out.print(rs.getInt(1)+" "+rs.getString(2)+"<br/>");
}
out.flush();
out.close();
rs.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
}
tomcat 默认走 Servers 中的配置文件。
源码下载:https://download.youkuaiyun.com/my